diff --git a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp.rs b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp.rs index 618658847..8f025d9cf 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp.rs @@ -7,8 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::typenum::Unsigned; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -291,9 +290,7 @@ fn build_fp_op_circuit( .collect::, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - let layer = Layer::from_circuit_builder(cb, layer_name.to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize(layer_name.to_string(), cb); Ok(( EcallFpOpConfig { diff --git a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_add.rs b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_add.rs index 583058357..1bf07548d 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_add.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_add.rs @@ -6,8 +6,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::typenum::Unsigned; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -209,9 +208,7 @@ fn build_fp2_add_circuit, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - let layer = Layer::from_circuit_builder(cb, "fp2_add".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("fp2_add".to_string(), cb); Ok(( EcallFp2AddConfig { diff --git a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_mul.rs b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_mul.rs index bfcf118d3..563b63599 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_mul.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/fptower_fp2_mul.rs @@ -6,8 +6,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::typenum::Unsigned; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -207,9 +206,7 @@ fn build_fp2_mul_circuit, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - let layer = Layer::from_circuit_builder(cb, "fp2_mul".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("fp2_mul".to_string(), cb); Ok(( EcallFp2MulConfig { diff --git a/ceno_zkvm/src/instructions/riscv/ecall/keccak.rs b/ceno_zkvm/src/instructions/riscv/ecall/keccak.rs index b5adda675..b130e9c11 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/keccak.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/keccak.rs @@ -7,7 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use gkr_iop::{ ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, booleanhypercube::BooleanHypercube, layer::Layer}, + gkr::{GKRCircuit, booleanhypercube::BooleanHypercube}, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -132,10 +132,7 @@ impl Instruction for KeccakInstruction { }) .collect::, _>>()?; - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, Self::name(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize(Self::name(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/instructions/riscv/ecall/sha_extend.rs b/ceno_zkvm/src/instructions/riscv/ecall/sha_extend.rs index bd9253a97..f9e143e3d 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/sha_extend.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/sha_extend.rs @@ -5,8 +5,7 @@ use ceno_emul::{ }; use ff_ext::{ExtensionField, FieldInto}; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -130,10 +129,7 @@ impl Instruction for ShaExtendInstruction { vm_state.ts, )?); - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, Self::name(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize(Self::name(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/instructions/riscv/ecall/uint256.rs b/ceno_zkvm/src/instructions/riscv/ecall/uint256.rs index 83fdba78a..fae2bb342 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/uint256.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/uint256.rs @@ -7,8 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::typenum::Unsigned; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, chain, izip}; @@ -177,10 +176,7 @@ impl Instruction for Uint256MulInstruction { .collect::, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, "uint256_mul".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("uint256_mul".to_string(), cb); let circuit = chip.gkr_circuit(); @@ -501,10 +497,7 @@ impl Instruction for Uint256InvInstr }) .collect::, _>>()?; - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, Spec::name(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize(Spec::name(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_add.rs b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_add.rs index e5e1566e2..e8687f7f9 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_add.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_add.rs @@ -7,8 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::{GenericArray, typenum::Unsigned}; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -177,10 +176,7 @@ impl Instruction .collect::, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, "weierstrass_add".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_add".to_string(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_decompress.rs b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_decompress.rs index efead1b9e..f211e9afb 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_decompress.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_decompress.rs @@ -7,8 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::{GenericArray, typenum::Unsigned}; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -178,11 +177,7 @@ impl Instruction, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = - Layer::from_circuit_builder(cb, "weierstrass_decompress".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_decompress".to_string(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_double.rs b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_double.rs index 3b47da936..db1d79fc2 100644 --- a/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_double.rs +++ b/ceno_zkvm/src/instructions/riscv/ecall/weierstrass_double.rs @@ -7,8 +7,7 @@ use ceno_emul::{ use ff_ext::ExtensionField; use generic_array::{GenericArray, typenum::Unsigned}; use gkr_iop::{ - ProtocolBuilder, ProtocolWitnessGenerator, - gkr::{GKRCircuit, layer::Layer}, + ProtocolBuilder, ProtocolWitnessGenerator, gkr::GKRCircuit, utils::lk_multiplicity::Multiplicity, }; use itertools::{Itertools, izip}; @@ -150,10 +149,7 @@ impl Instruction, _>>()?; - let (out_evals, mut chip) = layout.finalize(cb); - - let layer = Layer::from_circuit_builder(cb, "weierstrass_double".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_double".to_string(), cb); let circuit = chip.gkr_circuit(); diff --git a/ceno_zkvm/src/precompiles/bitwise_keccakf.rs b/ceno_zkvm/src/precompiles/bitwise_keccakf.rs index c6ad508dc..9f8415da4 100644 --- a/ceno_zkvm/src/precompiles/bitwise_keccakf.rs +++ b/ceno_zkvm/src/precompiles/bitwise_keccakf.rs @@ -18,7 +18,7 @@ use transcript::{BasicTranscript, Transcript}; use witness::{InstancePaddingStrategy, RowMajorMatrix}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, @@ -776,7 +776,7 @@ impl KeccakLayout { impl ProtocolBuilder for KeccakLayout { type Params = KeccakParams; - fn finalize(&mut self, _cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, _name: String, _cb: &mut CircuitBuilder) -> Chip { unimplemented!() } diff --git a/ceno_zkvm/src/precompiles/fptower/fp.rs b/ceno_zkvm/src/precompiles/fptower/fp.rs index 9d6901eca..63a89f61e 100644 --- a/ceno_zkvm/src/precompiles/fptower/fp.rs +++ b/ceno_zkvm/src/precompiles/fptower/fp.rs @@ -28,8 +28,8 @@ use derive::AlignedBorrow; use ff_ext::ExtensionField; use generic_array::{GenericArray, sequence::GenericSequence}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, - circuit_builder::CircuitBuilder, error::CircuitBuilderError, selector::SelectorType, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::CircuitBuilder, + default_out_eval_groups, error::CircuitBuilderError, gkr::layer::Layer, selector::SelectorType, }; use itertools::Itertools; use multilinear_extensions::{Expression, ToExpr, WitIn, util::max_usable_threads}; @@ -224,7 +224,7 @@ impl ProtocolBuilder for FpOpLayout { Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -234,20 +234,11 @@ impl ProtocolBuilder for FpOpLayout { cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - (0..r_len).collect_vec(), - (r_len..r_len + w_len).collect_vec(), - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } } @@ -299,7 +290,7 @@ mod tests { use gkr_iop::{ circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, - gkr::{GKRProverOutput, layer::Layer}, + gkr::GKRProverOutput, selector::SelectorContext, }; use itertools::Itertools; @@ -330,9 +321,7 @@ mod tests { let mut cb = CircuitBuilder::::new(&mut cs); let mut layout = FpOpLayout::::build_layer_logic(&mut cb, ()).expect("build_layer_logic failed"); - let (out_evals, mut chip) = layout.finalize(&mut cb); - let layer = Layer::from_circuit_builder(&cb, "fp_op".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("fp_op".to_string(), &mut cb); let gkr_circuit = chip.gkr_circuit(); let instances = (0..count) diff --git a/ceno_zkvm/src/precompiles/fptower/fp2_addsub.rs b/ceno_zkvm/src/precompiles/fptower/fp2_addsub.rs index 55e53fc88..85c56e430 100644 --- a/ceno_zkvm/src/precompiles/fptower/fp2_addsub.rs +++ b/ceno_zkvm/src/precompiles/fptower/fp2_addsub.rs @@ -28,8 +28,8 @@ use derive::AlignedBorrow; use ff_ext::ExtensionField; use generic_array::{GenericArray, sequence::GenericSequence}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, - circuit_builder::CircuitBuilder, error::CircuitBuilderError, selector::SelectorType, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::CircuitBuilder, + default_out_eval_groups, error::CircuitBuilderError, gkr::layer::Layer, selector::SelectorType, }; use itertools::Itertools; use multilinear_extensions::{Expression, ToExpr, WitIn, util::max_usable_threads}; @@ -248,7 +248,7 @@ impl ProtocolBuilder for Fp2AddSubAssignLayo Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -258,20 +258,11 @@ impl ProtocolBuilder for Fp2AddSubAssignLayo cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - (0..r_len).collect_vec(), - (r_len..r_len + w_len).collect_vec(), - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } } @@ -326,7 +317,7 @@ mod tests { use gkr_iop::{ circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, - gkr::{GKRProverOutput, layer::Layer}, + gkr::GKRProverOutput, selector::SelectorContext, }; use itertools::Itertools; @@ -357,9 +348,7 @@ mod tests { let mut cb = CircuitBuilder::::new(&mut cs); let mut layout = Fp2AddSubAssignLayout::::build_layer_logic(&mut cb, ()) .expect("build_layer_logic failed"); - let (out_evals, mut chip) = layout.finalize(&mut cb); - let layer = Layer::from_circuit_builder(&cb, "fp2_addsub".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("fp2_addsub".to_string(), &mut cb); let gkr_circuit = chip.gkr_circuit(); let instances = (0..count) diff --git a/ceno_zkvm/src/precompiles/fptower/fp2_mul.rs b/ceno_zkvm/src/precompiles/fptower/fp2_mul.rs index adddd1fb0..6d8288710 100644 --- a/ceno_zkvm/src/precompiles/fptower/fp2_mul.rs +++ b/ceno_zkvm/src/precompiles/fptower/fp2_mul.rs @@ -28,8 +28,8 @@ use derive::AlignedBorrow; use ff_ext::ExtensionField; use generic_array::{GenericArray, sequence::GenericSequence}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, - circuit_builder::CircuitBuilder, error::CircuitBuilderError, selector::SelectorType, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::CircuitBuilder, + default_out_eval_groups, error::CircuitBuilderError, gkr::layer::Layer, selector::SelectorType, }; use itertools::Itertools; use multilinear_extensions::{Expression, ToExpr, WitIn, util::max_usable_threads}; @@ -277,7 +277,7 @@ impl ProtocolBuilder for Fp2MulAssignLayout< Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -287,20 +287,11 @@ impl ProtocolBuilder for Fp2MulAssignLayout< cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - (0..r_len).collect_vec(), - (r_len..r_len + w_len).collect_vec(), - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } } @@ -355,7 +346,7 @@ mod tests { use gkr_iop::{ circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, - gkr::{GKRProverOutput, layer::Layer}, + gkr::GKRProverOutput, selector::SelectorContext, }; use itertools::Itertools; @@ -386,9 +377,7 @@ mod tests { let mut cb = CircuitBuilder::::new(&mut cs); let mut layout = Fp2MulAssignLayout::::build_layer_logic(&mut cb, ()) .expect("build_layer_logic failed"); - let (out_evals, mut chip) = layout.finalize(&mut cb); - let layer = Layer::from_circuit_builder(&cb, "fp2_mul".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("fp2_mul".to_string(), &mut cb); let gkr_circuit = chip.gkr_circuit(); let instances = (0..count) diff --git a/ceno_zkvm/src/precompiles/lookup_keccakf.rs b/ceno_zkvm/src/precompiles/lookup_keccakf.rs index 0394bc573..4fed156dc 100644 --- a/ceno_zkvm/src/precompiles/lookup_keccakf.rs +++ b/ceno_zkvm/src/precompiles/lookup_keccakf.rs @@ -1,10 +1,11 @@ use ceno_emul::{ByteAddr, Cycle, MemOp, StepRecord}; use ff_ext::ExtensionField; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::{CircuitBuilder, ConstraintSystem, expansion_expr, rotation_split}, cpu::{CpuBackend, CpuProver}, + default_out_eval_groups, error::{BackendError, CircuitBuilderError}, gkr::{ GKRCircuit, GKRProof, GKRProverOutput, @@ -512,7 +513,7 @@ impl ProtocolBuilder for KeccakLayout { Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; @@ -522,24 +523,11 @@ impl ProtocolBuilder for KeccakLayout { cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -974,10 +962,7 @@ pub fn setup_gkr_circuit() }) .collect::, _>>()?; - let (out_evals, mut chip) = layout.finalize(&mut cb); - - let layer = Layer::from_circuit_builder(&cb, "lookup_keccak".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("lookup_keccak".to_string(), &mut cb); Ok(( TestKeccakLayout { diff --git a/ceno_zkvm/src/precompiles/sha256/extend.rs b/ceno_zkvm/src/precompiles/sha256/extend.rs index 565a85b1c..21b442835 100644 --- a/ceno_zkvm/src/precompiles/sha256/extend.rs +++ b/ceno_zkvm/src/precompiles/sha256/extend.rs @@ -27,8 +27,8 @@ use std::{array, borrow::BorrowMut, mem::size_of}; use derive::AlignedBorrow; use ff_ext::{ExtensionField, SmallField}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, - circuit_builder::CircuitBuilder, error::CircuitBuilderError, selector::SelectorType, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::CircuitBuilder, + default_out_eval_groups, error::CircuitBuilderError, gkr::layer::Layer, selector::SelectorType, }; use itertools::Itertools; use multilinear_extensions::{Expression, ToExpr, WitIn, util::max_usable_threads}; @@ -266,7 +266,7 @@ impl ProtocolBuilder for ShaExtendLayout { Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -276,20 +276,11 @@ impl ProtocolBuilder for ShaExtendLayout { cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - (0..r_len).collect_vec(), - (r_len..r_len + w_len).collect_vec(), - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } } @@ -367,7 +358,7 @@ mod tests { use ff_ext::BabyBearExt4; use gkr_iop::{ cpu::{CpuBackend, CpuProver}, - gkr::{GKRProverOutput, layer::Layer}, + gkr::GKRProverOutput, selector::SelectorContext, }; use itertools::Itertools; @@ -388,9 +379,7 @@ mod tests { let mut cb = CircuitBuilder::::new(&mut cs); let mut layout = ShaExtendLayout::::build_layer_logic(&mut cb, ()).expect("build_layer_logic failed"); - let (out_evals, mut chip) = layout.finalize(&mut cb); - let layer = Layer::from_circuit_builder(&cb, "sha_extend".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("sha_extend".to_string(), &mut cb); let gkr_circuit = chip.gkr_circuit(); let mut rng = StdRng::seed_from_u64(1); diff --git a/ceno_zkvm/src/precompiles/uint256.rs b/ceno_zkvm/src/precompiles/uint256.rs index e1d2cc7ba..3664b9a59 100644 --- a/ceno_zkvm/src/precompiles/uint256.rs +++ b/ceno_zkvm/src/precompiles/uint256.rs @@ -39,9 +39,10 @@ use derive::AlignedBorrow; use ff_ext::{ExtensionField, SmallField}; use generic_array::{GenericArray, sequence::GenericSequence}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, cpu::{CpuBackend, CpuProver}, + default_out_eval_groups, error::{BackendError, CircuitBuilderError}, gkr::{GKRCircuit, GKRProof, GKRProverOutput, layer::Layer, mock::MockProver}, selector::{SelectorContext, SelectorType}, @@ -279,7 +280,7 @@ impl ProtocolBuilder for Uint256MulLayout { Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -290,24 +291,11 @@ impl ProtocolBuilder for Uint256MulLayout { cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -523,7 +511,7 @@ impl ProtocolBuilder for Uint256InvL Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -534,24 +522,11 @@ impl ProtocolBuilder for Uint256InvL cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -691,10 +666,7 @@ pub fn setup_uint256mul_gkr_circuit() }) .collect::, _>>()?; - let (out_evals, mut chip) = layout.finalize(&mut cb); - - let layer = Layer::from_circuit_builder(&cb, "weierstrass_add".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_add".to_string(), &mut cb); Ok(( TestUint256MulLayout { diff --git a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_add.rs b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_add.rs index 48ae4eb81..1bd025e60 100644 --- a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_add.rs +++ b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_add.rs @@ -30,10 +30,11 @@ use derive::AlignedBorrow; use ff_ext::{ExtensionField, SmallField}; use generic_array::{GenericArray, sequence::GenericSequence, typenum::Unsigned}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, + default_out_eval_groups, error::{BackendError, CircuitBuilderError}, gkr::{GKRCircuit, GKRProof, GKRProverOutput, layer::Layer, mock::MockProver}, selector::{SelectorContext, SelectorType}, @@ -324,7 +325,7 @@ impl ProtocolBuilder Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -335,24 +336,11 @@ impl ProtocolBuilder cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -501,10 +489,7 @@ pub fn setup_gkr_circuit() .collect::, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(&mut cb); - - let layer = Layer::from_circuit_builder(&cb, "weierstrass_add".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_add".to_string(), &mut cb); Ok(( TestWeierstrassAddLayout { diff --git a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_decompress.rs b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_decompress.rs index 8f7075917..ca3ad11b7 100644 --- a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_decompress.rs +++ b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_decompress.rs @@ -30,10 +30,11 @@ use derive::AlignedBorrow; use ff_ext::{ExtensionField, SmallField}; use generic_array::{GenericArray, sequence::GenericSequence, typenum::Unsigned}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, + default_out_eval_groups, error::{BackendError, CircuitBuilderError}, gkr::{GKRCircuit, GKRProof, GKRProverOutput, layer::Layer, mock::MockProver}, selector::{SelectorContext, SelectorType}, @@ -334,7 +335,7 @@ impl ProtocolBuild Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -345,24 +346,11 @@ impl ProtocolBuild cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -499,10 +487,7 @@ pub fn setup_gkr_circuit, _>>()?, ); - let (out_evals, mut chip) = layout.finalize(&mut cb); - - let layer = Layer::from_circuit_builder(&cb, "weierstrass_decompress".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_decompress".to_string(), &mut cb); Ok(( TestWeierstrassDecompressLayout { diff --git a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_double.rs b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_double.rs index e1b111d92..1362e19ad 100644 --- a/ceno_zkvm/src/precompiles/weierstrass/weierstrass_double.rs +++ b/ceno_zkvm/src/precompiles/weierstrass/weierstrass_double.rs @@ -30,10 +30,11 @@ use derive::AlignedBorrow; use ff_ext::{ExtensionField, SmallField}; use generic_array::{GenericArray, sequence::GenericSequence, typenum::Unsigned}; use gkr_iop::{ - OutEvalGroups, ProtocolBuilder, ProtocolWitnessGenerator, + ProtocolBuilder, ProtocolWitnessGenerator, chip::Chip, circuit_builder::{CircuitBuilder, ConstraintSystem}, cpu::{CpuBackend, CpuProver}, + default_out_eval_groups, error::{BackendError, CircuitBuilderError}, gkr::{GKRCircuit, GKRProof, GKRProverOutput, layer::Layer, mock::MockProver}, selector::{SelectorContext, SelectorType}, @@ -352,7 +353,7 @@ impl ProtocolBuild Ok(layout) } - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip) { + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip { self.n_fixed = cb.cs.num_fixed; self.n_committed = cb.cs.num_witin as usize; self.n_structural_witin = cb.cs.num_structural_witin as usize; @@ -363,24 +364,11 @@ impl ProtocolBuild cb.cs.lk_selector = Some(self.selector_type_layout.sel_all.clone()); cb.cs.zero_selector = Some(self.selector_type_layout.sel_all.clone()); - let w_len = cb.cs.w_expressions.len(); - let r_len = cb.cs.r_expressions.len(); - let lk_len = cb.cs.lk_expressions.len(); - let zero_len = - cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); - ( - [ - // r_record - (0..r_len).collect_vec(), - // w_record - (r_len..r_len + w_len).collect_vec(), - // lk_record - (r_len + w_len..r_len + w_len + lk_len).collect_vec(), - // zero_record - (0..zero_len).collect_vec(), - ], - Chip::new_from_cb(cb), - ) + let out_evals = default_out_eval_groups(cb); + let mut chip = Chip::new_from_cb(cb); + let layer = Layer::from_circuit_builder(cb, name, out_evals); + chip.add_layer(layer); + chip } fn n_committed(&self) -> usize { @@ -506,10 +494,7 @@ pub fn setup_gkr_circuit, _>>()?; - let (out_evals, mut chip) = layout.finalize(&mut cb); - - let layer = Layer::from_circuit_builder(&cb, "weierstrass_double".to_string(), out_evals); - chip.add_layer(layer); + let chip = layout.finalize("weierstrass_double".to_string(), &mut cb); Ok(( TestWeierstrassDoubleLayout { diff --git a/gkr_iop/src/lib.rs b/gkr_iop/src/lib.rs index 933e92c14..bfd2ec877 100644 --- a/gkr_iop/src/lib.rs +++ b/gkr_iop/src/lib.rs @@ -5,6 +5,7 @@ use crate::{ }; use either::Either; use ff_ext::ExtensionField; +use itertools::Itertools; use multilinear_extensions::{Expression, impl_expr_from_unsigned, mle::ArcMultilinearExtension}; use std::marker::PhantomData; use strum_macros::EnumIter; @@ -41,7 +42,7 @@ pub trait ProtocolBuilder: Sized { params: Self::Params, ) -> Result; - fn finalize(&mut self, cb: &mut CircuitBuilder) -> (OutEvalGroups, Chip); + fn finalize(&mut self, name: String, cb: &mut CircuitBuilder) -> Chip; fn n_committed(&self) -> usize { todo!() @@ -78,6 +79,21 @@ pub struct ProtocolProver, PCS>( PhantomData<(E, Trans, PCS)>, ); +pub fn default_out_eval_groups(cb: &CircuitBuilder) -> OutEvalGroups { + let r_len = cb.cs.r_expressions.len() + cb.cs.r_table_expressions.len(); + let w_len = cb.cs.w_expressions.len() + cb.cs.w_table_expressions.len(); + let lk_len = cb.cs.lk_expressions.len() + cb.cs.lk_table_expressions.len() * 2; + let zero_len = + cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len(); + + [ + (0..r_len).collect_vec(), + (r_len..r_len + w_len).collect_vec(), + (r_len + w_len..r_len + w_len + lk_len).collect_vec(), + (0..zero_len).collect_vec(), + ] +} + // TODO: the following trait consists of `commit_phase1`, `commit_phase2`, // `gkr_phase` and `opening_phase`. pub struct ProtocolVerifier, PCS>(