80 NativeProofResult proof_result;
82 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
83 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
84 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
85 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
88 auto [proof, verification_key, public_inputs_cols] = proof_result;
89 proof.insert(proof.begin(), 0);
92 OuterBuilder outer_circuit;
96 public_inputs_ct.reserve(public_inputs_cols.size());
97 for (
const auto& vec : public_inputs_cols) {
99 vec_ct.reserve(vec.size());
100 for (
const auto& val : vec) {
101 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
103 public_inputs_ct.push_back(vec_ct);
106 auto key_fields_native = verification_key->to_field_elements();
108 for (
const auto& f : key_fields_native) {
109 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
110 outer_key_fields.push_back(val);
115 auto verifier_output = [&]() {
117 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
119 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
120 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
121 std::cout <<
"Time taken (recursive verification): "
122 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
126 verifier_output.points_accumulator.set_public();
127 verifier_output.ipa_claim.set_public();
128 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
131 NativeVerifierCommitmentKey pcs_vkey{};
132 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
133 verifier_output.points_accumulator.P1.get_value());
134 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
135 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
137 vinfo(
"Recursive verifier: finalized num gates = ", outer_circuit.num_gates);
144 auto outer_proof = [&]() {
145 auto verification_key =
147 UltraRollupProver outer_prover(outer_proving_key, verification_key);
148 return outer_prover.construct_proof();
152 auto outer_verification_key =
157 bool result = final_verifier.template verify_proof<bb::RollupIO>(outer_proof, outer_proving_key->ipa_proof).result;
172 NativeProofResult proof_result;
174 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
175 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
176 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
177 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
180 auto [proof, verification_key, public_inputs_cols] = proof_result;
182 proof.insert(proof.begin(),
186 OuterBuilder outer_circuit;
190 public_inputs_ct.reserve(public_inputs_cols.size());
192 for (
const auto& vec : public_inputs_cols) {
194 vec_ct.reserve(vec.size());
195 for (
const auto& _ : vec) {
196 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, FF::random_element()));
198 public_inputs_ct.push_back(vec_ct);
201 auto key_fields_native = verification_key->to_field_elements();
203 for (
const auto& f : key_fields_native) {
204 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
205 outer_key_fields.push_back(val);
210 auto verifier_output = [&]() {
212 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
214 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
215 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
216 std::cout <<
"Time taken (recursive verification): "
217 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
221 verifier_output.points_accumulator.set_public();
222 verifier_output.ipa_claim.set_public();
223 outer_circuit.ipa_proof = verifier_output.ipa_proof.get_value();
226 NativeVerifierCommitmentKey pcs_vkey{};
227 bool agg_output_valid = pcs_vkey.pairing_check(verifier_output.points_accumulator.P0.get_value(),
228 verifier_output.points_accumulator.P1.get_value());
229 ASSERT_TRUE(agg_output_valid) <<
"Pairing points (aggregation state) are not valid.";
230 ASSERT_FALSE(outer_circuit.failed()) <<
"Outer circuit has failed.";
232 vinfo(
"Recursive verifier: finalized num gates = ", outer_circuit.num_gates);
239 auto outer_proof = [&]() {
240 auto verification_key =
242 UltraRollupProver outer_prover(outer_proving_key, verification_key);
243 return outer_prover.construct_proof();
247 auto outer_verification_key =
252 bool result = final_verifier.template verify_proof<bb::RollupIO>(outer_proof, outer_proving_key->ipa_proof).result;
264 NativeProofResult proof_result;
266 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
267 ASSERT_NO_FATAL_FAILURE({ create_and_verify_native_proof(proof_result); });
268 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
269 std::cout <<
"Time taken (native proof): " << std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
272 auto [proof, verification_key, public_inputs_cols] = proof_result;
274 proof.insert(proof.begin(), 0);
277 OuterBuilder outer_circuit;
281 public_inputs_ct.reserve(public_inputs_cols.size());
282 for (
const auto& vec : public_inputs_cols) {
284 vec_ct.reserve(vec.size());
285 for (
const auto& val : vec) {
286 vec_ct.push_back(UltraFF::from_witness(&outer_circuit, val));
288 public_inputs_ct.push_back(vec_ct);
291 public_inputs_ct[1][5] += 1;
293 auto key_fields_native = verification_key->to_field_elements();
295 for (
const auto& f : key_fields_native) {
296 UltraFF val = UltraFF::from_witness(&outer_circuit, f);
297 outer_key_fields.push_back(val);
304 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
306 auto result = avm_rec_verifier.
verify_proof(stdlib_proof, public_inputs_ct);
307 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
308 std::cout <<
"Time taken (recursive verification): "
309 << std::chrono::duration_cast<std::chrono::seconds>(end - start).count() <<
"s" <<
std::endl;
312 ASSERT_TRUE(outer_circuit.failed()) <<
"Outer circuit SHOULD fail with bad PIs.";