56 static void add_mixed_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 100)
58 auto P1 = InnerG1::random_element();
59 auto P2 = InnerG1::random_element();
61 for (
size_t i = 0; i < count; i++) {
62 op_queue->add_accumulate(P1);
63 op_queue->mul_accumulate(P2, z);
65 op_queue->eq_and_reset();
70 const InnerBF& evaluation_challenge_x,
71 const size_t circuit_size_parameter = 500)
76 op_queue->no_op_ultra_only();
84 return InnerBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue };
95 auto fake_inital_proof = prover_transcript->export_proof();
103 InnerProver prover{ proving_key, prover_transcript };
111 transcript->load_proof(stdlib_proof);
112 [[maybe_unused]]
auto _ = transcript->template receive_from_prover<RecursiveFlavor::BF>(
"init");
117 verifier.verify_proof(proof, evaluation_challenge_x, batching_challenge_v);
119 info(
"Recursive Verifier: num gates = ", outer_circuit.
num_gates);
122 EXPECT_EQ(outer_circuit.
failed(),
false) << outer_circuit.
err();
125 native_verifier_transcript->load_proof(fake_inital_proof);
126 native_verifier_transcript->template receive_from_prover<InnerBF>(
"init");
127 InnerVerifier native_verifier(verification_key, native_verifier_transcript);
128 bool native_result = native_verifier.
verify_proof(proof, evaluation_challenge_x, batching_challenge_v);
129 NativeVerifierCommitmentKey pcs_vkey{};
130 auto recursive_result = pcs_vkey.pairing_check(pairing_points.
P0.get_value(), pairing_points.
P1.get_value());
131 EXPECT_EQ(recursive_result, native_result);
133 auto recursive_manifest = verifier.transcript->get_manifest();
134 auto native_manifest = native_verifier.
transcript->get_manifest();
135 for (
size_t i = 0; i < recursive_manifest.size(); ++i) {
136 EXPECT_EQ(recursive_manifest[i], native_manifest[i])
137 <<
"Recursive Verifier/Verifier manifest discrepency in round " << i;
140 EXPECT_EQ(
static_cast<uint64_t
>(verifier.key->log_circuit_size.get_value()),
141 verification_key->log_circuit_size);
142 EXPECT_EQ(
static_cast<uint64_t
>(verifier.key->num_public_inputs.get_value()),
143 verification_key->num_public_inputs);
144 for (
auto [vk_poly, native_vk_poly] :
zip_view(verifier.key->get_all(), verification_key->get_all())) {
145 EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
151 OuterProver prover(prover_instance, verification_key);
154 bool verified = verifier.template verify_proof<DefaultIO>(proof).result;
156 ASSERT_TRUE(verified);
164 auto get_blocks = [](
size_t num_ops)
170 auto fake_inital_proof = prover_transcript->export_proof();
178 InnerProver inner_prover(inner_proving_key, prover_transcript);
179 info(
"test circuit size: ", inner_proving_key->proving_key->circuit_size);
180 auto verification_key =
190 transcript->load_proof(stdlib_proof);
191 [[maybe_unused]]
auto _ = transcript->template receive_from_prover<typename RecursiveFlavor::BF>(
"init");
195 auto stdlib_evaluation_challenge_x = TranslatorBF::from_witness(&outer_circuit, evaluation_challenge_x);
196 auto stdlib_batching_challenge_v = TranslatorBF::from_witness(&outer_circuit, batching_challenge_v);
197 transcript->add_to_hash_buffer(
"evaluation_challenge_x", stdlib_evaluation_challenge_x);
198 transcript->add_to_hash_buffer(
"batching_challenge_v", stdlib_batching_challenge_v);
200 verifier.verify_proof(inner_proof, stdlib_evaluation_challenge_x, stdlib_batching_challenge_v);
204 auto outer_verification_key =
207 return { outer_circuit.
blocks, outer_verification_key };
210 auto [blocks_256, verification_key_256] = get_blocks(256);
211 auto [blocks_512, verification_key_512] = get_blocks(512);
213 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_256, blocks_512 },
214 { verification_key_256, verification_key_512 });