119 using MegaRecursiveVKAndHash = MegaRecursiveFlavor::VKAndHash;
123 using MergeCommitments = GoblinRecursiveVerifier::MergeVerifier::InputCommitments;
124 using FF = MegaRecursiveFlavor::FF;
128 std::vector<FF> hash_buffer;
129 hash_buffer.insert(hash_buffer.end(), stdlib_proof.begin(), stdlib_proof.end());
130 for (
const std::vector<FF>& input_vec : public_inputs) {
131 hash_buffer.insert(hash_buffer.end(), input_vec.begin(), input_vec.end());
135 hash_buffer.emplace_back(
vk_hash);
142 mega_vk_and_hash->vk->fix_witness();
143 mega_vk_and_hash->hash.fix_witness();
145 MegaRecursiveVerifier mega_verifier(&
ultra_builder, mega_vk_and_hash, transcript);
147 auto mega_verifier_output = mega_verifier.template verify_proof<IO>(mega_proof);
150 MergeCommitments merge_commitments{
151 .t_commitments = mega_verifier.key->witness_commitments.get_ecc_op_wires().get_copy(),
156 GoblinRecursiveVerifierOutput goblin_verifier_output =
157 goblin_verifier.verify(inner_output.
goblin_proof, merge_commitments);
158 goblin_verifier_output.points_accumulator.aggregate(mega_verifier_output.points_accumulator);
163 mega_verifier_output.mega_hash.assert_equal(ultra_hash);
168 output.
ipa_claim = goblin_verifier_output.opening_claim;
169 output.
ipa_proof = goblin_verifier_output.ipa_proof;
196 std::vector<FF> mega_hash_buffer;
198 std::vector<FF> mega_object;
199 for (
const UltraFF& ultra_element : ultra_object) {
200 FF mega_element = FF::from_witness(&mega_builder, ultra_element.get_value());
201 mega_object.emplace_back(mega_element);
202 mega_hash_buffer.emplace_back(mega_element);
210 mega_public_inputs.reserve(public_inputs.size());
212 mega_public_inputs.emplace_back(convert_stdlib_ultra_to_stdlib_mega(input_vec));
216 std::vector<FF> key_fields = convert_stdlib_ultra_to_stdlib_mega(
outer_key_fields);
217 FF mega_vk_hash = convert_stdlib_ultra_to_stdlib_mega({
vk_hash })[0];
220 mega_vk_hash.fix_witness();
228 MegaPairingPoints points_accumulator = recursive_verifier.verify_proof(mega_stdlib_proof, mega_public_inputs);
232 inputs.mega_hash = mega_hash;
233 inputs.pairing_inputs = points_accumulator;
242 mega_proving_key->log_dyadic_size(),
244 "AVMRecursiveVerifier: circuit size exceeded current upper bound. If expected, bump MEGA_AVM_LOG_N");
246 MegaProver mega_prover(mega_proving_key, mega_vk, transcript);
257 .mega_proof = mega_proof,
258 .goblin_proof = goblin_proof,
260 .goblin_vk = goblin_vk,
#define BB_ASSERT_LTE(left, right,...)
TranslatorFlavor::VerificationKey TranslatorVerificationKey
std::shared_ptr< OpQueue > op_queue
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
ECCVMFlavor::VerificationKey ECCVMVerificationKey
std::shared_ptr< Transcript > transcript
ecc_op_tuple queue_ecc_no_op()
Logic for a no-op operation.
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
The recursive counterpart to the "native" Mega flavor.
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
std::vector< UltraFF > outer_key_fields
stdlib::recursion::honk::UltraRecursiveVerifierOutput< UltraBuilder > RecursiveAvmGoblinOutput
AvmGoblinRecursiveVerifier(UltraBuilder &builder, const std::vector< UltraFF > &outer_key_fields)
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.
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::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
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::shared_ptr< MegaFlavor::VerificationKey > mega_vk
Goblin::VerificationKey goblin_vk
An object storing two EC points that represent the inputs to a pairing check.
uint32_t set_public()
Set the witness indices for the limbs of the pairing points to public.
OpeningClaim< grumpkin< Builder > > ipa_claim
PairingPoints< Builder > points_accumulator
stdlib::Proof< Builder > ipa_proof