Skip to content

Commit fd61a01

Browse files
committed
fix leaf recursion debug constraints
1 parent 198cb47 commit fd61a01

30 files changed

Lines changed: 1042 additions & 375 deletions

File tree

ceno_recursion_v2/src/bus.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ pub struct TowerModuleMessage<T> {
6060
pub idx: T,
6161
pub tidx: T,
6262
pub n_logup: T,
63+
pub num_read_count: T,
64+
pub num_write_count: T,
65+
pub num_logup_count: T,
6366
}
6467

6568
define_typed_per_proof_permutation_bus!(TowerModuleBus, TowerModuleMessage);

ceno_recursion_v2/src/circuit/inner/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ pub use trace::*;
2929
pub struct InnerCircuit<S: AggregationSubCircuit> {
3030
pub verifier_circuit: Arc<S>,
3131
pub def_hook_commit: Option<CommitBytes>,
32+
pub has_fixed_commit: bool,
33+
pub has_fixed_no_omc_init_commit: bool,
3234
pub instance_public_value_indices: Arc<Vec<Vec<usize>>>,
3335
}
3436

@@ -67,6 +69,8 @@ impl<SC: StarkProtocolConfig<F = F>, S: AggregationSubCircuit> Circuit<SC> for I
6769
lookup_challenge_bus,
6870
pvs_air_consistency_bus,
6971
deferral_enabled,
72+
has_fixed_commit: self.has_fixed_commit,
73+
has_fixed_no_omc_init_commit: self.has_fixed_no_omc_init_commit,
7074
instance_public_value_indices: self.instance_public_value_indices.clone(),
7175
}) as AirRef<SC>;
7276

ceno_recursion_v2/src/circuit/inner/vm_pvs/air.rs

Lines changed: 99 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use std::{borrow::Borrow, sync::Arc};
22

