Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_verifier.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
20
22
28template <typename Builder> struct UltraRecursiveVerifierOutput {
30 using FF = typename Curve::ScalarField;
31 using G1 = typename Curve::Group;
32
37 std::array<G1, Builder::NUM_WIRES> ecc_op_tables; // Ecc op tables' commitments (HidingKernel/Chonk only)
38 FF mega_hash; // Hash of public inputs and VK (GoblinAvmRecursiveVerifier only)
39
41
42 template <class IO> UltraRecursiveVerifierOutput(IO& inputs)
43 {
44 if constexpr (std::is_same_v<IO, RollupIO>) {
45 ipa_claim = inputs.ipa_claim;
46 } else if constexpr (std::is_same_v<IO, HidingKernelIO<Builder>>) {
47 kernel_return_data = inputs.kernel_return_data;
48 ecc_op_tables = inputs.ecc_op_tables;
49 } else if constexpr (std::is_same_v<IO, GoblinAvmIO<Builder>>) {
50 mega_hash = inputs.mega_hash;
51 } else if constexpr (!std::is_same_v<IO, DefaultIO<Builder>>) {
52 throw_or_abort("Invalid public input type.");
53 }
54 }
55};
56
57} // namespace bb::stdlib::recursion::honk
58
59namespace bb {
60
61// Native verifier output
62template <typename Flavor> struct UltraVerifierOutput {
63 public:
65 bool result = false;
67 std::array<Commitment, Flavor::NUM_WIRES> ecc_op_tables;
68
70
71 template <class IO> UltraVerifierOutput(IO& inputs)
72 {
74 kernel_return_data = inputs.kernel_return_data;
75 ecc_op_tables = inputs.ecc_op_tables;
77 throw_or_abort("Invalid public input type.");
78 }
79 }
80};
81
82template <typename Flavor, class IO> class UltraVerifier_ {
83 public:
84 using FF = typename Flavor::FF;
86 using Curve = typename Flavor::Curve;
90
91 static constexpr bool IsRecursive = IsRecursiveFlavor<Flavor>;
92
93 // Conditional types based on recursion
97
98 using PublicInputs = std::vector<FF>;
99 using Proof = typename Transcript::Proof;
100
101 // Conditional output type: UltraVerifierOutput for native, UltraRecursiveVerifierOutput for recursive
105
106 // IPA claim type: native uses curve::Grumpkin, recursive uses stdlib::grumpkin<Builder>
109
115 PairingPoints pairing_points; // KZG pairing points for deferred verification
116 bool reduction_succeeded = false; // Sumcheck and libra evaluation consistency checks
117 };
118
123 struct PaddingData {
124 size_t log_n;
125 std::vector<FF> padding_indicator_array;
126 };
127
134 using VKAndHash = typename Flavor::VKAndHash;
135 explicit UltraVerifier_(const std::shared_ptr<VKAndHash>& vk_and_hash,
136 const std::shared_ptr<Transcript>& transcript = std::make_shared<Transcript>())
138 , verifier_instance(std::make_shared<Instance>(vk_and_hash))
140 {
141 if constexpr (!IsRecursive) {
142 // Native only: create IPA transcript
144 } else {
145 // Recursive only: extract builder from VKAndHash for later use
146 // Safe since VKAndHash contains field_t elements (hash) with builder context
147 builder = vk_and_hash->hash.get_context();
148 }
149 }
150
160 PaddingData process_padding() const;
161
162 [[nodiscard("Reduction result should be verified")]] ReductionResult reduce_to_pairing_check(const Proof& proof);
163
169 std::pair<Proof, Proof> split_rollup_proof(const Proof& combined_proof) const
171
178 bool verify_ipa(const Proof& ipa_proof, const IPAClaim& ipa_claim)
180
193 Output verify_proof(const Proof& proof);
194
198 const std::shared_ptr<Transcript>& get_transcript() const { return transcript; }
199
204
208 const PublicInputs& get_public_inputs() const { return verifier_instance->public_inputs; }
209
213 const typename Flavor::WitnessCommitments& get_witness_commitments() const
214 {
215 return verifier_instance->witness_commitments;
216 }
217
222 requires IsMegaFlavor<Flavor>
223 {
224 return verifier_instance->witness_commitments.calldata;
225 }
226
230 auto get_ecc_op_wires() const
231 requires IsMegaFlavor<Flavor>
232 {
233 return verifier_instance->witness_commitments.get_ecc_op_wires().get_copy();
234 }
235
236 private:
237 std::shared_ptr<VKAndHash> vk_and_hash;
239 std::shared_ptr<Transcript> transcript;
240 std::shared_ptr<Transcript> ipa_transcript; // Native only
241
242 // Builder pointer (extracted from proof for recursive, nullptr for native)
244};
245
246// Native verifier type aliases
252#ifdef STARKNET_GARAGA_FLAVORS
253using UltraStarknetVerifier = UltraVerifier_<UltraStarknetFlavor, DefaultIO>;
254using UltraStarknetZKVerifier = UltraVerifier_<UltraStarknetZKFlavor, DefaultIO>;
255#endif
260
261} // namespace bb
std::vector< DataType > Proof
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
typename Curve::ScalarField FF
typename G1::affine_element Commitment
curve::Grumpkin Curve
BaseTranscript< Codec, HashFunction > Transcript
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:53
An object storing two EC points that represent the inputs to a pairing check.
std::shared_ptr< VKAndHash > vk_and_hash
ReductionResult reduce_to_pairing_check(const Proof &proof)
Reduce ultra proof to verification claims (works for both native and recursive)
typename Transcript::Proof Proof
const Commitment & get_calldata_commitment() const
Get calldata commitment (MegaFlavor only)
std::conditional_t< IsRecursive, stdlib::recursion::PairingPoints< Curve >, bb::PairingPoints< Curve > > PairingPoints
std::conditional_t< IsRecursive, typename Flavor::CircuitBuilder, void > Builder
const std::shared_ptr< Instance > & get_verifier_instance() const
Get the verifier instance (for accessing VK and witness commitments in Chonk/Goblin)
auto get_ecc_op_wires() const
Get ECC op wire commitments as an array (MegaFlavor only)
OpeningClaim< IPACurve > IPAClaim
bool verify_ipa(const Proof &ipa_proof, const IPAClaim &ipa_claim)
Verify IPA proof for rollup circuits (native verifier only)
std::vector< FF > PublicInputs
const Flavor::WitnessCommitments & get_witness_commitments() const
Get witness commitments from the verifier instance.
std::shared_ptr< Instance > verifier_instance
typename Flavor::VerificationKey VerificationKey
const PublicInputs & get_public_inputs() const
Get public inputs from the verifier instance.
typename Flavor::VKAndHash VKAndHash
A constructor for native and recursive verifiers.
std::conditional_t< IsRecursive, stdlib::recursion::honk::UltraRecursiveVerifierOutput< Builder >, UltraVerifierOutput< Flavor > > Output
const std::shared_ptr< Transcript > & get_transcript() const
Get the transcript (for accessing manifest in tests)
static constexpr bool IsRecursive
std::shared_ptr< Transcript > ipa_transcript
PaddingData process_padding() const
Compute log_n and padding indicator array based on flavor configuration.
typename Flavor::Transcript Transcript
typename Flavor::Curve Curve
std::shared_ptr< Transcript > transcript
typename Flavor::Commitment Commitment
std::pair< Proof, Proof > split_rollup_proof(const Proof &combined_proof) const
Split a combined rollup proof into honk and IPA components.
std::conditional_t< IsRecursive, stdlib::grumpkin< Builder >, curve::Grumpkin > IPACurve
UltraVerifier_(const std::shared_ptr< VKAndHash > &vk_and_hash, const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
Output verify_proof(const Proof &proof)
Perform ultra verification.
typename Flavor::FF FF
The VerifierInstance encapsulates all the necessary information for a Honk Verifier to verify a proof...
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:19
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
AvmProvingInputs inputs
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Result of padding computation.
std::vector< FF > padding_indicator_array
Result of reducing ultra proof to pairing points check. Contains pairing points and the aggrefate res...
Flavor::Commitment kernel_return_data
typename Flavor::Commitment Commitment
std::array< Commitment, Flavor::NUM_WIRES > ecc_op_tables
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:33
element< CircuitBuilder, bigfield< CircuitBuilder, bb::Bn254FqParams >, ScalarField, GroupNative > Group
Definition bn254.hpp:34
An object storing two EC points that represent the inputs to a pairing check.
Output type for recursive ultra verification.
void throw_or_abort(std::string const &err)