76 GTEST_SKIP() <<
"Skipping slow test";
79 const bool pad_proof = GetParam();
88 NativeProofResult proof_result;
90 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
91 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
92 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
93 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
96 auto [proof, public_inputs_cols] = proof_result;
107 OuterBuilder outer_circuit;
111 public_inputs_ct.reserve(public_inputs_cols.size());
112 for (
const auto& vec : public_inputs_cols) {
114 vec_ct.reserve(vec.size());
115 for (
const auto& val : vec) {
116 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
118 public_inputs_ct.push_back(vec_ct);
123 auto verifier_output = [&]() {
124 std::cout <<
"Constructing AvmRecursiveVerifier and verifying " << (pad_proof ?
"padded " :
"") <<
"proof..."
126 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
128 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
129 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
130 std::cout <<
"Time taken (recursive verification): "
131 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
136 inputs.pairing_inputs = verifier_output.points_accumulator;
137 inputs.ipa_claim = verifier_output.ipa_claim;
139 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
142 NativeVerifierCommitmentKey pcs_vkey{};
143 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
144 verifier_output.points_accumulator.P1.get_value());
145 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
146 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
148 vinfo(
"Recursive verifier",
149 (pad_proof ?
" (padded proof)" :
""),
150 ": finalized num gates = ",
151 outer_circuit.num_gates());
158 auto outer_proof = [&]() {
159 auto verification_key =
161 UltraRollupProver outer_prover(outer_proving_key, verification_key);
162 return outer_prover.construct_proof();
166 auto outer_verification_key =
171 bool result = final_verifier.
verify_proof(outer_proof).result;
184 GTEST_SKIP() <<
"Skipping slow test";
192 NativeProofResult proof_result;
194 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
195 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
196 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
197 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
200 auto [proof, public_inputs_cols] = proof_result;
203 OuterBuilder outer_circuit;
207 public_inputs_ct.reserve(public_inputs_cols.size());
208 for (
const auto& vec : public_inputs_cols) {
210 vec_ct.reserve(vec.size());
211 for (
const auto& val : vec) {
212 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
214 public_inputs_ct.push_back(vec_ct);
217 public_inputs_ct[1][5] += 1;
223 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
225 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
226 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
227 std::cout <<
"Time taken (recursive verification): "
228 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
231 ASSERT_TRUE(outer_circuit.failed()) <<
"Outer circuit SHOULD fail with bad PIs.";