Skip to content

Commit a210d89

Browse files
committed
key gen with entry pc
1 parent 146ef72 commit a210d89

File tree

6 files changed

+37
-10
lines changed

6 files changed

+37
-10
lines changed

ceno_zkvm/benches/riscv_add.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn bench_add(c: &mut Criterion) {
5555

5656
let pk = zkvm_cs
5757
.clone()
58-
.key_gen::<Pcs>(pp, vp, zkvm_fixed_traces)
58+
.key_gen::<Pcs>(pp, vp, 0, zkvm_fixed_traces)
5959
.expect("keygen failed");
6060

6161
let (max_num_variables, security_level) = default_backend_config();

ceno_zkvm/src/e2e.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,12 @@ impl<E: ExtensionField> E2EProgramCtx<'_, E> {
895895
.system_config
896896
.zkvm_cs
897897
.clone()
898-
.key_gen::<PCS>(pp.clone(), vp.clone(), self.zkvm_fixed_traces.clone())
898+
.key_gen::<PCS>(
899+
pp.clone(),
900+
vp.clone(),
901+
self.program.entry,
902+
self.zkvm_fixed_traces.clone(),
903+
)
899904
.expect("keygen failed");
900905
let vk = pk.get_vk_slow();
901906
(pk, vk)
@@ -915,6 +920,7 @@ impl<E: ExtensionField> E2EProgramCtx<'_, E> {
915920
.key_gen::<PCS>(
916921
pb.get_pp().clone(),
917922
pb.get_vp().clone(),
923+
self.program.entry,
918924
self.zkvm_fixed_traces.clone(),
919925
)
920926
.expect("keygen failed");

ceno_zkvm/src/keygen.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ impl<E: ExtensionField> ZKVMConstraintSystem<E> {
1212
self,
1313
pp: PCS::ProverParam,
1414
vp: PCS::VerifierParam,
15+
entry_pc: u32,
1516
mut vm_fixed_traces: ZKVMFixedTraces<E>,
1617
) -> Result<ZKVMProvingKey<E, PCS>, ZKVMError> {
1718
let mut vm_pk = ZKVMProvingKey::new(pp.clone(), vp);
@@ -41,6 +42,8 @@ impl<E: ExtensionField> ZKVMConstraintSystem<E> {
4142
vm_pk.initial_global_state_expr = self.initial_global_state_expr;
4243
vm_pk.finalize_global_state_expr = self.finalize_global_state_expr;
4344

45+
vm_pk.set_program_entry_pc(entry_pc);
46+
4447
Ok(vm_pk)
4548
}
4649
}

ceno_zkvm/src/scheme/tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ fn test_rw_lk_expression_combination() {
132132
.key_gen::<Pcs>(
133133
device.backend.pp.clone(),
134134
device.backend.vp.clone(),
135+
0,
135136
zkvm_fixed_traces,
136137
)
137138
.unwrap();
@@ -308,7 +309,7 @@ fn test_single_add_instance_e2e() {
308309

309310
let pk = zkvm_cs
310311
.clone()
311-
.key_gen::<Pcs>(pp, vp, zkvm_fixed_traces)
312+
.key_gen::<Pcs>(pp, vp, program.entry, zkvm_fixed_traces)
312313
.expect("keygen failed");
313314
let vk = pk.get_vk_slow();
314315

ceno_zkvm/src/scheme/verifier.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ff_ext::{Instrumented, PoseidonField};
88
use super::{ZKVMChipProof, ZKVMProof};
99
use crate::{
1010
error::ZKVMError,
11-
instructions::riscv::constants::{INIT_PC_IDX, SHARD_ID_IDX},
11+
instructions::riscv::constants::{END_PC_IDX, INIT_CYCLE_IDX, INIT_PC_IDX, SHARD_ID_IDX},
1212
scheme::constants::NUM_FANIN,
1313
structs::{ComposedConstrainSystem, PointAndEval, TowerProofs, VerifyingKey, ZKVMVerifyingKey},
1414
};
@@ -84,13 +84,13 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
8484
let _logup_sum = E::ZERO;
8585
assert!(!vm_proofs.is_empty());
8686
let num_proofs = vm_proofs.len();
87-
vm_proofs
87+
let _end_pc = vm_proofs
8888
.into_iter()
8989
.zip_eq(transcripts)
9090
// optionally halt on last chunk
9191
.zip_eq(iter::repeat_n(false, num_proofs - 1).chain(iter::once(expect_halt)))
9292
.enumerate()
93-
.try_for_each(|(shard_id, ((vm_proof, transcript), expect_halt))| {
93+
.try_fold(None, |prev_pc, (shard_id, ((vm_proof, transcript), expect_halt))| {
9494
// require ecall/halt proof to exist, depend on whether we expect a halt.
9595
let has_halt = vm_proof.has_halt(&self.vk);
9696
if has_halt != expect_halt {
@@ -101,12 +101,19 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
101101
.into(),
102102
));
103103
}
104-
// TODO check init ts = 4
105-
// TODO check init_pc match prev end_pc
104+
// check init cycle = 4
105+
assert_eq!(vm_proof.pi_evals[INIT_CYCLE_IDX], E::from_canonical_usize(4));
106+
// check init_pc match prev end_pc
107+
if let Some(prev_pc) = prev_pc {
108+
assert_eq!(vm_proof.pi_evals[INIT_PC_IDX], prev_pc);
109+
} else {
110+
// first chunk, check program entry
111+
assert_eq!(vm_proof.pi_evals[INIT_PC_IDX], E::from_canonical_u32(self.vk.entry_pc));
112+
}
113+
let end_pc = vm_proof.pi_evals[END_PC_IDX];
106114
// TODO add to global ec
107115
let _shard_ram_bus = self.verify_proof_validity(shard_id, vm_proof, transcript)?;
108-
109-
Ok(())
116+
Ok(Some(end_pc))
110117
})?;
111118
// TODO check global ec_sum == 0
112119
Ok(true)

ceno_zkvm/src/structs.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ impl<E: ExtensionField> ZKVMWitnesses<E> {
409409
pub struct ZKVMProvingKey<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> {
410410
pub pp: PCS::ProverParam,
411411
pub vp: PCS::VerifierParam,
412+
// entry program counter
413+
pub entry_pc: u32,
412414
// pk for opcode and table circuits
413415
pub circuit_pks: BTreeMap<String, ProvingKey<E>>,
414416
pub fixed_commit_wd: Option<Arc<<PCS as PolynomialCommitmentScheme<E>>::CommitmentWithWitness>>,
@@ -425,6 +427,7 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMProvingKey<E, PC
425427
Self {
426428
pp,
427429
vp,
430+
entry_pc: 0,
428431
circuit_pks: BTreeMap::new(),
429432
initial_global_state_expr: Expression::ZERO,
430433
finalize_global_state_expr: Expression::ZERO,
@@ -451,12 +454,17 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMProvingKey<E, PC
451454
}
452455
Ok(())
453456
}
457+
458+
pub(crate) fn set_program_entry_pc(&mut self, entry_pc: u32) {
459+
self.entry_pc = entry_pc;
460+
}
454461
}
455462

456463
impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMProvingKey<E, PCS> {
457464
pub fn get_vk_slow(&self) -> ZKVMVerifyingKey<E, PCS> {
458465
ZKVMVerifyingKey {
459466
vp: self.vp.clone(),
467+
entry_pc: self.entry_pc,
460468
circuit_vks: self
461469
.circuit_pks
462470
.iter()
@@ -483,6 +491,8 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMProvingKey<E, PC
483491
))]
484492
pub struct ZKVMVerifyingKey<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> {
485493
pub vp: PCS::VerifierParam,
494+
// entry program counter
495+
pub entry_pc: u32,
486496
// vk for opcode and table circuits
487497
pub circuit_vks: BTreeMap<String, VerifyingKey<E>>,
488498
pub fixed_commit: Option<<PCS as PolynomialCommitmentScheme<E>>::Commitment>,

0 commit comments

Comments
 (0)