19#include <gtest/gtest.h>
45 std::vector<std::string> labels = {
"None",
"PublicInputs",
"Proof" };
57 const bool verified = prover.
verify(proof, public_inputs);
58 EXPECT_TRUE(verified) <<
"native proof verification failed";
61 public_inputs_flat.resize(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH,
FF::zero());
63 return { proof, public_inputs_flat };
75 .key_hash = IS_CONSTANT,
84 switch (invalid_witness_target) {
94 witness_values[constraint.
proof[FrCodec::calc_num_fields<AvmFlavor::Commitment>() *
100 return { constraint, witness_values };
112 GTEST_SKIP() <<
"Skipping slow test";
115 [[maybe_unused]]
size_t num_gates = test_vk_independence<UltraFlavor>();
124 GTEST_SKIP() <<
"Skipping slow test";
126 std::vector<std::string> _ = test_tampering();
133 GTEST_SKIP() <<
"Skipping slow test";
137 AcirConstraint constraint;
139 Base::generate_constraints(constraint, witness);
146 auto builder = create_circuit<Builder>(program, metadata);
154 static constexpr FF EXPECTED_OUTER_VK_HASH =
155 FF(
"0x28f5195fba68d3a530560eef5c0ade56761c5b51e8c07436a672c57b7b7e7cd8");
156 EXPECT_EQ(
vk->hash(), EXPECTED_OUTER_VK_HASH)
157 <<
"The VK hash of the outer circuit in the Goblinized AVM recursive verifier has changed. If this is "
158 "expected, update the expected value in the test.";
169 FF(
"0x222aceaf07c4ffd9f4d2c87318ce3008375836c922e095587ed8ce91ae20b705");
177 const std::vector<FF>& public_inputs_flat)
180 stdlib_public_inputs_flat.reserve(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH);
181 for (
const auto public_input : public_inputs_flat) {
185 stdlib_proof.reserve(AVM_V2_PROOF_LENGTH_IN_FIELDS);
186 for (
const auto proof_element : proof) {
191 PublicInputs::flat_to_columns<field_t<Builder>>(stdlib_public_inputs_flat);
192 auto [mega_proof, goblin_proof, mega_vk] =
196 return { stdlib_proof, public_inputs, { mega_proof, goblin_proof, mega_vk } };
207 GTEST_SKIP() <<
"Skipping slow test";
214 stdlib_public_inputs_flat.reserve(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH);
215 for (
const auto public_input : public_inputs_flat) {
219 stdlib_proof.reserve(AVM_V2_PROOF_LENGTH_IN_FIELDS);
220 for (
const auto proof_element : proof) {
225 PublicInputs::flat_to_columns<field_t<Builder>>(stdlib_public_inputs_flat);
229 inner_builder, stdlib_proof, public_inputs);
234 EXPECT_EQ(mega_vk->hash(), EXPECTED_INNER_VK_HASH)
235 <<
"The VK hash of the inner circuit in the Goblinized AVM recursive verifier has changed. If this is "
236 "expected, update the expected value in the test.";
237 EXPECT_EQ(inner_builder.get_num_finalized_gates_inefficient(), EXPECT_GATE_COUNT);
248 GTEST_SKIP() <<
"Skipping slow test";
254 auto [stdlib_proof, public_inputs, inner_prover_output] =
255 create_and_prove_inner_circuit(outer_builder, proof, public_inputs_flat);
257 auto mega_proof_tampered = inner_prover_output.mega_proof;
258 mega_proof_tampered[0] +=
FF::one();
264 { mega_proof_tampered, inner_prover_output.goblin_proof, inner_prover_output.mega_vk });
266 EXPECT_TRUE(outer_builder.failed());
271 auto [stdlib_proof, public_inputs, inner_prover_output] =
272 create_and_prove_inner_circuit(outer_builder, proof, public_inputs_flat);
277 static constexpr size_t evals_after_op = 3;
278 const size_t op_eval_idx = inner_prover_output.goblin_proof.eccvm_proof.size() - evals_after_op;
280 auto goblin_proof_tampered = inner_prover_output.goblin_proof;
281 goblin_proof_tampered.eccvm_proof[op_eval_idx] +=
FF(1);
287 { inner_prover_output.mega_proof, goblin_proof_tampered, inner_prover_output.mega_vk });
289 EXPECT_TRUE(outer_builder.failed());
294 auto [stdlib_proof, public_inputs, inner_prover_output] =
295 create_and_prove_inner_circuit(outer_builder, proof, public_inputs_flat);
297 auto mega_vk_tampered = inner_prover_output.mega_vk;
298 mega_vk_tampered->q_m() =
299 mega_vk_tampered->q_m() + MegaAvmFlavor::Commitment::one();
305 { inner_prover_output.mega_proof, inner_prover_output.goblin_proof, mega_vk_tampered });
307 EXPECT_TRUE(outer_builder.failed());
static void SetUpTestSuite()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static std::pair< AvmProver::Proof, std::vector< FF > > create_avm_data()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static ProgramMetadata generate_metadata()
static void generate_constraints(AcirConstraint &avm_recursion_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static std::tuple< stdlib::Proof< Builder >, std::vector< std::vector< field_t< Builder > > >, InnerProverOutput > create_and_prove_inner_circuit(Builder &outer_builder, const HonkProof &proof, const std::vector< FF > &public_inputs_flat)
static constexpr size_t EXPECT_GATE_COUNT
TwoLayerAvmRecursiveVerifier::InnerProverOutput InnerProverOutput
static constexpr FF EXPECTED_INNER_VK_HASH
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
typename ExecutionTrace::FF FF
static constexpr size_t NUM_WITNESS_ENTITIES
bool verify(const Proof &proof, const PublicInputs &pi)
Proof prove(tracegen::TraceContainer &&trace)
Recursive verifier of AVM2 proofs that utilizes the Goblin mechanism for efficient EC operations.
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.
A simple wrapper around a vector of stdlib field elements representing a proof.
bool skip_slow_tests()
Check if slow tests should be skipped.
std::pair< tracegen::TraceContainer, PublicInputs > get_minimal_trace_with_pi()
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
Construct and check a goblin recursive verification circuit.
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field one()
static constexpr field zero()