Skip to content

Commit a1e5966

Browse files
authored
chore(avm): Fake verification routine for avm recursion in public base rollup (#10382)
Resolves #10243
1 parent 5cef628 commit a1e5966

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

barretenberg/cpp/src/barretenberg/vm/avm/tests/recursive_verifier.test.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ TEST_F(AvmRecursiveTests, recursion)
109109
verification_key->pcs_verification_key->pairing_check(agg_output.P0.get_value(), agg_output.P1.get_value());
110110

111111
ASSERT_TRUE(agg_output_valid) << "Pairing points (aggregation state) are not valid.";
112-
113-
vinfo("Recursive verifier: num gates = ", outer_circuit.num_gates);
114112
ASSERT_FALSE(outer_circuit.failed()) << "Outer circuit has failed.";
115113

116114
bool outer_circuit_checked = CircuitChecker::check(outer_circuit);
@@ -139,6 +137,8 @@ TEST_F(AvmRecursiveTests, recursion)
139137
auto ultra_verification_key = std::make_shared<UltraFlavor::VerificationKey>(ultra_instance->proving_key);
140138
OuterVerifier ultra_verifier(ultra_verification_key);
141139

140+
vinfo("Recursive verifier: finalized num gates = ", outer_circuit.num_gates);
141+
142142
auto recursion_proof = ultra_prover.construct_proof();
143143
bool recursion_verified = ultra_verifier.verify_proof(recursion_proof);
144144
EXPECT_TRUE(recursion_verified) << "recursion proof verification failed";

noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr

+5
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ impl PublicBaseRollupInputs {
9797
// self.tube_data.vk_data.validate_in_vk_tree([TUBE_VK_INDEX]);
9898
}
9999

100+
// Warning: Fake verification! TODO(#8470)
101+
if !dep::std::runtime::is_unconstrained() {
102+
self.avm_proof_data.fake_verify();
103+
}
104+
100105
// TODO(#8470)
101106
// if !dep::std::runtime::is_unconstrained() {
102107
// self.avm_proof_data.verify();

noir-projects/noir-protocol-circuits/crates/types/src/abis/avm_circuit_public_inputs.nr

+33
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use crate::{
2121
utils::reader::Reader,
2222
};
2323

24+
use std::hash::{poseidon2, poseidon2_permutation};
25+
2426
pub struct AvmCircuitPublicInputs {
2527
///////////////////////////////////
2628
// Inputs.
@@ -180,6 +182,37 @@ pub struct AvmProofData {
180182
pub vk_data: VkData<AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS>,
181183
}
182184

185+
// The number of columns for the AVM recursive verifier we want to fake, i.e., the resulting
186+
// verify() routine below will create a similar number of gates as a real AVM recursive verifier
187+
// with the number of columns set by this constant.
188+
pub global DUMMY_AVM_VERIFIER_NUM_COLUMNS: u32 = 2200;
189+
190+
// Current AVM recursive verifier has 9500 gates per column.
191+
// Note that the addition of a single column in AVM recursive verifier incurs 8500 gates.
192+
// (some additional costs are due to lookups, relations, ...).
193+
// 78 gates per Poseidon permutation
194+
// 9500/78 = 121.8
195+
pub global DUMMY_AVM_VERIFIER_NUM_ITERATIONS: u32 = DUMMY_AVM_VERIFIER_NUM_COLUMNS * 122;
196+
197+
// Warning: This is a fake avm recursive verification whose sole goal is to reproduce a similar
198+
// computational effort (number of gates) as the real recursive verifier.
199+
// TODO(#8470): Replace with the real AVM recursive verifier
200+
impl AvmProofData {
201+
pub fn fake_verify(self) {
202+
let mut input_hash = poseidon2::Poseidon2::hash(
203+
[self.public_inputs.transaction_fee, self.proof.fields[0], self.vk_data.vk.key[0]],
204+
3,
205+
);
206+
207+
let mut result: [Field; 4] = [input_hash, 0, 0, 0];
208+
for i in 0..DUMMY_AVM_VERIFIER_NUM_ITERATIONS {
209+
result = poseidon2_permutation(result, 4);
210+
}
211+
212+
assert(!result[0].lt(1));
213+
}
214+
}
215+
183216
impl Verifiable for AvmProofData {
184217
fn verify(self) {
185218
// TODO(#8470)

0 commit comments

Comments
 (0)