15using Flavors = testing::Types<MegaRecursiveFlavor_<MegaCircuitBuilder>,
16 MegaRecursiveFlavor_<UltraCircuitBuilder>,
17 UltraRecursiveFlavor_<UltraCircuitBuilder>,
18 UltraRecursiveFlavor_<MegaCircuitBuilder>,
19 UltraZKRecursiveFlavor_<UltraCircuitBuilder>,
20 UltraZKRecursiveFlavor_<MegaCircuitBuilder>,
21 UltraRollupRecursiveFlavor_<UltraCircuitBuilder>,
22 MegaZKRecursiveFlavor_<MegaCircuitBuilder>,
23 MegaZKRecursiveFlavor_<UltraCircuitBuilder>>;
82 const size_t num_gates = (1 << log_num_gates);
83 for (
size_t i = 0; i < num_gates; ++i) {
85 uint32_t a_idx =
builder.add_variable(
a);
90 uint32_t b_idx =
builder.add_variable(
b);
91 uint32_t c_idx =
builder.add_variable(c);
92 uint32_t d_idx =
builder.add_variable(d);
94 builder.create_big_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
115 EXPECT_EQ(result,
true);
137 EXPECT_EQ(
static_cast<uint64_t
>(verifier.verifier_instance->vk_and_hash->vk->log_circuit_size.get_value()),
138 honk_vk->log_circuit_size);
139 EXPECT_EQ(
static_cast<uint64_t
>(verifier.verifier_instance->vk_and_hash->vk->num_public_inputs.get_value()),
140 honk_vk->num_public_inputs);
141 for (
auto [vk_poly, native_vk_poly] :
142 zip_view(verifier.verifier_instance->vk_and_hash->vk->get_all(), honk_vk->get_all())) {
143 EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
156 auto get_blocks = [](
size_t inner_size) -> std::tuple<
typename OuterBuilder::ExecutionTrace,
163 auto verification_key =
165 InnerProver inner_prover(inner_prover_instance, verification_key);
166 info(
"test circuit size: ", inner_prover_instance->dyadic_size());
171 auto stdlib_vk_and_hash =
177 verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
184 inputs.ipa_claim = verifier_output.
ipa_claim;
187 outer_circuit.ipa_proof = verifier_output.
ipa_proof.get_value();
192 auto outer_verification_key =
195 return { outer_circuit.blocks, outer_verification_key };
198 auto [blocks_10, verification_key_10] = get_blocks(10);
199 auto [blocks_14, verification_key_14] = get_blocks(14);
201 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_10, blocks_14 },
202 { verification_key_10, verification_key_14 });
216 auto verification_key =
218 InnerProver inner_prover(prover_instance, verification_key);
223 auto stdlib_vk_and_hash =
229 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
239 outer_circuit.ipa_proof = output.
ipa_proof.get_value();
244 EXPECT_EQ(outer_circuit.failed(),
false) << outer_circuit.err();
248 bool native_result =
false;
250 native_verifier.
transcript->enable_manifest();
254 native_verifier.template verify_proof<bb::RollupIO>(inner_proof, output.
ipa_proof.get_value()).result;
256 native_result = native_verifier.template verify_proof<bb::DefaultIO>(inner_proof).result;
262 info(
"input pairing points result: ", result);
263 auto recursive_result =
265 EXPECT_EQ(recursive_result, native_result);
269 auto recursive_manifest = verifier.transcript->get_manifest();
270 auto native_manifest = native_verifier.
transcript->get_manifest();
271 for (
size_t i = 0; i < recursive_manifest.size(); ++i) {
272 EXPECT_EQ(recursive_manifest[i], native_manifest[i]);
278 auto verification_key =
280 info(
"Recursive Verifier: num gates = ", outer_circuit.get_num_finalized_gates());
281 OuterProver prover(prover_instance, verification_key);
285 OuterVerifier verifier(verification_key, ipa_verification_key);
286 bool result = verifier.template verify_proof<bb::RollupIO>(proof, prover_instance->ipa_proof).result;
290 bool result = verifier.template verify_proof<bb::DefaultIO>(proof).result;
296 uint32_t NUM_GATES_EXPECTED = 808803;
297 ASSERT_EQ(
static_cast<uint32_t
>(outer_circuit.get_num_finalized_gates()), NUM_GATES_EXPECTED)
298 <<
"MegaZKHonk Recursive verifier changed in Ultra gate count! Update this value if you "
299 "are sure this is expected.";
310 for (
size_t idx = 0; idx < static_cast<size_t>(
TamperType::END); idx++) {
317 auto inner_verification_key =
319 InnerProver inner_prover(prover_instance, inner_verification_key);
324 tamper_with_proof<InnerProver, InnerFlavor>(inner_prover, inner_proof, tamper_type);
328 auto stdlib_vk_and_hash =
332 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
345 EXPECT_FALSE(result);
359 for (
size_t idx = 0; idx < 2; idx++) {
366 auto inner_verification_key =
368 InnerProver inner_prover(prover_instance, inner_verification_key);
372 tamper_with_proof<InnerProver, InnerFlavor>(inner_proof,
static_cast<bool>(idx));
376 auto stdlib_vk_and_hash =
380 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
393 EXPECT_FALSE(result);
403 TestFixture::test_inner_circuit();
408 TestFixture::test_recursive_verification_key_creation();
413 TestFixture::test_recursive_verification();
418 if constexpr (
IsAnyOf<TypeParam,
423 TestFixture::test_independent_vk_hash();
425 GTEST_SKIP() <<
"Not built for this parameter";
431 TestFixture::test_recursive_verification_fails();
434#ifdef DISABLE_HEAVY_TESTS
436TEST(RecursiveVerifierTest, DoNothingTestToEnsureATestExists) {}
The recursive counterpart to the "native" MegaZKFlavor.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
The recursive counterpart to the "native" Ultra flavor.
The recursive counterpart to the "native" UltraRollupFlavor.
std::shared_ptr< Transcript > transcript
VerifierCommitmentKey< curve::Grumpkin > ipa_verification_key
The recursive counterpart to the Ultra flavor with ZK.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
A simple wrapper around a vector of stdlib field elements representing a proof.
Manages the data that is propagated on the public inputs of an application/function circuit.
Test suite for recursive verification of Honk proofs for both Ultra and Mega arithmetisation.
InnerFlavor::Commitment InnerCommitment
typename RecursiveFlavor::NativeFlavor InnerFlavor
std::conditional_t< HasIPAAccumulator< RecursiveFlavor >, bb::stdlib::recursion::honk::RollupIO, bb::stdlib::recursion::honk::DefaultIO< OuterBuilder > > OuterIO
static InnerBuilder create_inner_circuit(size_t log_num_gates=10)
Create a non-trivial arbitrary inner circuit, the proof of which will be recursively verified.
typename InnerFlavor::VerifierCommitmentKey NativeVerifierCommitmentKey
std::conditional_t< IsMegaBuilder< OuterBuilder >, MegaFlavor, std::conditional_t< HasIPAAccumulator< RecursiveFlavor >, UltraRollupFlavor, UltraFlavor > > OuterFlavor
static void test_recursive_verification()
Construct a recursive verification circuit for the proof of an inner circuit then call check_circuit ...
static void test_recursive_verification_fails()
Construct verifier circuits for proofs whose data have been tampered with. Expect failure.
typename RecursiveVerifier::VerificationKey VerificationKey
static void test_recursive_verification_key_creation()
Instantiate a recursive verification key from the native verification key produced by the inner cicui...
static void test_recursive_verification_fails()
Tamper with a MegaZK proof in two ways. First, we modify the first non-zero value in the proof,...
std::conditional_t< HasIPAAccumulator< RecursiveFlavor >, bb::stdlib::recursion::honk::RollupIO, bb::stdlib::recursion::honk::DefaultIO< InnerBuilder > > InnerIO
static void test_inner_circuit()
Create inner circuit and call check_circuit on it.
typename RecursiveFlavor::CircuitBuilder OuterBuilder
typename InnerFlavor::CircuitBuilder InnerBuilder
static void test_independent_vk_hash()
Ensures that the recursive verifier circuit for two inner circuits of different size is the same as t...
static void SetUpTestSuite()
The data that is propagated on the public inputs of a rollup circuit.
typename Flavor::VerificationKey VerificationKey
std::shared_ptr< Transcript > transcript
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
testing::Types< UltraRecursiveFlavor_< UltraCircuitBuilder >, UltraRollupRecursiveFlavor_< UltraCircuitBuilder >, UltraRecursiveFlavor_< MegaCircuitBuilder >, UltraZKRecursiveFlavor_< UltraCircuitBuilder >, UltraZKRecursiveFlavor_< MegaCircuitBuilder > > Flavors
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
testing::Types< UltraRecursiveFlavor_< UltraCircuitBuilder > > Flavors
TEST(RecursiveHonkTranscript, InterfacesMatch)
Test basic transcript functionality and check circuit.
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
An object storing two EC points that represent the inputs to a pairing check.
OpeningClaim< grumpkin< Builder > > ipa_claim
PairingPoints< Builder > points_accumulator
stdlib::Proof< Builder > ipa_proof
#define HEAVY_TYPED_TEST(x, y)