176 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
178 auto layer_2_circuit = TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(
179 layer_1_circuits,
false,
true);
181 auto layer_2_circuit_with_dummy_witnesses =
182 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
187 auto verification_key =
190 auto prover_instance_dummy =
192 auto verification_key_dummy =
196 EXPECT_EQ(*verification_key_dummy, *verification_key);
202 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
204 auto layer_2_circuit =
205 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
210 auto verification_key =
212 typename TestFixture::OuterProver prover(prover_instance, verification_key);
213 auto proof = prover.construct_proof();
215 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
221 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
223 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
225 auto layer_2_circuit =
226 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
false,
false);
229 auto verification_key =
231 typename TestFixture::OuterProver prover(prover_instance, verification_key);
232 auto proof = prover.construct_proof();
234 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
273 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
274 info(
"created first inner circuit");
277 layer_2_circuits.push_back(TestFixture::create_inner_circuit());
278 info(
"created second inner circuit");
280 layer_2_circuits.push_back(
281 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_1_circuits,
284 info(
"created first outer circuit");
286 auto layer_3_circuit =
287 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits,
290 info(
"created second outer circuit");
293 auto verification_key =
295 typename TestFixture::OuterProver prover(prover_instance, verification_key);
296 auto proof = prover.construct_proof();
298 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
321 layer_b_1_circuits.push_back(TestFixture::create_inner_circuit());
322 info(
"created first inner circuit");
325 layer_b_2_circuits.push_back(TestFixture::create_inner_circuit());
326 info(
"created second inner circuit");
329 layer_2_circuits.push_back(
330 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_1_circuits,
333 info(
"created first outer circuit");
335 layer_2_circuits.push_back(
336 TestFixture::template create_outer_circuit<typename TestFixture::InnerBuilder>(layer_b_2_circuits,
339 info(
"created second outer circuit");
341 auto layer_3_circuit =
342 TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_2_circuits,
345 info(
"created third outer circuit");
348 auto verification_key =
350 typename TestFixture::OuterProver prover(prover_instance, verification_key);
351 auto proof = prover.construct_proof();
353 EXPECT_EQ(TestFixture::verify_proof(prover_instance, verification_key, proof),
true);
358 using InnerFlavor = TestFixture::InnerFlavor;
359 using RecursiveFlavor = TypeParam;
360 using InnerVerificationKey = TestFixture::InnerVerificationKey;
361 using InnerProverInstance = TestFixture::InnerProverInstance;
362 using OuterBuilder = TestFixture::OuterBuilder;
365 layer_1_circuits.push_back(TestFixture::create_inner_circuit());
369 std::vector<fr> witness;
371 auto& inner_circuit = layer_1_circuits[0];
374 typename TestFixture::InnerProver prover(prover_instance, verification_key);
375 auto inner_proof = prover.construct_proof();
377 std::vector<bb::fr> key_witnesses = verification_key->to_field_elements();
378 fr key_hash_witness = verification_key->hash();
381 size_t num_public_inputs_to_extract = inner_circuit.num_public_inputs();
382 if constexpr (HasIPAAccumulator<InnerFlavor>) {
384 }
else if constexpr (InnerFlavor::HasZK) {
391 auto [key_indices, key_hash_index, proof_indices, inner_public_inputs] =
393 witness, inner_proof, key_witnesses, key_hash_witness, num_public_inputs_to_extract);
402 .proof = proof_indices,
403 .public_inputs = inner_public_inputs,
404 .key_hash = key_hash_index,
405 .proof_type = proof_type,
406 .predicate = predicate,
408 honk_recursion_constraints.push_back(honk_recursion_constraint);
412 constraint_system.num_acir_opcodes = 1;
413 constraint_system.honk_recursion_constraints = honk_recursion_constraints;
417 bool constexpr has_ipa_claim = IsAnyOf<InnerFlavor, UltraRollupFlavor>;
421 auto outer_circuit = create_circuit<OuterBuilder>(program, metadata);
424 EXPECT_EQ(program.constraints.gates_per_opcode.size(), 1);
427 static auto [EXPECTED_GATE_COUNT, EXPECTED_ECC_ROWS, EXPECTED_ULTRA_OPS] =
428 HONK_RECURSION_CONSTANTS<RecursiveFlavor>;
431 EXPECT_EQ(program.constraints.gates_per_opcode[0], EXPECTED_GATE_COUNT);
435 size_t actual_ecc_rows = outer_circuit.op_queue->get_num_rows();
436 EXPECT_EQ(actual_ecc_rows, EXPECTED_ECC_ROWS);
437 size_t actual_ultra_ops = outer_circuit.op_queue->get_current_subtable_size();
438 EXPECT_EQ(actual_ultra_ops, EXPECTED_ULTRA_OPS);