49 auto P1 = InnerG1::random_element();
50 auto P2 = InnerG1::random_element();
55 op_queue->no_op_ultra_only();
57 for (
size_t i = 0; i < num_ops; i++) {
58 op_queue->add_accumulate(P1);
59 op_queue->mul_accumulate(P2, z);
74 auto fake_inital_proof = prover_transcript->export_proof();
79 auto circuit_builder =
InnerBuilder(batching_challenge_v, evaluation_challenge_x, op_queue);
82 InnerProver prover{ proving_key, prover_transcript };
90 transcript->load_proof(stdlib_proof);
91 [[maybe_unused]]
auto _ = transcript->template receive_from_prover<RecursiveFlavor::BF>(
"init");
96 verifier.verify_proof(proof, evaluation_challenge_x, batching_challenge_v);
98 info(
"Recursive Verifier: num gates = ", outer_circuit.
num_gates);
101 EXPECT_EQ(outer_circuit.
failed(),
false) << outer_circuit.
err();
104 native_verifier_transcript->load_proof(fake_inital_proof);
105 native_verifier_transcript->template receive_from_prover<InnerBF>(
"init");
106 InnerVerifier native_verifier(verification_key, native_verifier_transcript);
107 bool native_result = native_verifier.
verify_proof(proof, evaluation_challenge_x, batching_challenge_v);
108 NativeVerifierCommitmentKey pcs_vkey{};
109 auto recursive_result = pcs_vkey.pairing_check(pairing_points.
P0.get_value(), pairing_points.
P1.get_value());
110 EXPECT_EQ(recursive_result, native_result);
112 auto recursive_manifest = verifier.transcript->get_manifest();
113 auto native_manifest = native_verifier.
transcript->get_manifest();
114 for (
size_t i = 0; i < recursive_manifest.size(); ++i) {
115 EXPECT_EQ(recursive_manifest[i], native_manifest[i])
116 <<
"Recursive Verifier/Verifier manifest discrepency in round " << i;
119 EXPECT_EQ(
static_cast<uint64_t
>(verifier.key->log_circuit_size.get_value()),
120 verification_key->log_circuit_size);
121 EXPECT_EQ(
static_cast<uint64_t
>(verifier.key->num_public_inputs.get_value()),
122 verification_key->num_public_inputs);
123 for (
auto [vk_poly, native_vk_poly] :
zip_view(verifier.key->get_all(), verification_key->get_all())) {
124 EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
133 bool verified = verifier.template verify_proof<DefaultIO>(proof).result;
135 ASSERT_TRUE(verified);
143 auto get_blocks = [](
size_t num_ops)
151 auto fake_inital_proof = prover_transcript->export_proof();
155 auto inner_circuit =
InnerBuilder(batching_challenge_v, evaluation_challenge_x, op_queue);
159 InnerProver inner_prover(inner_proving_key, prover_transcript);
160 info(
"test circuit size: ", inner_proving_key->proving_key->circuit_size);
161 auto verification_key =
171 transcript->load_proof(stdlib_proof);
172 [[maybe_unused]]
auto _ = transcript->template receive_from_prover<typename RecursiveFlavor::BF>(
"init");
176 verifier.verify_proof(inner_proof,
177 TranslatorBF::from_witness(&outer_circuit, evaluation_challenge_x),
178 TranslatorBF::from_witness(&outer_circuit, batching_challenge_v));
182 auto outer_verification_key =
185 return { outer_circuit.
blocks, outer_verification_key };
188 auto [blocks_256, verification_key_256] = get_blocks(256);
189 auto [blocks_512, verification_key_512] = get_blocks(512);
191 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_256, blocks_512 },
192 { verification_key_256, verification_key_512 });