11#include <gtest/gtest.h>
106 .num_acir_opcodes = 7,
107 .public_inputs = { 1, 2 },
108 .logic_constraints = { logic_constraint },
109 .range_constraints = { range_a, range_b },
110 .poly_triple_constraints = { expr_a, expr_b, expr_c, expr_d },
117 5, 10, 15, 5, inverse_of_five, 1,
119 uint32_t honk_recursion = 0;
120 if constexpr (IsAnyOf<InnerFlavor, UltraFlavor, UltraZKFlavor>) {
122 }
else if constexpr (IsAnyOf<InnerFlavor, UltraRollupFlavor>) {
139 template <
typename BuilderType>
146 for (
auto& inner_circuit : inner_circuits) {
155 fr key_hash_witness = verification_key->hash();
156 std::vector<fr> proof_witnesses = inner_proof;
161 size_t num_public_inputs_to_extract = inner_circuit.num_public_inputs();
162 if constexpr (HasIPAAccumulator<InnerFlavor>) {
164 }
else if constexpr (InnerFlavor::HasZK) {
171 auto [key_indices, key_hash_index, proof_indices, inner_public_inputs] =
173 witness, proof_witnesses, key_witnesses, key_hash_witness, num_public_inputs_to_extract);
177 .proof = proof_indices,
178 .public_inputs = inner_public_inputs,
179 .key_hash = key_hash_index,
180 .proof_type = proof_type,
182 honk_recursion_constraints.push_back(honk_recursion_constraint);
186 constraint_system.
varnum =
static_cast<uint32_t
>(witness.size());
187 constraint_system.num_acir_opcodes =
static_cast<uint32_t
>(honk_recursion_constraints.size());
188 constraint_system.honk_recursion_constraints = honk_recursion_constraints;
192 uint32_t honk_recursion = 0;
193 if constexpr (IsAnyOf<InnerFlavor, UltraFlavor, UltraZKFlavor>) {
195 }
else if constexpr (IsAnyOf<InnerFlavor, UltraRollupFlavor>) {
199 if (dummy_witnesses) {
203 BuilderType outer_circuit = create_circuit<BuilderType>(program, metadata);
205 return outer_circuit;
216 if constexpr (HasIPAAccumulator<RecursiveFlavor>) {
218 OuterVerifier verifier(verification_key, ipa_verification_key);
219 result = verifier.template verify_proof<IO>(proof, proving_key->ipa_proof).result;
222 result = verifier.template verify_proof<IO>(proof).result;
232using Flavors = testing::Types<UltraRecursiveFlavor_<UltraCircuitBuilder>,
243 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
245 auto layer_2_circuit =
246 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits);
248 auto layer_2_circuit_with_dummy_witnesses =
249 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
253 auto verification_key =
256 auto proving_key_dummy =
258 auto verification_key_dummy =
262 EXPECT_EQ(*verification_key_dummy, *verification_key);
268 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
270 auto layer_2_circuit =
271 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits);
273 info(
"estimate finalized circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates());
276 auto verification_key =
278 typename TestFixture::OuterProver prover(proving_key, verification_key);
279 info(
"prover gates = ", proving_key->dyadic_size());
280 auto proof = prover.construct_proof();
282 EXPECT_EQ(TestFixture::verify_proof(proving_key, verification_key, proof),
true);
288 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
290 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
292 auto layer_2_circuit =
293 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits);
295 info(
"circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates());
298 auto verification_key =
300 typename TestFixture::OuterProver prover(proving_key, verification_key);
301 info(
"prover gates = ", proving_key->dyadic_size());
302 auto proof = prover.construct_proof();
304 EXPECT_EQ(TestFixture::verify_proof(proving_key, verification_key, proof),
true);
343 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
344 info(
"created first inner circuit");
347 layer_2_circuits.push_back(TestFixture::create_inner_circuit());
348 info(
"created second inner circuit");
350 layer_2_circuits.push_back(
351 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_1_circuits));
352 info(
"created first outer circuit");
354 auto layer_3_circuit =
355 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits);
356 info(
"created second outer circuit");
357 info(
"number of gates in layer 3 = ", layer_3_circuit.get_estimated_num_finalized_gates());
360 auto verification_key =
362 typename TestFixture::OuterProver prover(proving_key, verification_key);
363 info(
"prover gates = ", proving_key->dyadic_size());
364 auto proof = prover.construct_proof();
366 EXPECT_EQ(TestFixture::verify_proof(proving_key, verification_key, proof),
true);
389 layer_b_1_circuits.push_back(TestFixture::create_inner_circuit());
390 info(
"created first inner circuit");
393 layer_b_2_circuits.push_back(TestFixture::create_inner_circuit());
394 info(
"created second inner circuit");
397 layer_2_circuits.push_back(
398 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_1_circuits));
399 info(
"created first outer circuit");
401 layer_2_circuits.push_back(
402 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_2_circuits));
403 info(
"created second outer circuit");
405 auto layer_3_circuit =
406 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits);
407 info(
"created third outer circuit");
408 info(
"number of gates in layer 3 circuit = ", layer_3_circuit.get_estimated_num_finalized_gates());
411 auto verification_key =
413 typename TestFixture::OuterProver prover(proving_key, verification_key);
414 info(
"prover gates = ", proving_key->dyadic_size());
415 auto proof = prover.construct_proof();
417 EXPECT_EQ(TestFixture::verify_proof(proving_key, verification_key, proof),
true);
InnerBuilder create_inner_circuit()
typename InnerFlavor::VerificationKey InnerVerificationKey
std::conditional_t< IsMegaBuilder< OuterBuilder >, MegaFlavor, std::conditional_t< HasIPAAccumulator< InnerFlavor >, UltraRollupFlavor, UltraFlavor > > OuterFlavor
typename RecursiveFlavor::CircuitBuilder OuterBuilder
typename InnerFlavor::CircuitBuilder InnerBuilder
BuilderType create_outer_circuit(std::vector< InnerBuilder > &inner_circuits, bool dummy_witnesses=false)
Create a circuit that recursively verifies one or more circuits.
typename OuterFlavor::VerificationKey OuterVerificationKey
typename RecursiveFlavor::NativeFlavor InnerFlavor
bool verify_proof(const std::shared_ptr< OuterDeciderProvingKey > &proving_key, const std::shared_ptr< OuterVerificationKey > &verification_key, const HonkProof &proof)
static void SetUpTestSuite()
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
Manages the data that is propagated on the public inputs of an application/function circuit.
static constexpr size_t PUBLIC_INPUTS_SIZE
The data that is propagated on the public inputs of a rollup circuit.
static constexpr size_t PUBLIC_INPUTS_SIZE
The recursive counterpart to the "native" Ultra flavor.
The recursive counterpart to the "native" UltraRollupFlavor.
The recursive counterpart to the Ultra flavor with ZK.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
testing::Types< UltraRecursiveFlavor_< UltraCircuitBuilder > > Flavors
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
field< Bn254FrParams > fr
std::vector< T, bb::ContainerSlabAllocator< T > > SlabVector
A vector that uses the slab allocator.
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
constexpr field invert() const noexcept