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.key->vk_and_hash->vk->log_circuit_size.get_value()),
138 honk_vk->log_circuit_size);
139 EXPECT_EQ(
static_cast<uint64_t
>(verifier.key->vk_and_hash->vk->num_public_inputs.get_value()),
140 honk_vk->num_public_inputs);
141 for (
auto [vk_poly, native_vk_poly] :
zip_view(verifier.key->vk_and_hash->vk->get_all(), honk_vk->get_all())) {
142 EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
155 auto get_blocks = [](
size_t inner_size) -> std::tuple<
typename OuterBuilder::ExecutionTrace,
162 auto verification_key =
164 InnerProver inner_prover(inner_proving_key, verification_key);
165 info(
"test circuit size: ", inner_proving_key->dyadic_size());
170 auto stdlib_vk_and_hash =
176 verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
183 inputs.ipa_claim = verifier_output.
ipa_claim;
186 outer_circuit.ipa_proof = verifier_output.
ipa_proof.get_value();
191 auto outer_verification_key =
194 return { outer_circuit.blocks, outer_verification_key };
197 auto [blocks_10, verification_key_10] = get_blocks(10);
198 auto [blocks_14, verification_key_14] = get_blocks(14);
200 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_10, blocks_14 },
201 { verification_key_10, verification_key_14 });
216 InnerProver inner_prover(proving_key, verification_key);
221 auto stdlib_vk_and_hash =
227 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
237 outer_circuit.ipa_proof = output.
ipa_proof.get_value();
242 EXPECT_EQ(outer_circuit.failed(),
false) << outer_circuit.err();
246 bool native_result =
false;
248 native_verifier.
transcript->enable_manifest();
252 native_verifier.template verify_proof<bb::RollupIO>(inner_proof, output.
ipa_proof.get_value()).result;
254 native_result = native_verifier.template verify_proof<bb::DefaultIO>(inner_proof).result;
260 info(
"input pairing points result: ", result);
261 auto recursive_result =
263 EXPECT_EQ(recursive_result, native_result);
267 auto recursive_manifest = verifier.transcript->get_manifest();
268 auto native_manifest = native_verifier.
transcript->get_manifest();
269 for (
size_t i = 0; i < recursive_manifest.size(); ++i) {
270 EXPECT_EQ(recursive_manifest[i], native_manifest[i]);
276 auto verification_key =
278 info(
"Recursive Verifier: num gates = ", outer_circuit.get_num_finalized_gates());
283 OuterVerifier verifier(verification_key, ipa_verification_key);
284 bool result = verifier.template verify_proof<bb::RollupIO>(proof, proving_key->ipa_proof).result;
288 bool result = verifier.template verify_proof<bb::DefaultIO>(proof).result;
294 uint32_t NUM_GATES_EXPECTED = 797234;
295 ASSERT_EQ(
static_cast<uint32_t
>(outer_circuit.get_num_finalized_gates()), NUM_GATES_EXPECTED)
296 <<
"MegaZKHonk Recursive verifier changed in Ultra gate count! Update this value if you "
297 "are sure this is expected.";
308 for (
size_t idx = 0; idx < static_cast<size_t>(
TamperType::END); idx++) {
315 auto inner_verification_key =
317 InnerProver inner_prover(proving_key, inner_verification_key);
322 tamper_with_proof<InnerProver, InnerFlavor>(inner_prover, inner_proof, tamper_type);
326 auto stdlib_vk_and_hash =
330 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
343 EXPECT_FALSE(result);
357 for (
size_t idx = 0; idx < 2; idx++) {
364 auto inner_verification_key =
366 InnerProver inner_prover(proving_key, inner_verification_key);
370 tamper_with_proof<InnerProver, InnerFlavor>(inner_proof,
static_cast<bool>(idx));
374 auto stdlib_vk_and_hash =
378 VerifierOutput output = verifier.template verify_proof<OuterIO>(stdlib_inner_proof);
391 EXPECT_FALSE(result);
401 TestFixture::test_inner_circuit();
406 TestFixture::test_recursive_verification_key_creation();
411 TestFixture::test_recursive_verification();
416 if constexpr (
IsAnyOf<TypeParam,
421 TestFixture::test_independent_vk_hash();
423 GTEST_SKIP() <<
"Not built for this parameter";
429 TestFixture::test_recursive_verification_fails();
432#ifdef DISABLE_HEAVY_TESTS
434TEST(RecursiveVerifierTest, DoNothingTestToEnsureATestExists) {}
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
The recursive counterpart to the "native" MegaZKFlavor.
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)