Skip to content

Commit 042c7a4

Browse files
committed
observed num_instance within per-chip fork
1 parent 1209a30 commit 042c7a4

3 files changed

Lines changed: 15 additions & 61 deletions

File tree

ceno_recursion/src/zkvm_verifier/verifier.rs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -166,22 +166,6 @@ pub fn verify_zkvm_proof<C: Config<F = F>>(
166166
);
167167
challenger.observe(builder, log2_max_codeword_size_felt);
168168

169-
iter_zip!(builder, zkvm_proof_input.chip_proofs).for_each(|ptr_vec, builder| {
170-
let chip_proofs = builder.iter_ptr_get(&zkvm_proof_input.chip_proofs, ptr_vec[0]);
171-
let chip_idx = builder.get(&chip_proofs, 0).idx_felt;
172-
challenger.observe(builder, chip_idx);
173-
174-
iter_zip!(builder, chip_proofs).for_each(|ptr_vec, builder| {
175-
let chip_proof = builder.iter_ptr_get(&chip_proofs, ptr_vec[0]);
176-
177-
iter_zip!(builder, chip_proof.num_instances).for_each(|ptr_vec, builder| {
178-
let num_instance = builder.iter_ptr_get(&chip_proof.num_instances, ptr_vec[0]);
179-
let num_instance = builder.unsafe_cast_var_to_felt(num_instance);
180-
challenger.observe(builder, num_instance);
181-
});
182-
});
183-
});
184-
185169
let alpha = challenger.sample_ext(builder);
186170
let beta = challenger.sample_ext(builder);
187171

@@ -266,6 +250,11 @@ pub fn verify_zkvm_proof<C: Config<F = F>>(
266250
Usize::from(circuit_vk.get_cs().num_lks() * 4),
267251
);
268252
chip_challenger.observe(builder, chip_proof.idx_felt);
253+
iter_zip!(builder, chip_proof.num_instances).for_each(|ptr_vec, builder| {
254+
let num_instance = builder.iter_ptr_get(&chip_proof.num_instances, ptr_vec[0]);
255+
let num_instance = builder.unsafe_cast_var_to_felt(num_instance);
256+
chip_challenger.observe(builder, num_instance);
257+
});
269258

270259
// getting the number of dummy padding item that we used in this opcode circuit
271260
let num_lks: Var<C::N> =

ceno_zkvm/src/scheme/prover.rs

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -177,33 +177,6 @@ impl<
177177
// Extract chip metadata before consuming witnesses.
178178
// We reuse this for both transcript appends and task construction.
179179
let name_and_instances = witnesses.get_witnesses_name_instance();
180-
let transcript_instances = name_and_instances.iter().try_fold(
181-
Vec::new(),
182-
|mut acc, (name, num_instances)| -> Result<_, ZKVMError> {
183-
let pk = self.pk.circuit_pks.get(name).ok_or(ZKVMError::VKNotFound(
184-
format!("proving key for circuit {} not found", name).into(),
185-
))?;
186-
187-
// Skip OMC-init-only circuits in non-first shards.
188-
if !shard_ctx.is_first_shard() && pk.get_cs().with_omc_init_only() {
189-
return Ok(acc);
190-
}
191-
192-
if num_instances.iter().sum::<usize>() == 0 {
193-
return Ok(acc);
194-
}
195-
196-
let circuit_idx = self.pk.circuit_name_to_index.get(name).copied().ok_or(
197-
ZKVMError::VKNotFound(
198-
format!("circuit index for {} not found", name).into(),
199-
),
200-
)?;
201-
202-
acc.push((circuit_idx, *num_instances));
203-
Ok(acc)
204-
},
205-
)?;
206-
207180
let mut structural_rmms = Vec::with_capacity(name_and_instances.len());
208181
// commit to opcode circuits first and then commit to table circuits, sorted by name
209182
for (i, chip_input) in witnesses.into_iter_sorted().enumerate() {
@@ -248,15 +221,6 @@ impl<
248221
PCS::write_commitment(&witin_commit, &mut transcript).map_err(ZKVMError::PCSError)?;
249222
exit_span!(commit_to_traces_span);
250223

251-
// Write (circuit_idx, num_instances) after all commitments are absorbed.
252-
for (circuit_idx, num_instances) in &transcript_instances {
253-
transcript.append_field_element(&E::BaseField::from_canonical_usize(*circuit_idx));
254-
for num_instance in num_instances {
255-
transcript
256-
.append_field_element(&E::BaseField::from_canonical_usize(*num_instance));
257-
}
258-
}
259-
260224
// Use pre-loaded fixed_mles (extracted before in_scope to avoid lifetime issues)
261225
let fixed_mles = fixed_mles_preload;
262226

@@ -360,6 +324,10 @@ impl<
360324
transcript.append_field_element(&E::BaseField::from_canonical_u64(
361325
task.circuit_idx as u64,
362326
));
327+
for num_instance in task.input.num_instances {
328+
transcript
329+
.append_field_element(&E::BaseField::from_canonical_usize(num_instance));
330+
}
363331

364332
// SAFETY: TypeId check above (before closure) guarantees PB = GpuBackend<E, PCS>.
365333
let gpu_input: ProofInput<'static, gkr_iop::gpu::GpuBackend<E, PCS>> =
@@ -396,6 +364,9 @@ impl<
396364
// Append circuit_idx to per-task forked transcript (matching verifier)
397365
transcript
398366
.append_field_element(&E::BaseField::from_canonical_u64(task.circuit_idx as u64));
367+
for num_instance in task.input.num_instances {
368+
transcript.append_field_element(&E::BaseField::from_canonical_usize(num_instance));
369+
}
399370

400371
// Prepare: deferred extraction for GPU, no-op for CPU
401372
self.device.prepare_chip_input(&mut task, witness_data);

ceno_zkvm/src/scheme/verifier.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,6 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
252252
PCS::write_commitment(&vm_proof.witin_commit, &mut transcript)
253253
.map_err(ZKVMError::PCSError)?;
254254

255-
// write (circuit_idx, num_instance) to transcript
256-
for (circuit_idx, proofs) in vm_proof.chip_proofs.iter() {
257-
transcript.append_field_element(&E::BaseField::from_canonical_u32(*circuit_idx as u32));
258-
// length of proof.num_instances will be constrained in verify_chip_proof
259-
for num_instance in proofs.iter().flat_map(|proof| &proof.num_instances) {
260-
transcript.append_field_element(&E::BaseField::from_canonical_usize(*num_instance));
261-
}
262-
}
263-
264255
#[cfg(debug_assertions)]
265256
{
266257
Instrumented::<<<E as ExtensionField>::BaseField as PoseidonField>::P>::log_label(
@@ -353,6 +344,9 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
353344
.sum::<E>();
354345

355346
transcript.append_field_element(&E::BaseField::from_canonical_u64(*index as u64));
347+
for num_instance in &proof.num_instances {
348+
transcript.append_field_element(&E::BaseField::from_canonical_usize(*num_instance));
349+
}
356350

357351
// compute logup_sum padding
358352
// getting the number of dummy padding item that we used in this opcode circuit

0 commit comments

Comments
 (0)