33
use ceno_emul::{FullTracer as Tracer, WORD_SIZE};
4-
use ceno_zkvm::instructions::riscv::constants::{
5-
END_CYCLE_IDX, END_PC_IDX, EXIT_CODE_IDX, EXIT_PC, HEAP_LENGTH_IDX, HEAP_START_ADDR_IDX,
6-
HINT_LENGTH_IDX, HINT_START_ADDR_IDX, INIT_CYCLE_IDX, INIT_PC_IDX, PUBIO_DIGEST_IDX,
7-
SHARD_ID_IDX, SHARD_RW_SUM_IDX,
4+
use ceno_zkvm::{
5+
instructions::riscv::constants::{
6+
END_CYCLE_IDX, END_PC_IDX, EXIT_CODE_IDX, EXIT_PC, HEAP_LENGTH_IDX, HEAP_START_ADDR_IDX,
7+
HINT_LENGTH_IDX, HINT_START_ADDR_IDX, INIT_CYCLE_IDX, INIT_PC_IDX, PUBIO_DIGEST_IDX,
8+
SHARD_ID_IDX, SHARD_RW_SUM_IDX,
9+
},
10+
scheme::PublicValues,
811
};
912
use openvm_circuit_primitives::utils::{and, assert_array_eq, not};
1013
use openvm_stark_backend::{
@@ -21,7 +24,11 @@ use stark_recursion_circuit_derive::AlignedBorrow;
2124

2225
use crate::{
2326
bus::{LookupChallengeBus, LookupChallengeKind, LookupChallengeMessage},
24-
circuit::inner::{bus::PvsAirConsistencyBus, vm_pvs::VmPvs},
27+
circuit::inner::{
28+
bus::{PvsAirConsistencyBus, PvsAirConsistencyMessage},
29+
vm_pvs::VmPvs,
30+
},
31+
utils::TranscriptLabel,
2532
};
2633

2734
#[repr(C)]
@@ -35,6 +42,9 @@ pub struct VmPvsCols<F> {
3542
pub lookup_challenge_beta: [F; D_EF],
3643
pub lookup_challenge_alpha_lookup_count: F,
3744
pub lookup_challenge_beta_lookup_count: F,
45+
pub fixed_commit_log2_max_codeword_size: F,
46+
pub fixed_no_omc_init_commit_log2_max_codeword_size: F,
47+
pub witness_commit_log2_max_codeword_size: F,
3848
pub child_pvs: VmPvs<F>,
3949
}
4050

@@ -45,6 +55,8 @@ pub struct VmPvsAir {
4555
pub lookup_challenge_bus: LookupChallengeBus,
4656
pub pvs_air_consistency_bus: PvsAirConsistencyBus,
4757
pub deferral_enabled: bool,
58+
pub has_fixed_commit: bool,
59+
pub has_fixed_no_omc_init_commit: bool,
4860
pub instance_public_value_indices: Arc<Vec<Vec<usize>>>,
4961
}
5062

@@ -189,41 +201,60 @@ impl<AB: AirBuilder + InteractionBuilder + AirBuilderWithPublicValues> Air<AB> f
189201
// );
190202

191203
// Commitments are observed after transcript-visible public values in preflight.
192-
let start_tidx_after_public_value = VmPvs::<u8>::width() - 3 * DIGEST_SIZE;
193-
for (didx, value) in local.child_pvs.fixed_commit.iter().enumerate() {
194-
self.transcript_bus.receive(
204+
let mut commit_tidx = TranscriptLabel::Riscv.field_len() + PublicValues::flattened_len();
205+
if self.has_fixed_commit {
206+
receive_commitment(
207+
self,
195208
builder,
196209
local.proof_idx,
197-
TranscriptBusMessage {
198-
tidx: AB::Expr::from_usize(start_tidx_after_public_value + didx),
199-
value: (*value).into(),
200-
is_sample: AB::Expr::ZERO,
201-
},
210+
commit_tidx,
211+
local.child_pvs.fixed_commit,
212+
local.fixed_commit_log2_max_codeword_size,
202213
local.is_valid,
203214
);
215+
commit_tidx += DIGEST_SIZE + 1;
204216
}
205-
for (didx, value) in local.child_pvs.fixed_no_omc_init_commit.iter().enumerate() {
217+
if self.has_fixed_no_omc_init_commit {
218+
receive_commitment(
219+
self,
220+
builder,
221+
local.proof_idx,
222+
commit_tidx,
223+
local.child_pvs.fixed_no_omc_init_commit,
224+
local.fixed_no_omc_init_commit_log2_max_codeword_size,
225+
local.is_valid,
226+
);
227+
commit_tidx += DIGEST_SIZE + 1;
228+
}
229+
receive_commitment(
230+
self,
231+
builder,
232+
local.proof_idx,
233+
commit_tidx,
234+
local.child_pvs.witness_commit,
235+
local.witness_commit_log2_max_codeword_size,
236+
local.is_valid,
237+
);
238+
commit_tidx += DIGEST_SIZE + 1;
239+
240+
for i in 0..D_EF {
206241
self.transcript_bus.receive(
207242
builder,
208243
local.proof_idx,
209244
TranscriptBusMessage {
210-
tidx: AB::Expr::from_usize(start_tidx_after_public_value + DIGEST_SIZE + didx),
211-
value: (*value).into(),
212-
is_sample: AB::Expr::ZERO,
245+
tidx: AB::Expr::from_usize(commit_tidx + i),
246+
value: local.lookup_challenge_alpha[i].into(),
247+
is_sample: AB::Expr::ONE,
213248
},
214249
local.is_valid,
215250
);
216-
}
217-
for (didx, value) in local.child_pvs.witness_commit.iter().enumerate() {
218251
self.transcript_bus.receive(
219252
builder,
220253
local.proof_idx,
221254
TranscriptBusMessage {
222-
tidx: AB::Expr::from_usize(
223-
start_tidx_after_public_value + 2 * DIGEST_SIZE + didx,
224-
),
225-
value: (*value).into(),
226-
is_sample: AB::Expr::ZERO,
255+
tidx: AB::Expr::from_usize(commit_tidx + D_EF + i),
256+
value: local.lookup_challenge_beta[i].into(),
257+
is_sample: AB::Expr::ONE,
227258
},
228259
local.is_valid,
229260
);
@@ -253,15 +284,15 @@ impl<AB: AirBuilder + InteractionBuilder + AirBuilderWithPublicValues> Air<AB> f
253284
}
254285

255286
// We look up proof metadata from VerifierPvsAir here to ensure consistency on each row.
256-
// self.pvs_air_consistency_bus.lookup_key(
257-
// builder,
258-
// local.proof_idx,
259-
// PvsAirConsistencyMessage {
260-
// deferral_flag,
261-
// has_verifier_pvs: local.has_verifier_pvs.into(),
262-
// },
263-
// local.is_valid,
264-
// );
287+
self.pvs_air_consistency_bus.lookup_key(
288+
builder,
289+
local.proof_idx,
290+
PvsAirConsistencyMessage {
291+
deferral_flag,
292+
has_verifier_pvs: local.has_verifier_pvs.into(),
293+
},
294+
local.is_valid,
295+
);
265296

266297
// Finally, constrain that this AIR's output public values are consistent with child_pvs.
267298
let &VmPvs::<_> {
@@ -383,6 +414,41 @@ where
383414
}
384415
}
385416

417+
fn receive_commitment<AB>(
418+
air: &VmPvsAir,
419+
builder: &mut AB,
420+
proof_idx: AB::Var,
421+
start_tidx: usize,
422+
commit: [AB::Var; DIGEST_SIZE],
423+
log2_max_codeword_size: AB::Var,
424+
mult: AB::Var,
425+
) where
426+
AB: AirBuilder + InteractionBuilder + AirBuilderWithPublicValues,
427+
{
428+
for (didx, value) in commit.into_iter().enumerate() {
429+
air.transcript_bus.receive(
430+
builder,
431+
proof_idx,
432+
TranscriptBusMessage {
433+
tidx: AB::Expr::from_usize(start_tidx + didx),
434+
value: value.into(),
435+
is_sample: AB::Expr::ZERO,
436+
},
437+
mult,
438+
);
439+
}
440+
air.transcript_bus.receive(
441+
builder,
442+
proof_idx,
443+
TranscriptBusMessage {
444+
tidx: AB::Expr::from_usize(start_tidx + DIGEST_SIZE),
445+
value: log2_max_codeword_size.into(),
446+
is_sample: AB::Expr::ZERO,
447+
},
448+
mult,
449+
);
450+
}
451+
386452
impl VmPvsAir {
387453
fn eval_deferrals<AB>(
388454
&self,

ceno_recursion_v2/src/circuit/inner/vm_pvs/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ pub fn run_preflight<TS>(
7777

7878
let alpha_ext = ts.sample_ext();
7979
let beta_ext = ts.sample_ext();
80-
eprintln!("vm_pvs alpha {} beta {}", alpha_ext, beta_ext);
8180
preflight.vm_pvs.lookup_challenge_alpha = alpha_ext;
8281
preflight.vm_pvs.lookup_challenge_beta = beta_ext;
83-
preflight.vm_pvs.lookup_challenge_alpha_lookup_count = 0;
84-
preflight.vm_pvs.lookup_challenge_beta_lookup_count = 0;
82+
let present_air_count = proof.chip_proofs.len();
83+
preflight.vm_pvs.lookup_challenge_alpha_lookup_count = present_air_count;
84+
preflight.vm_pvs.lookup_challenge_beta_lookup_count = present_air_count;
8585
}

ceno_recursion_v2/src/circuit/inner/vm_pvs/trace.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ pub fn generate_proving_ctx(
4646
.as_ref()
4747
.map(|commitment| commitment.commit.clone()),
4848
);
49+
let fixed_commit_log2_max_codeword_size = child_vk
50+
.fixed_commit
51+
.as_ref()
52+
.map(|commitment| F::from_u64(commitment.log2_max_codeword_size as u64))
53+
.unwrap_or(F::ZERO);
54+
let fixed_no_omc_init_commit_log2_max_codeword_size = child_vk
55+
.fixed_no_omc_init_commit
56+
.as_ref()
57+
.map(|commitment| F::from_u64(commitment.log2_max_codeword_size as u64))
58+
.unwrap_or(F::ZERO);
4959

5060
for (row_idx, row) in trace.chunks_exact_mut(width).enumerate() {
5161
let (base_row, def_row) = row.split_at_mut(VmPvsCols::<u8>::width());
@@ -64,6 +74,11 @@ pub fn generate_proving_ctx(
6474
F::from_usize(preflight.vm_pvs.lookup_challenge_alpha_lookup_count);
6575
cols.lookup_challenge_beta_lookup_count =
6676
F::from_usize(preflight.vm_pvs.lookup_challenge_beta_lookup_count);
77+
cols.fixed_commit_log2_max_codeword_size = fixed_commit_log2_max_codeword_size;
78+
cols.fixed_no_omc_init_commit_log2_max_codeword_size =
79+
fixed_no_omc_init_commit_log2_max_codeword_size;
80+
cols.witness_commit_log2_max_codeword_size =
81+
F::from_u64(proof.witin_commit.log2_max_codeword_size as u64);
6782
cols.child_pvs = build_vm_pvs(fixed_commit, fixed_no_omc_init_commit, proof);
6883
}
6984

ceno_recursion_v2/src/continuation/prover/inner/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ impl<
8282
let circuit = Arc::new(InnerCircuit::new(
8383
Arc::new(verifier_circuit),
8484
def_hook_commit.map(|d| d.into()),
85+
child_vk.fixed_commit.is_some(),
86+
child_vk.fixed_no_omc_init_commit.is_some(),
8587
instance_public_value_indices,
8688
));
8789
let (pk, vk) = engine.keygen(&circuit.airs());
@@ -127,6 +129,8 @@ impl<
127129
let circuit = Arc::new(InnerCircuit::new(
128130
Arc::new(verifier_circuit),
129131
def_hook_commit.map(|d| d.into()),
132+
child_vk.fixed_commit.is_some(),
133+
child_vk.fixed_no_omc_init_commit.is_some(),
130134
instance_public_value_indices,
131135
));
132136
let vk = Arc::new(pk.get_vk());

ceno_recursion_v2/src/continuation/prover/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ impl AggregationOptions {
6767
}
6868

6969
type CenoProof = ZKVMProof<RecursionField, Basefold<RecursionField, BasefoldRSParams>>;
70-
type Engine = BabyBearPoseidon2CpuEngine<
71-
openvm_stark_sdk::config::baby_bear_poseidon2::DuplexSponge,
72-
>;
70+
type Engine =
71+
BabyBearPoseidon2CpuEngine<openvm_stark_sdk::config::baby_bear_poseidon2::DuplexSponge>;
7372

7473
/// Full recursion pipeline that aggregates N Ceno base-layer shard proofs
7574
/// into a single compact root proof.
@@ -91,9 +90,7 @@ pub struct AggProver<const LEAF_FANIN: usize, const INTERNAL_FANIN: usize> {
9190
options: AggregationOptions,
9291
}
9392

94-
impl<const LEAF_FANIN: usize, const INTERNAL_FANIN: usize>
95-
AggProver<LEAF_FANIN, INTERNAL_FANIN>
96-
{
93+
impl<const LEAF_FANIN: usize, const INTERNAL_FANIN: usize> AggProver<LEAF_FANIN, INTERNAL_FANIN> {
9794
/// Create a new aggregation prover from the base-layer verifying key.
9895
pub fn new(child_vk: Arc<RecursionVk>, options: AggregationOptions) -> Self {
9996
let leaf_prover = InnerCpuProver::<LEAF_FANIN>::new::<Engine>(

0 commit comments

Comments
 (0)