Skip to content

Commit ca90237

Browse files
committed
refactor(zkvm): store one chip proof per circuit
1 parent 8a63ff4 commit ca90237

File tree

6 files changed

+156
-229
lines changed

6 files changed

+156
-229
lines changed

ceno_recursion/src/zkvm_verifier/binding.rs

Lines changed: 12 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub struct ZKVMProofInputVariable<C: Config> {
6868
pub raw_pi: Array<C, Array<C, Felt<C::F>>>,
6969
pub raw_pi_num_variables: Array<C, Var<C::N>>,
7070
pub pi_evals: Array<C, Ext<C::F, C::EF>>,
71-
pub chip_proofs: Array<C, Array<C, ZKVMChipProofInputVariable<C>>>,
71+
pub chip_proofs: Array<C, ZKVMChipProofInputVariable<C>>,
7272
pub max_num_var: Var<C::N>,
7373
pub max_width: Var<C::N>,
7474
pub witin_commit: BasefoldCommitmentVariable<C>,
@@ -92,7 +92,7 @@ pub(crate) struct ZKVMProofInput {
9292
pub raw_pi: Vec<Vec<F>>,
9393
// Evaluation of raw_pi.
9494
pub pi_evals: Vec<E>,
95-
pub chip_proofs: BTreeMap<usize, ZKVMChipProofs>,
95+
pub chip_proofs: BTreeMap<usize, ZKVMChipProofInput>,
9696
pub witin_commit: BasefoldCommitment,
9797
pub opening_proof: BasefoldProof,
9898
}
@@ -135,22 +135,16 @@ impl ZKVMProofInput {
135135
chip_proofs: zkvm_proof
136136
.chip_proofs
137137
.into_iter()
138-
.map(|(chip_idx, proofs)| {
138+
.map(|(chip_idx, proof)| {
139139
let (num_witin, num_fixed) = *chip_witin_num_vars
140140
.get(&chip_idx)
141141
.expect("num_witin data should exist");
142142
(
143143
chip_idx,
144-
proofs
145-
.into_iter()
146-
.map(|proof| {
147-
ZKVMChipProofInput::from((chip_idx, proof, num_witin, num_fixed))
148-
})
149-
.collect::<Vec<ZKVMChipProofInput>>()
150-
.into(),
144+
ZKVMChipProofInput::from((chip_idx, proof, num_witin, num_fixed)),
151145
)
152146
})
153-
.collect::<BTreeMap<usize, ZKVMChipProofs>>(),
147+
.collect::<BTreeMap<usize, ZKVMChipProofInput>>(),
154148
witin_commit: zkvm_proof.witin_commit.into(),
155149
opening_proof: zkvm_proof.opening_proof.into(),
156150
}
@@ -166,7 +160,7 @@ impl Hintable<InnerConfig> for ZKVMProofInput {
166160
let raw_pi_num_variables = Vec::<usize>::read(builder);
167161
let pi_evals = Vec::<E>::read(builder);
168162
builder.cycle_tracker_start("read chip proofs");
169-
let chip_proofs = Vec::<ZKVMChipProofs>::read(builder);
163+
let chip_proofs = Vec::<ZKVMChipProofInput>::read(builder);
170164
builder.cycle_tracker_end("read chip proofs");
171165
let max_num_var = usize::read(builder);
172166
let max_width = usize::read(builder);
@@ -202,28 +196,24 @@ impl Hintable<InnerConfig> for ZKVMProofInput {
202196
.collect();
203197
let witin_num_vars = self
204198
.chip_proofs
205-
.iter()
206-
.flat_map(|(_, proofs)| proofs.iter())
199+
.values()
207200
.filter(|proof| proof.num_witin > 0)
208201
.map(|proof| proof.num_vars)
209202
.collect::<Vec<_>>();
210203
let witin_max_widths = self
211204
.chip_proofs
212-
.iter()
213-
.flat_map(|(_, proofs)| proofs.iter())
205+
.values()
214206
.map(|proof| proof.wits_in_evals.len().max(1))
215207
.collect::<Vec<_>>();
216208
let fixed_num_vars = self
217209
.chip_proofs
218-
.iter()
219-
.flat_map(|(_, proofs)| proofs.iter())
210+
.values()
220211
.filter(|proof| !proof.fixed_in_evals.is_empty())
221212
.map(|proof| proof.num_vars)
222213
.collect::<Vec<_>>();
223214
let fixed_max_widths = self
224215
.chip_proofs
225-
.iter()
226-
.flat_map(|(_, proofs)| proofs.iter())
216+
.values()
227217
.filter(|proof| !proof.fixed_in_evals.is_empty())
228218
.map(|proof| proof.fixed_in_evals.len())
229219
.collect::<Vec<_>>();
@@ -261,8 +251,8 @@ impl Hintable<InnerConfig> for ZKVMProofInput {
261251
stream.extend(raw_pi_num_variables.write());
262252
stream.extend(self.pi_evals.write());
263253
stream.extend(vec![vec![F::from_canonical_usize(self.chip_proofs.len())]]);
264-
for proofs in self.chip_proofs.values() {
265-
stream.extend(proofs.write());
254+
for proof in self.chip_proofs.values() {
255+
stream.extend(proof.write());
266256
}
267257
stream.extend(<usize as Hintable<InnerConfig>>::write(&max_num_var));
268258
stream.extend(<usize as Hintable<InnerConfig>>::write(&max_width));
@@ -404,35 +394,6 @@ pub struct ZKVMChipProofInput {
404394

405395
impl VecAutoHintable for ZKVMChipProofInput {}
406396

407-
/// wrapper struct to allow us implement VecAutoHintable
408-
pub struct ZKVMChipProofs(Vec<ZKVMChipProofInput>);
409-
410-
impl From<Vec<ZKVMChipProofInput>> for ZKVMChipProofs {
411-
fn from(v: Vec<ZKVMChipProofInput>) -> Self {
412-
Self(v)
413-
}
414-
}
415-
416-
impl VecAutoHintable for ZKVMChipProofs {}
417-
418-
impl ZKVMChipProofs {
419-
pub fn iter(&self) -> std::slice::Iter<'_, ZKVMChipProofInput> {
420-
self.0.iter()
421-
}
422-
}
423-
424-
impl Hintable<InnerConfig> for ZKVMChipProofs {
425-
type HintVariable = Array<InnerConfig, ZKVMChipProofInputVariable<InnerConfig>>;
426-
427-
fn read(builder: &mut Builder<InnerConfig>) -> Self::HintVariable {
428-
Vec::<ZKVMChipProofInput>::read(builder)
429-
}
430-
431-
fn write(&self) -> Vec<Vec<<InnerConfig as Config>::N>> {
432-
self.0.write()
433-
}
434-
}
435-
436397
impl From<(usize, ZKVMChipProof<E>, usize, usize)> for ZKVMChipProofInput {
437398
fn from(d: (usize, ZKVMChipProof<E>, usize, usize)) -> Self {
438399
let idx = d.0;

0 commit comments

Comments
 (0)