Skip to content

Commit a4bdf61

Browse files
committed
wip
1 parent dafe24f commit a4bdf61

File tree

3 files changed

+51
-17
lines changed

3 files changed

+51
-17
lines changed

ceno_zkvm/src/instructions/riscv/ecall/keccak.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use gkr_iop::{
77
gkr::GKRCircuit,
88
precompiles::{
99
KECCAK_INPUT32_SIZE, KECCAK_WIT_SIZE, KeccakInOutCols, KeccakInstance, KeccakLayout,
10-
KeccakStateInstance, KeccakTrace, KeccakWitInstance,
10+
KeccakNonZeroOutEval, KeccakStateInstance, KeccakTrace, KeccakWitInstance,
1111
},
1212
};
1313
use itertools::Itertools;
@@ -63,8 +63,11 @@ impl<E: ExtensionField> Instruction<E> for KeccakInstruction<E> {
6363
cb: &mut CircuitBuilder<E>,
6464
_params: &ProgramParams,
6565
) -> Result<Self::InstructionConfig, ZKVMError> {
66+
let mut non_zero_out_eval = KeccakNonZeroOutEval::default();
6667
// constrain vmstate
6768
let vm_state = StateInOut::construct_circuit(cb, false)?;
69+
non_zero_out_eval.state_in = cb.cs.r_expressions.len() - 1;
70+
non_zero_out_eval.state_out = cb.cs.w_expressions.len() - 1;
6871

6972
let ecall_id_value = UInt::new_unchecked(|| "ecall_id", cb)?;
7073
let state_ptr_value = UInt::new_unchecked(|| "state_ptr", cb)?;
@@ -74,11 +77,15 @@ impl<E: ExtensionField> Instruction<E> for KeccakInstruction<E> {
7477
ecall_id_value.register_expr(),
7578
vm_state.ts,
7679
)?;
80+
non_zero_out_eval.ecall_id_read_record = cb.cs.r_expressions.len() - 1;
81+
non_zero_out_eval.ecall_id_write_record = cb.cs.w_expressions.len() - 1;
7782
let state_ptr = WriteFixedRS::<_, { Platform::reg_arg0() }>::construct_circuit(
7883
cb,
7984
state_ptr_value.register_expr(),
8085
vm_state.ts,
8186
)?;
87+
non_zero_out_eval.state_ptr_read_record = cb.cs.r_expressions.len() - 1;
88+
non_zero_out_eval.state_ptr_write_record = cb.cs.w_expressions.len() - 1;
8289

8390
// fetch
8491
cb.lk_fetch(&InsnRecord::new(
@@ -107,9 +114,14 @@ impl<E: ExtensionField> Instruction<E> for KeccakInstruction<E> {
107114
.map(|writer| (Change::new(val_before, val_after), writer))
108115
})
109116
.collect::<Result<Vec<(Change<WitIn>, WriteMEM)>, _>>()?;
117+
non_zero_out_eval.mem_read_record =
118+
array::from_fn(|i| cb.cs.r_expressions.len() - KECCAK_INPUT32_SIZE + i);
119+
non_zero_out_eval.mem_write_record =
120+
array::from_fn(|i| cb.cs.w_expressions.len() - KECCAK_INPUT32_SIZE + i);
110121

111122
// construct keccak gkr-iop circuit
112123
let params = gkr_iop::precompiles::KeccakParams {
124+
non_zero_out_eval,
113125
io: KeccakInOutCols {
114126
input32: array::from_fn(|i| mem_rw[i].0.before.expr()),
115127
output32: array::from_fn(|i| mem_rw[i].0.after.expr()),

gkr_iop/src/precompiles/lookup_keccakf.rs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,37 @@ pub struct KeccakInOutCols<T> {
103103
pub input32: [T; KECCAK_INPUT32_SIZE],
104104
}
105105

106+
#[derive(Clone, Debug)]
107+
#[repr(C)]
108+
pub struct KeccakNonZeroOutEval<T> {
109+
pub state_in: T,
110+
pub state_out: T,
111+
pub ecall_id_read_record: T,
112+
pub ecall_id_write_record: T,
113+
pub state_ptr_read_record: T,
114+
pub state_ptr_write_record: T,
115+
pub mem_read_record: [T; KECCAK_INPUT32_SIZE],
116+
pub mem_write_record: [T; KECCAK_OUTPUT32_SIZE],
117+
}
118+
119+
impl<T: Default + Copy> Default for KeccakNonZeroOutEval<T> {
120+
fn default() -> Self {
121+
Self {
122+
state_in: Default::default(),
123+
state_out: Default::default(),
124+
ecall_id_read_record: Default::default(),
125+
ecall_id_write_record: Default::default(),
126+
state_ptr_read_record: Default::default(),
127+
state_ptr_write_record: Default::default(),
128+
mem_read_record: [T::default(); KECCAK_INPUT32_SIZE],
129+
mem_write_record: [T::default(); KECCAK_OUTPUT32_SIZE],
130+
}
131+
}
132+
}
133+
106134
#[derive(Clone, Debug)]
107135
pub struct KeccakParams<T> {
136+
pub non_zero_out_eval: KeccakNonZeroOutEval<usize>,
108137
pub io: KeccakInOutCols<T>,
109138
}
110139

@@ -185,12 +214,12 @@ impl<E: ExtensionField> KeccakLayout<E> {
185214
): (KeccakWitCols<WitIn>, KeccakFixedCols<Fixed>, [WitIn; 6]) = unsafe {
186215
(
187216
transmute::<[WitIn; KECCAK_WIT_SIZE], KeccakWitCols<WitIn>>(array::from_fn(|id| {
188-
cb.create_witin(|| format!("lookup/witin_{}", id))
217+
cb.create_witin(|| format!("keccak/witin_{}", id))
189218
})),
190219
transmute::<[Fixed; 8], KeccakFixedCols<Fixed>>(array::from_fn(|id| {
191-
cb.create_fixed(|| format!("lookup/fixed_{}", id))
220+
cb.create_fixed(|| format!("keccak/fixed_{}", id))
192221
})),
193-
array::from_fn(|id| cb.create_witin(|| format!("lookup/eq_{}", id))),
222+
array::from_fn(|id| cb.create_witin(|| format!("keccak/eq_{}", id))),
194223
)
195224
};
196225

@@ -221,16 +250,8 @@ impl<E: ExtensionField> ProtocolBuilder<E> for KeccakLayout<E> {
221250
Self::new(cb, params)
222251
}
223252

224-
fn build_gkr_chip(&self, _cb: &mut CircuitBuilder<E>) -> Result<Chip<E>, CircuitBuilderError> {
225-
// let mut system = LayerConstraintSystem::new(
226-
// KECCAK_WIT_SIZE,
227-
// 0,
228-
// KECCAK_WIT_SIZE,
229-
// Some(self.layer_exprs.eq_zero.expr()),
230-
// self.alpha.clone(),
231-
// self.beta.clone(),
232-
// );
233-
let system = _cb;
253+
fn build_gkr_chip(&self, cb: &mut CircuitBuilder<E>) -> Result<Chip<E>, CircuitBuilderError> {
254+
let system = cb;
234255

235256
let KeccakInOutCols {
236257
output32: output32_expr,
@@ -856,6 +877,7 @@ pub fn setup_gkr_circuit<E: ExtensionField>()
856877
let output_value: [WitIn; KECCAK_OUTPUT32_SIZE] =
857878
array::from_fn(|i| circuit_builder.create_witin(|| format!("output_value/{i}")));
858879
let params = KeccakParams {
880+
non_zero_out_eval: Default::default(),
859881
io: KeccakInOutCols {
860882
input32: input_value.map(|e| e.expr()),
861883
output32: output_value.map(|e| e.expr()),

gkr_iop/src/precompiles/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ mod lookup_keccakf;
33
mod utils;
44
pub use lookup_keccakf::{
55
AND_LOOKUPS, KECCAK_INPUT32_SIZE, KECCAK_OUT_EVAL_SIZE, KECCAK_WIT_SIZE, KeccakInOutCols,
6-
KeccakInstance, KeccakLayout, KeccakParams, KeccakStateInstance, KeccakTrace,
7-
KeccakWitInstance, RANGE_LOOKUPS, ROUNDS as KECCAK_ROUNDS, XOR_LOOKUPS, run_faster_keccakf,
8-
setup_gkr_circuit as setup_lookup_keccak_gkr_circuit,
6+
KeccakInstance, KeccakLayout, KeccakNonZeroOutEval, KeccakParams, KeccakStateInstance,
7+
KeccakTrace, KeccakWitInstance, RANGE_LOOKUPS, ROUNDS as KECCAK_ROUNDS, XOR_LOOKUPS,
8+
run_faster_keccakf, setup_gkr_circuit as setup_lookup_keccak_gkr_circuit,
99
};
1010

1111
pub use bitwise_keccakf::{

0 commit comments

Comments
 (0)