26static constexpr size_t NUM_AVM_ULTRA_OPS = 2909;
27static_assert(2 * NUM_AVM_ULTRA_OPS < (1 << CONST_TRANSLATOR_MINI_CIRCUIT_LOG_SIZE) - NUM_DISABLED_ROWS_IN_SUMCHECK,
28 "AVM ultra ops land in the range reserved for randomness in the Translator mini circuit. If this "
29 "assertion fails, we need to increase CONST_TRANSLATOR_MINI_CIRCUIT_LOG_SIZE.");
94 [[nodiscard(
"TripleIPA opening and pairing points should be accumulated")]] TwoLayerAvmRecursiveVerifierOutput
117 [[nodiscard(
"TripleIPA opening and pairing points should be accumulated")]] TwoLayerAvmRecursiveVerifierOutput
124 using MegaRecursiveVKAndHash = MegaAvmRecursiveFlavor::VKAndHash;
134 mega_vk_and_hash->vk->fix_witness();
135 mega_vk_and_hash->hash.fix_witness();
137 MegaAvmRecursiveVerifier mega_verifier(mega_vk_and_hash, transcript);
139 auto mega_verifier_output = mega_verifier.verify_proof(mega_proof);
144 auto goblin_verifier_output = goblin_verifier.reduce_to_pairing_check_and_triple_ipa_opening();
147 mega_verifier_output.points_accumulator.aggregate(goblin_verifier_output.translator_pairing_points);
151 const UltraFF computed_transcript_hash =
153 mega_verifier_output.transcript_hash.assert_equal(computed_transcript_hash);
155 return { .points_accumulator =
std::move(mega_verifier_output.points_accumulator),
156 .triple_ipa_opening =
std::move(goblin_verifier_output.triple_ipa_opening) };
185 mega_proving_key->log_dyadic_size(),
187 "AVMRecursiveVerifier: circuit size exceeded current upper bound. If expected, bump MEGA_AVM_LOG_N");
189 MegaAvmProver mega_prover(mega_proving_key, mega_vk, transcript);
190 HonkProof mega_proof = mega_prover.construct_proof();
197 "The number of ultra ops in the AVM proof has changed. This should only happen if the number of "
198 "columns in the AVM changed.");
201 .mega_proof = mega_proof,
202 .goblin_proof = goblin_proof,
222 inner_public_inputs.reserve(AVM_NUM_PUBLIC_INPUT_COLUMNS);
223 for (
const auto& public_input_column : public_inputs) {
225 inner_public_input_column.reserve(public_input_column.size());
226 for (
const auto& public_input : public_input_column) {
227 inner_public_input_column.push_back(
MegaFF::from_witness(&inner_builder, public_input.get_value()));
229 inner_public_inputs.push_back(
std::move(inner_public_input_column));
236 MegaPairingPoints points_accumulator = recursive_verifier.verify_proof(inner_stdlib_proof, inner_public_inputs);
239 const MegaFF transcript_hash = recursive_verifier.hash_avm_transcript();
243 inputs.transcript_hash = transcript_hash;
244 inputs.pairing_inputs = points_accumulator;
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LTE(left, right,...)
Specialization of Goblin for the AVM.
GoblinAvmProof prove()
Constuct a full GoblinAvm proof (ECCVM, Translator)
typename ECCVMVerifier::DeferredTripleIpaOpening DeferredTripleIpaOpening
Result of GoblinAvm verification.
std::shared_ptr< OpQueue > op_queue
std::shared_ptr< Transcript > transcript
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
Recursive counterpart to MegaAvmFlavor.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
static stdlib::field_t< Builder > hash_avm_transcript(Builder &builder, const stdlib::Proof< Builder > &stdlib_proof, const std::vector< std::vector< stdlib::field_t< Builder > > > &public_inputs)
Construct a transcript replicating the operations performed on the AVM transcript during proof verifi...
Recursive verifier of AVM2 proofs that utilizes the Goblin mechanism for efficient EC operations.
TwoLayerAvmRecursiveVerifierOutput verify_proof(const stdlib::Proof< UltraCircuitBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs) const
Recursively verify an AVM proof using Goblin and two layers of recursive verification.
TwoLayerAvmRecursiveVerifier(UltraCircuitBuilder &builder)
static void construct_inner_recursive_verification_circuit(MegaCircuitBuilder &inner_builder, const stdlib::Proof< UltraCircuitBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs)
Construct the inner recursive verification circuit for the AVM2 recursive verifier.
static InnerProverOutput construct_and_prove_inner_recursive_verification_circuit(const stdlib::Proof< UltraCircuitBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs)
Construct and prove the inner Mega-arithmetized AVM recursive verifier circuit.
TwoLayerAvmRecursiveVerifierOutput construct_outer_recursive_verification_circuit(const stdlib::Proof< UltraCircuitBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs, const InnerProverOutput &inner_output) const
Construct the outer circuit which recursively verifies a Mega proof and a Goblin proof.
UltraCircuitBuilder * outer_builder
A simple wrapper around a vector of stdlib field elements representing a proof.
HonkProof get_value() const
static field_t from_witness(Builder *ctx, const bb::fr &input)
The data that is propagated on the public inputs of the inner GoblinAvmRecursiveVerifier circuit.
std::vector< fr > HonkProof
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
GoblinAvmProof goblin_proof
std::shared_ptr< MegaAvmFlavor::VerificationKey > mega_vk
stdlib::recursion::PairingPoints< stdlib::bn254< UltraCircuitBuilder > > points_accumulator
GoblinAvmRecursiveVerifier::DeferredTripleIpaOpening triple_ipa_opening
An object storing two EC points that represent the inputs to a pairing check.
uint32_t set_public(Builder *ctx=nullptr)
Set the witness indices for the pairing points to public.