69 std::shared_ptr<MegaAvmFlavor::VerificationKey>
mega_vk;
118 using MegaRecursiveVKAndHash = MegaAvmRecursiveFlavor::VKAndHash;
121 using FF = MegaAvmRecursiveFlavor::FF;
126 std::vector<FF> hash_buffer;
127 hash_buffer.insert(hash_buffer.end(), stdlib_proof.begin(), stdlib_proof.end());
128 for (
const std::vector<FF>& input_vec : public_inputs) {
129 hash_buffer.insert(hash_buffer.end(), input_vec.begin(), input_vec.end());
137 mega_vk_and_hash->vk->fix_witness();
138 mega_vk_and_hash->hash.fix_witness();
140 MegaRecursiveVerifier mega_verifier(mega_vk_and_hash, transcript);
142 auto mega_verifier_output = mega_verifier.verify_proof(mega_proof);
145 MergeCommitments merge_commitments{
146 .t_commitments = mega_verifier.get_verifier_instance()->witness_commitments.get_ecc_op_wires().get_copy(),
155 goblin_verifier.reduce_to_pairing_check_and_ipa_opening();
161 all_pairing_points.reserve(3);
162 all_pairing_points.push_back(mega_verifier_output.points_accumulator);
166 constexpr bool handle_edge_cases =
false;
173 mega_verifier_output.mega_hash.assert_equal(ultra_hash);
205 std::vector<FF> mega_hash_buffer;
207 std::vector<FF> mega_object;
208 for (
const UltraFF& ultra_element : ultra_object) {
209 FF mega_element = FF::from_witness(&mega_builder, ultra_element.get_value());
210 mega_object.emplace_back(mega_element);
211 mega_hash_buffer.emplace_back(mega_element);
219 mega_public_inputs.reserve(public_inputs.size());
221 mega_public_inputs.emplace_back(convert_stdlib_ultra_to_stdlib_mega(input_vec));
229 MegaPairingPoints points_accumulator = recursive_verifier.verify_proof(mega_stdlib_proof, mega_public_inputs);
233 inputs.mega_hash = mega_hash;
234 inputs.pairing_inputs = points_accumulator;
243 mega_proving_key->log_dyadic_size(),
245 "AVMRecursiveVerifier: circuit size exceeded current upper bound. If expected, bump MEGA_AVM_LOG_N");
247 MegaAvmProver mega_prover(mega_proving_key, mega_vk, transcript);
248 HonkProof mega_proof = mega_prover.construct_proof();
256 .mega_proof = mega_proof,
257 .goblin_proof = goblin_proof,
#define BB_ASSERT_LTE(left, right,...)
void ensure_well_formed_op_queue_for_avm(MegaBuilder &builder) const
Add required initial ops to the op queue for AVM mode.
std::shared_ptr< OpQueue > op_queue
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
std::shared_ptr< Transcript > transcript
Unified Goblin verifier for both native and recursive verification.
typename MergeVerifier::InputCommitments MergeCommitments
Recursive flavor for verifying proofs produced with MegaAvmFlavor.
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
Recursive verifier of AVM2 proofs that utilizes the Goblin mechanism for efficient EC operations.
InnerProverOutput construct_and_prove_inner_recursive_verification_circuit(const stdlib::Proof< UltraBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs) const
Construct and prove the inner Mega-arithmetized AVM recursive verifier circuit.
UltraBuilder & ultra_builder
AvmGoblinRecursiveVerifier(UltraBuilder &builder)
stdlib::recursion::honk::UltraRecursiveVerifierOutput< UltraBuilder > RecursiveAvmGoblinOutput
RecursiveAvmGoblinOutput construct_outer_recursive_verification_circuit(const stdlib::Proof< UltraBuilder > &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.
RecursiveAvmGoblinOutput verify_proof(const stdlib::Proof< UltraBuilder > &stdlib_proof, const std::vector< std::vector< UltraFF > > &public_inputs) const
Recursively verify an AVM proof using Goblin and two layers of recursive verification.
AvmRecursiveFlavorSettings::FF FF
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
A simple wrapper around a vector of stdlib field elements representing a proof.
The data that is propagated on the public inputs of the inner GoblinAvmRecursiveVerifier circuit.
std::array< typename bn254< Builder >::Group, Builder::NUM_WIRES > empty_ecc_op_tables(Builder &builder)
Construct commitments to empty subtables.
std::vector< fr > HonkProof
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
GoblinVerifier_< stdlib::bn254< UltraCircuitBuilder > > GoblinRecursiveVerifier
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Result of Goblin verification with mode-specific semantics.
PairingPoints translator_pairing_points
PairingPoints merge_pairing_points
std::shared_ptr< MegaAvmFlavor::VerificationKey > mega_vk
An object storing two EC points that represent the inputs to a pairing check.
static PairingPoints aggregate_multiple(std::vector< PairingPoints > &pairing_points, bool handle_edge_cases=true)
Aggregate multiple PairingPoints using random linear combination.
uint32_t set_public()
Set the witness indices for the limbs of the pairing points to public.
Output type for recursive ultra verification.
OpeningClaim< grumpkin< Builder > > ipa_claim
PairingPoints< Curve > points_accumulator
stdlib::Proof< Builder > ipa_proof