74 GTEST_SKIP() <<
"Skipping slow test";
84 NativeProofResult proof_result;
86 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
87 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
88 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
89 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
92 auto [proof, verification_key, public_inputs_cols] = proof_result;
93 proof.insert(proof.begin(), 0);
96 OuterBuilder outer_circuit;
100 public_inputs_ct.reserve(public_inputs_cols.size());
101 for (
const auto& vec : public_inputs_cols) {
103 vec_ct.reserve(vec.size());
104 for (
const auto& val : vec) {
105 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
107 public_inputs_ct.push_back(vec_ct);
110 auto key_fields_native = verification_key->to_field_elements();
112 for (
const auto& f : key_fields_native) {
113 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
114 outer_key_fields.push_back(val);
119 auto verifier_output = [&]() {
121 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
123 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
124 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
125 std::cout <<
"Time taken (recursive verification): "
126 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
131 inputs.pairing_inputs = verifier_output.points_accumulator;
132 inputs.ipa_claim = verifier_output.ipa_claim;
134 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
137 NativeVerifierCommitmentKey pcs_vkey{};
138 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
139 verifier_output.points_accumulator.P1.get_value());
140 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
141 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
143 vinfo(
"Recursive verifier: finalized num gates = ", outer_circuit.num_gates());
150 auto outer_proof = [&]() {
151 auto verification_key =
153 UltraRollupProver outer_prover(outer_proving_key, verification_key);
154 return outer_prover.construct_proof();
158 auto outer_verification_key =
163 bool result = final_verifier.template verify_proof<bb::RollupIO>(outer_proof, outer_proving_key->ipa_proof).result;
172 GTEST_SKIP() <<
"Skipping slow test";
182 NativeProofResult proof_result;
184 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
185 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
186 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
187 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
190 auto [proof, verification_key, public_inputs_cols] = proof_result;
192 proof.insert(proof.begin(),
196 OuterBuilder outer_circuit;
200 public_inputs_ct.reserve(public_inputs_cols.size());
202 for (
const auto& vec : public_inputs_cols) {
204 vec_ct.reserve(vec.size());
205 for (
const auto& _ : vec) {
208 public_inputs_ct.push_back(vec_ct);
211 auto key_fields_native = verification_key->to_field_elements();
213 for (
const auto& f : key_fields_native) {
214 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
215 outer_key_fields.push_back(val);
220 auto verifier_output = [&]() {
222 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
224 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
225 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
226 std::cout <<
"Time taken (recursive verification): "
227 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
232 inputs.pairing_inputs = verifier_output.points_accumulator;
233 inputs.ipa_claim = verifier_output.ipa_claim;
235 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
238 NativeVerifierCommitmentKey pcs_vkey{};
239 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
240 verifier_output.points_accumulator.P1.get_value());
241 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
242 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
244 vinfo(
"Recursive verifier: finalized num gates = ", outer_circuit.num_gates());
251 auto outer_proof = [&]() {
252 auto verification_key =
254 UltraRollupProver outer_prover(outer_proving_key, verification_key);
255 return outer_prover.construct_proof();
259 auto outer_verification_key =
264 bool result = final_verifier.template verify_proof<bb::RollupIO>(outer_proof, outer_proving_key->ipa_proof).result;
272 GTEST_SKIP() <<
"Skipping slow test";
280 NativeProofResult proof_result;
282 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
283 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
284 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
285 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
288 auto [proof, verification_key, public_inputs_cols] = proof_result;
290 proof.insert(proof.begin(), 0);
293 OuterBuilder outer_circuit;
297 public_inputs_ct.reserve(public_inputs_cols.size());
298 for (
const auto& vec : public_inputs_cols) {
300 vec_ct.reserve(vec.size());
301 for (
const auto& val : vec) {
302 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
304 public_inputs_ct.push_back(vec_ct);
307 public_inputs_ct[1][5] += 1;
309 auto key_fields_native = verification_key->to_field_elements();
311 for (
const auto& f : key_fields_native) {
312 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
313 outer_key_fields.push_back(val);
320 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
322 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
323 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
324 std::cout <<
"Time taken (recursive verification): "
325 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
328 ASSERT_TRUE(outer_circuit.failed()) <<
"Outer circuit SHOULD fail with bad PIs.";