12#include <gtest/gtest.h>
107 .num_acir_opcodes = 7,
108 .public_inputs = { 1, 2 },
109 .logic_constraints = { logic_constraint },
110 .range_constraints = { range_a, range_b },
111 .poly_triple_constraints = { expr_a, expr_b, expr_c, expr_d },
118 5, 10, 15, 5, inverse_of_five, 1,
120 uint32_t honk_recursion = 0;
121 if constexpr (IsAnyOf<InnerFlavor, UltraFlavor, UltraZKFlavor>) {
123 }
else if constexpr (IsAnyOf<InnerFlavor, UltraRollupFlavor>) {
140 template <
typename BuilderType>
142 bool dummy_witnesses,
149 for (
auto& inner_circuit : inner_circuits) {
153 InnerProver prover(prover_instance, verification_key);
158 fr key_hash_witness = verification_key->hash();
159 std::vector<fr> proof_witnesses = inner_proof;
164 size_t num_public_inputs_to_extract = inner_circuit.num_public_inputs();
165 if constexpr (HasIPAAccumulator<InnerFlavor>) {
167 }
else if constexpr (InnerFlavor::HasZK) {
174 auto [key_indices, key_hash_index, proof_indices, inner_public_inputs] =
176 witness, proof_witnesses, key_witnesses, key_hash_witness, num_public_inputs_to_extract);
180 witness.push_back(
fr(1));
182 witness.push_back(
fr(0));
187 .proof = proof_indices,
188 .public_inputs = inner_public_inputs,
189 .key_hash = key_hash_index,
190 .proof_type = proof_type,
191 .predicate = predicate,
193 honk_recursion_constraints.push_back(honk_recursion_constraint);
197 constraint_system.
varnum =
static_cast<uint32_t
>(witness.size());
198 constraint_system.num_acir_opcodes =
static_cast<uint32_t
>(honk_recursion_constraints.size());
199 constraint_system.honk_recursion_constraints = honk_recursion_constraints;
203 uint32_t honk_recursion = 0;
204 if constexpr (IsAnyOf<InnerFlavor, UltraFlavor, UltraZKFlavor>) {
206 }
else if constexpr (IsAnyOf<InnerFlavor, UltraRollupFlavor>) {
210 if (dummy_witnesses) {
214 BuilderType outer_circuit = create_circuit<BuilderType>(program, metadata);
216 return outer_circuit;
227 if constexpr (HasIPAAccumulator<RecursiveFlavor>) {
229 OuterVerifier verifier(verification_key, ipa_verification_key);
230 result = verifier.template verify_proof<IO>(proof, prover_instance->ipa_proof).result;
233 result = verifier.template verify_proof<IO>(proof).result;
243using Flavors = testing::Types<UltraRecursiveFlavor_<UltraCircuitBuilder>,
254 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
256 auto layer_2_circuit = TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(
257 layer_1_circuits,
false,
true);
259 auto layer_2_circuit_with_dummy_witnesses =
260 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
265 auto verification_key =
268 auto prover_instance_dummy =
270 auto verification_key_dummy =
274 EXPECT_EQ(*verification_key_dummy, *verification_key);
280 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
282 auto layer_2_circuit =
283 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
287 info(
"estimate finalized circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates());
290 auto verification_key =
292 typename TestFixture::OuterProver prover(prover_instance, verification_key);
293 info(
"prover gates = ", prover_instance->dyadic_size());
294 auto proof = prover.construct_proof();
296 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
302 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
304 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
306 auto layer_2_circuit =
307 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
false,
false);
309 info(
"circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates());
312 auto verification_key =
314 typename TestFixture::OuterProver prover(prover_instance, verification_key);
315 info(
"prover gates = ", prover_instance->dyadic_size());
316 auto proof = prover.construct_proof();
318 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
357 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
358 info(
"created first inner circuit");
361 layer_2_circuits.push_back(TestFixture::create_inner_circuit());
362 info(
"created second inner circuit");
364 layer_2_circuits.push_back(
365 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_1_circuits,
368 info(
"created first outer circuit");
370 auto layer_3_circuit =
371 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits,
374 info(
"created second outer circuit");
375 info(
"number of gates in layer 3 = ", layer_3_circuit.get_estimated_num_finalized_gates());
378 auto verification_key =
380 typename TestFixture::OuterProver prover(prover_instance, verification_key);
381 info(
"prover gates = ", prover_instance->dyadic_size());
382 auto proof = prover.construct_proof();
384 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
407 layer_b_1_circuits.push_back(TestFixture::create_inner_circuit());
408 info(
"created first inner circuit");
411 layer_b_2_circuits.push_back(TestFixture::create_inner_circuit());
412 info(
"created second inner circuit");
415 layer_2_circuits.push_back(
416 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_1_circuits,
419 info(
"created first outer circuit");
421 layer_2_circuits.push_back(
422 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_2_circuits,
425 info(
"created second outer circuit");
427 auto layer_3_circuit =
428 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits,
431 info(
"created third outer circuit");
432 info(
"number of gates in layer 3 circuit = ", layer_3_circuit.get_estimated_num_finalized_gates());
435 auto verification_key =
437 typename TestFixture::OuterProver prover(prover_instance, verification_key);
438 info(
"prover gates = ", prover_instance->dyadic_size());
439 auto proof = prover.construct_proof();
441 EXPECT_EQ(TestFixture::verify_proof(prover_instance, 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
BuilderType create_outer_circuit(std::vector< InnerBuilder > &inner_circuits, bool dummy_witnesses, bool predicate_val)
Create a circuit that recursively verifies one or more circuits.
typename InnerFlavor::CircuitBuilder InnerBuilder
typename OuterFlavor::VerificationKey OuterVerificationKey
typename RecursiveFlavor::NativeFlavor InnerFlavor
bool verify_proof(const std::shared_ptr< OuterProverInstance > &prover_instance, const std::shared_ptr< OuterVerificationKey > &verification_key, const HonkProof &proof)
static void SetUpTestSuite()
Manages the data that is propagated on the public inputs of an application/function circuit.
static constexpr size_t PUBLIC_INPUTS_SIZE
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
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