Skip to content

Commit 77c289e

Browse files
committed
gkr_iop config attempt (wip)
1 parent 5e18d9a commit 77c289e

File tree

10 files changed

+111
-19
lines changed

10 files changed

+111
-19
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ceno_zkvm/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ serde_json.workspace = true
1919
base64 = "0.22"
2020
ceno_emul = { path = "../ceno_emul" }
2121
ff_ext = { path = "../ff_ext" }
22+
gkr_iop = { path = "../gkr_iop" }
2223
mpcs = { path = "../mpcs" }
2324
multilinear_extensions = { version = "0", path = "../multilinear_extensions" }
2425
p3 = { path = "../p3" }

ceno_zkvm/src/instructions/riscv.rs

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub mod jump;
1818
pub mod logic;
1919
pub mod logic_imm;
2020
pub mod mul;
21+
pub mod precompiles;
2122
pub mod shift;
2223
pub mod shift_imm;
2324
pub mod slt;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
use std::{cell::RefCell, marker::PhantomData, sync::RwLock};
2+
3+
use ceno_emul::{Change, InsnKind, KECCAK_WORDS, StepRecord, WORD_SIZE};
4+
use ff_ext::ExtensionField;
5+
use itertools::Itertools;
6+
7+
use super::super::insn_base::WriteMEM;
8+
use crate::{
9+
Value,
10+
circuit_builder::CircuitBuilder,
11+
error::ZKVMError,
12+
expression::{ToExpr, WitIn},
13+
instructions::{
14+
Instruction,
15+
riscv::{constants::UInt, insn_base::WriteRD},
16+
},
17+
set_val,
18+
witness::LkMultiplicity,
19+
};
20+
21+
use gkr_iop::{
22+
ProtocolBuilder, ProtocolWitnessGenerator,
23+
chip::Chip,
24+
gkr::GKRCircuit,
25+
precompiles::{KeccakLayout, KeccakParams},
26+
};
27+
28+
pub struct KeccakF<E>(PhantomData<E>);
29+
pub struct KeccakFConfig<E> {
30+
chip: Chip,
31+
layout: KeccakLayout<E>,
32+
gkr_circuit: GKRCircuit,
33+
phase1_wits:
34+
}
35+
36+
impl<E: ExtensionField> Instruction<E> for KeccakF<E> {
37+
type InstructionConfig = KeccakFConfig<E>;
38+
39+
fn name() -> String {
40+
format!("keccakf")
41+
}
42+
43+
fn construct_circuit(cb: &mut CircuitBuilder<E>) -> Result<Self::InstructionConfig, ZKVMError> {
44+
let params = KeccakParams {};
45+
let (layout, chip) = KeccakLayout::build(params);
46+
let gkr_circuit = chip.gkr_circuit();
47+
48+
Ok(KeccakFConfig {
49+
chip,
50+
layout,
51+
gkr_circuit,
52+
phase1_wits:
53+
})
54+
}
55+
56+
fn assign_instance(
57+
config: &Self::InstructionConfig,
58+
instance: &mut [E::BaseField],
59+
lk_multiplicity: &mut LkMultiplicity,
60+
step: &StepRecord,
61+
) -> Result<(), ZKVMError> {
62+
// let ops = &step.syscall().expect("syscall step");
63+
64+
// // Assign instruction.
65+
// config
66+
// .dummy_insn
67+
// .assign_instance(instance, lk_multiplicity, step)?;
68+
69+
// set_val!(instance, config.start_addr, u64::from(ops.mem_ops[0].addr));
70+
71+
// // Assign registers.
72+
// for ((value, writer), op) in config.reg_writes.iter().zip_eq(&ops.reg_ops) {
73+
// value.assign_value(instance, Value::new_unchecked(op.value.after));
74+
// writer.assign_op(instance, lk_multiplicity, step.cycle(), op)?;
75+
// }
76+
77+
// // Assign memory.
78+
// for ((value, writer), op) in config.mem_writes.iter().zip_eq(&ops.mem_ops) {
79+
// set_val!(instance, value.before, op.value.before as u64);
80+
// set_val!(instance, value.after, op.value.after as u64);
81+
// writer.assign_op(instance, lk_multiplicity, step.cycle(), op)?;
82+
// }
83+
84+
Ok(())
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod keccakf_circuit;

gkr_iop/src/chip/protocol.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ use super::Chip;
44

55
impl Chip {
66
/// Extract information from Chip that required in the GKR phase.
7-
pub fn gkr_circuit(&'_ self) -> GKRCircuit<'_> {
7+
pub fn gkr_circuit(&self) -> GKRCircuit {
88
GKRCircuit {
9-
layers: &self.layers,
9+
layers: self.layers.clone(),
1010
n_challenges: self.n_challenges,
1111
n_evaluations: self.n_evaluations,
12-
base_openings: &self.base_openings,
13-
ext_openings: &self.ext_openings,
12+
base_openings: self.base_openings.clone(),
13+
ext_openings: self.ext_openings.clone(),
1414
}
1515
}
1616
}

gkr_iop/src/gkr.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ff_ext::ExtensionField;
2-
use itertools::{Itertools, chain, izip};
2+
use itertools::{chain, izip, Itertools};
33
use layer::{Layer, LayerWitness};
44
use subprotocols::{expression::Point, sumcheck::SumcheckProof};
55
use transcript::Transcript;
@@ -13,13 +13,13 @@ pub mod layer;
1313
pub mod mock;
1414

1515
#[derive(Clone, Debug)]
16-
pub struct GKRCircuit<'a> {
17-
pub layers: &'a [Layer],
16+
pub struct GKRCircuit {
17+
pub layers: Vec<Layer>,
1818

1919
pub n_challenges: usize,
2020
pub n_evaluations: usize,
21-
pub base_openings: &'a [(usize, EvalExpression)],
22-
pub ext_openings: &'a [(usize, EvalExpression)],
21+
pub base_openings: Vec<(usize, EvalExpression)>,
22+
pub ext_openings: Vec<(usize, EvalExpression)>,
2323
}
2424

2525
#[derive(Clone, Debug)]
@@ -42,7 +42,7 @@ pub struct Evaluation<E: ExtensionField> {
4242

4343
pub struct GKRClaims<Evaluation>(pub Vec<Evaluation>);
4444

45-
impl GKRCircuit<'_> {
45+
impl GKRCircuit {
4646
pub fn prove<E>(
4747
&self,
4848
circuit_wit: GKRCircuitWitness<E>,
@@ -56,7 +56,7 @@ impl GKRCircuit<'_> {
5656
let mut evaluations = out_evals.to_vec();
5757
evaluations.resize(self.n_evaluations, PointAndEval::default());
5858
let mut challenges = challenges.to_vec();
59-
let sumcheck_proofs = izip!(self.layers, circuit_wit.layers)
59+
let sumcheck_proofs = izip!(&self.layers, circuit_wit.layers)
6060
.map(|(layer, layer_wit)| {
6161
layer.prove(layer_wit, &mut evaluations, &mut challenges, transcript)
6262
})
@@ -85,7 +85,7 @@ impl GKRCircuit<'_> {
8585
let mut challenges = challenges.to_vec();
8686
let mut evaluations = out_evals.to_vec();
8787
evaluations.resize(self.n_evaluations, PointAndEval::default());
88-
for (layer, layer_proof) in izip!(self.layers, sumcheck_proofs) {
88+
for (layer, layer_proof) in izip!(self.layers.clone(), sumcheck_proofs) {
8989
layer.verify(layer_proof, &mut evaluations, &mut challenges, transcript)?;
9090
}
9191

@@ -99,7 +99,7 @@ impl GKRCircuit<'_> {
9999
evaluations: &[PointAndEval<E>],
100100
challenges: &[E],
101101
) -> Vec<Evaluation<E>> {
102-
chain!(self.base_openings, self.ext_openings)
102+
chain!(&self.base_openings, &self.ext_openings)
103103
.map(|(poly, eval)| {
104104
let poly = *poly;
105105
let PointAndEval { point, eval: value } = eval.evaluate(evaluations, challenges);

gkr_iop/src/gkr/mock.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::marker::PhantomData;
22

33
use ff_ext::ExtensionField;
4-
use itertools::{Itertools, izip};
4+
use itertools::{izip, Itertools};
55
use rand::rngs::OsRng;
66
use subprotocols::{
77
expression::{Expression, VectorType},
@@ -12,7 +12,7 @@ use thiserror::Error;
1212

1313
use crate::{evaluation::EvalExpression, utils::SliceIterator};
1414

15-
use super::{GKRCircuit, GKRCircuitWitness, layer::LayerType};
15+
use super::{layer::LayerType, GKRCircuit, GKRCircuitWitness};
1616

1717
pub struct MockProver<E: ExtensionField>(PhantomData<E>);
1818

@@ -35,7 +35,7 @@ pub enum MockProverError<F: ExtensionField> {
3535

3636
impl<E: ExtensionField> MockProver<E> {
3737
pub fn check(
38-
circuit: GKRCircuit<'_>,
38+
circuit: GKRCircuit,
3939
circuit_wit: &GKRCircuitWitness<E>,
4040
mut evaluations: Vec<VectorType<E>>,
4141
mut challenges: Vec<E>,

gkr_iop/src/precompiles/faster_keccak.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ use transcript::BasicTranscript;
3131
type E = BinomialExtensionField<Goldilocks, 2>;
3232

3333
#[derive(Clone, Debug, Default)]
34-
struct KeccakParams {}
34+
pub struct KeccakParams {}
3535

3636
#[derive(Clone, Debug, Default)]
37-
struct KeccakLayout<E> {
37+
pub struct KeccakLayout<E> {
3838
params: KeccakParams,
3939

4040
committed_bits_id: usize,

gkr_iop/src/precompiles/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
mod faster_keccak;
22
mod keccak_f;
33
mod utils;
4-
pub use faster_keccak::run_faster_keccakf;
54
pub use keccak_f::run_keccakf;
5+
pub use {
6+
faster_keccak::run_faster_keccakf, faster_keccak::KeccakLayout, faster_keccak::KeccakParams,
7+
};

0 commit comments

Comments
 (0)