75 NativeProofResult proof_result;
77 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
78 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
79 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
80 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
83 auto [proof, verification_key, public_inputs_cols] = proof_result;
84 proof.insert(proof.begin(), 0);
87 OuterBuilder outer_circuit;
91 public_inputs_ct.reserve(public_inputs_cols.size());
92 for (
const auto& vec : public_inputs_cols) {
94 vec_ct.reserve(vec.size());
95 for (
const auto& val : vec) {
96 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
98 public_inputs_ct.push_back(vec_ct);
101 auto key_fields_native = verification_key->to_field_elements();
103 for (
const auto& f : key_fields_native) {
104 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
105 outer_key_fields.push_back(val);
110 auto verifier_output = [&]() {
112 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
114 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
115 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
116 std::cout <<
"Time taken (recursive verification): "
117 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
121 verifier_output.points_accumulator.set_public();
122 verifier_output.ipa_claim.set_public();
123 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
126 NativeVerifierCommitmentKey pcs_vkey{};
127 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
128 verifier_output.points_accumulator.P1.get_value());
129 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
130 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
132 vinfo(
"Recursive verifier: finalized num gates = ", outer_circuit.num_gates);
139 auto outer_proof = [&]() {
140 auto verification_key =
142 UltraRollupProver outer_prover(outer_proving_key, verification_key);
143 return outer_prover.construct_proof();
147 auto outer_verification_key =
152 bool result = final_verifier.template verify_proof<bb::RollupIO>(outer_proof, outer_proving_key->ipa_proof).result;