diff --git a/Cargo.lock b/Cargo.lock index 1145ce390..2c8d916a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -717,26 +717,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -755,19 +735,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "bls12_381" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" -dependencies = [ - "ff 0.12.1", - "group 0.12.1", - "pairing", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "blst" version = "0.3.16" @@ -1104,7 +1071,6 @@ dependencies = [ "transcript", "whir", "witness", - "zkhash", ] [[package]] @@ -1249,12 +1215,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1830,9 +1790,9 @@ dependencies = [ "base16ct", "crypto-bigint", "digest 0.10.7", - "ff 0.13.1", + "ff", "generic-array 0.14.7", - "group 0.13.0", + "group", "hkdf", "pem-rfc7468", "pkcs8", @@ -1932,24 +1892,12 @@ dependencies = [ "bytes", ] -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "bitvec", "rand_core 0.6.4", "subtle", ] @@ -1957,7 +1905,7 @@ dependencies = [ [[package]] name = "ff_ext" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "once_cell", "p3", @@ -2148,25 +2096,13 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "memuse", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.1", + "ff", "rand_core 0.6.4", "subtle", ] @@ -2181,29 +2117,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "halo2" -version = "0.1.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" -dependencies = [ - "halo2_proofs", -] - -[[package]] -name = "halo2_proofs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "pasta_curves 0.4.1", - "rand_core 0.6.4", - "rayon", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -2572,20 +2485,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jubjub" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" -dependencies = [ - "bitvec", - "bls12_381", - "ff 0.12.1", - "group 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "k256" version = "0.13.4" @@ -2806,12 +2705,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memuse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" - [[package]] name = "miniz_oxide" version = "0.8.8" @@ -2824,7 +2717,7 @@ dependencies = [ [[package]] name = "mpcs" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "bincode", "clap", @@ -2848,7 +2741,7 @@ dependencies = [ [[package]] name = "multilinear_extensions" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "either", "ff_ext", @@ -3169,7 +3062,7 @@ dependencies = [ [[package]] name = "p3" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "p3-air", "p3-baby-bear", @@ -3449,15 +3342,6 @@ dependencies = [ "serde", ] -[[package]] -name = "pairing" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" -dependencies = [ - "group 0.12.1", -] - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -3515,36 +3399,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" -[[package]] -name = "pasta_curves" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "lazy_static", - "rand 0.8.5", - "static_assertions", - "subtle", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff 0.13.1", - "group 0.13.0", - "lazy_static", - "rand 0.8.5", - "static_assertions", - "subtle", -] - [[package]] name = "paste" version = "1.0.15" @@ -3645,7 +3499,7 @@ dependencies = [ [[package]] name = "poseidon" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "ff_ext", "p3", @@ -4629,7 +4483,7 @@ dependencies = [ [[package]] name = "sp1-curves" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "cfg-if", "dashu", @@ -4751,7 +4605,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sumcheck" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "either", "ff_ext", @@ -4769,7 +4623,7 @@ dependencies = [ [[package]] name = "sumcheck_macro" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "itertools 0.13.0", "p3", @@ -5164,7 +5018,7 @@ dependencies = [ [[package]] name = "transcript" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "ff_ext", "itertools 0.13.0", @@ -5436,7 +5290,7 @@ dependencies = [ [[package]] name = "whir" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "bincode", "clap", @@ -5723,7 +5577,7 @@ dependencies = [ [[package]] name = "witness" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#c2580ace319e01bc8657dc92a6b5775348ce3133" +source = "git+https://github.com/scroll-tech/gkr-backend.git?branch=chore%2Fsw_curve_default#b155b40356762733fac4264444a5e8cef323607e" dependencies = [ "ff_ext", "multilinear_extensions", @@ -5880,29 +5734,3 @@ dependencies = [ "quote", "syn 2.0.101", ] - -[[package]] -name = "zkhash" -version = "0.2.0" -source = "git+https://github.com/HorizenLabs/poseidon2.git?rev=bb476b9#bb476b9ca38198cf5092487283c8b8c5d4317c4e" -dependencies = [ - "ark-ff 0.4.2", - "ark-std 0.4.0", - "bitvec", - "blake2", - "bls12_381", - "byteorder", - "cfg-if", - "group 0.12.1", - "group 0.13.0", - "halo2", - "hex", - "jubjub", - "lazy_static", - "pasta_curves 0.5.1", - "rand 0.8.5", - "serde", - "sha2 0.10.9", - "sha3", - "subtle", -] diff --git a/Cargo.toml b/Cargo.toml index 9cd889535..c5d5b3784 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,7 +80,6 @@ tracing = { version = "0.1", features = [ tracing-forest = { version = "0.1.6" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } uint = "0.8" -zkhash = { git = "https://github.com/HorizenLabs/poseidon2.git", rev = "bb476b9" } lazy_static = "1.5.0" ceno_gpu = { path = "utils/cuda_hal", package = "cuda_hal" } @@ -101,13 +100,14 @@ lto = "thin" # [patch."ssh://git@github.com/scroll-tech/ceno-gpu.git"] # ceno_gpu = { path = "../ceno-gpu/cuda_hal", package = "cuda_hal" } -#[patch."https://github.com/scroll-tech/gkr-backend"] -#ff_ext = { path = "../gkr-backend/crates/ff_ext", package = "ff_ext" } -#mpcs = { path = "../gkr-backend/crates/mpcs", package = "mpcs" } -#multilinear_extensions = { path = "../gkr-backend/crates/multilinear_extensions", package = "multilinear_extensions" } -#p3 = { path = "../gkr-backend/crates/p3", package = "p3" } -#poseidon = { path = "../gkr-backend/crates/poseidon", package = "poseidon" } -#sumcheck = { path = "../gkr-backend/crates/sumcheck", package = "sumcheck" } -#transcript = { path = "../gkr-backend/crates/transcript", package = "transcript" } -#whir = { path = "../gkr-backend/crates/whir", package = "whir" } -#witness = { path = "../gkr-backend/crates/witness", package = "witness" } +# [patch."https://github.com/scroll-tech/gkr-backend"] +# ff_ext = { path = "../gkr-backend/crates/ff_ext", package = "ff_ext" } +# mpcs = { path = "../gkr-backend/crates/mpcs", package = "mpcs" } +# multilinear_extensions = { path = "../gkr-backend/crates/multilinear_extensions", package = "multilinear_extensions" } +# p3 = { path = "../gkr-backend/crates/p3", package = "p3" } +# poseidon = { path = "../gkr-backend/crates/poseidon", package = "poseidon" } +# sp1-curves = { path = "../gkr-backend/crates/curves", package = "sp1-curves" } +# sumcheck = { path = "../gkr-backend/crates/sumcheck", package = "sumcheck" } +# transcript = { path = "../gkr-backend/crates/transcript", package = "transcript" } +# whir = { path = "../gkr-backend/crates/whir", package = "whir" } +# witness = { path = "../gkr-backend/crates/witness", package = "witness" } diff --git a/ceno_zkvm/Cargo.toml b/ceno_zkvm/Cargo.toml index 481d92024..80d69111b 100644 --- a/ceno_zkvm/Cargo.toml +++ b/ceno_zkvm/Cargo.toml @@ -30,7 +30,6 @@ sumcheck.workspace = true transcript.workspace = true whir.workspace = true witness.workspace = true -zkhash.workspace = true lazy_static.workspace = true itertools.workspace = true diff --git a/ceno_zkvm/benches/riscv_add.rs b/ceno_zkvm/benches/riscv_add.rs index 028748058..b438244a3 100644 --- a/ceno_zkvm/benches/riscv_add.rs +++ b/ceno_zkvm/benches/riscv_add.rs @@ -111,7 +111,10 @@ fn bench_add(c: &mut Criterion) { witness: polys, structural_witness: vec![], public_input: vec![], + num_read_instances: num_instances, + num_write_instances: num_instances, num_instances, + has_ecc_ops: false, }; let _ = prover .create_chip_proof( diff --git a/ceno_zkvm/src/e2e.rs b/ceno_zkvm/src/e2e.rs index 167e35364..c490bb597 100644 --- a/ceno_zkvm/src/e2e.rs +++ b/ceno_zkvm/src/e2e.rs @@ -3,6 +3,7 @@ use crate::{ instructions::riscv::{DummyExtraConfig, MemPadder, MmuConfig, Rv32imConfig}, scheme::{ PublicValues, ZKVMProof, + constants::SEPTIC_EXTENSION_DEGREE, hal::ProverDevice, mock_prover::{LkMultiplicityKey, MockProver}, prover::ZKVMProver, @@ -433,7 +434,7 @@ pub fn emulate_program<'a>( end_cycle, shards.shard_id as u32, io_init.iter().map(|rec| rec.value).collect_vec(), - vec![0; 14], // point_at_infinity + vec![0; SEPTIC_EXTENSION_DEGREE * 2], // point_at_infinity ); // Find the final register values and cycles. diff --git a/ceno_zkvm/src/gadgets/mod.rs b/ceno_zkvm/src/gadgets/mod.rs index d0d8ed67d..a4d624568 100644 --- a/ceno_zkvm/src/gadgets/mod.rs +++ b/ceno_zkvm/src/gadgets/mod.rs @@ -2,7 +2,6 @@ mod div; mod field; mod is_lt; mod poseidon2; -mod poseidon2_constants; mod signed; mod signed_ext; mod signed_limbs; @@ -15,9 +14,7 @@ pub use gkr_iop::gadgets::{ AssertLtConfig, InnerLtConfig, IsEqualConfig, IsLtConfig, IsZeroConfig, cal_lt_diff, }; pub use is_lt::{AssertSignedLtConfig, SignedLtConfig}; -pub(crate) use poseidon2::RoundConstants; pub use poseidon2::{Poseidon2BabyBearConfig, Poseidon2Config}; -pub(crate) use poseidon2_constants::horizen_round_consts; pub use signed::Signed; pub use signed_ext::SignedExtendConfig; pub use signed_limbs::{UIntLimbsLT, UIntLimbsLTConfig}; diff --git a/ceno_zkvm/src/gadgets/poseidon2.rs b/ceno_zkvm/src/gadgets/poseidon2.rs index e59817bf3..c4e7b621c 100644 --- a/ceno_zkvm/src/gadgets/poseidon2.rs +++ b/ceno_zkvm/src/gadgets/poseidon2.rs @@ -35,6 +35,42 @@ pub struct RoundConstants< pub ending_full_round_constants: [[F; WIDTH]; HALF_FULL_ROUNDS], } +impl + From> for RoundConstants +{ + fn from(value: Vec) -> Self { + let mut iter = value.into_iter(); + let mut beginning_full_round_constants = [[F::ZERO; WIDTH]; HALF_FULL_ROUNDS]; + for round in 0..HALF_FULL_ROUNDS { + for i in 0..WIDTH { + beginning_full_round_constants[round][i] = + iter.next().expect("insufficient round constants"); + } + } + + let mut partial_round_constants = [F::ZERO; PARTIAL_ROUNDS]; + for round in 0..PARTIAL_ROUNDS { + partial_round_constants[round] = iter.next().expect("insufficient round constants"); + } + + let mut ending_full_round_constants = [[F::ZERO; WIDTH]; HALF_FULL_ROUNDS]; + for round in 0..HALF_FULL_ROUNDS { + for i in 0..WIDTH { + ending_full_round_constants[round][i] = + iter.next().expect("insufficient round constants"); + } + } + + assert!(iter.next().is_none(), "round constants are too many"); + + RoundConstants { + beginning_full_round_constants, + partial_round_constants, + ending_full_round_constants, + } + } +} + pub type Poseidon2BabyBearConfig = Poseidon2Config; pub struct Poseidon2Config< E: ExtensionField, @@ -471,19 +507,20 @@ fn generate_sbox( #[cfg(test)] mod tests { - use crate::gadgets::{ - poseidon2::Poseidon2BabyBearConfig, poseidon2_constants::horizen_round_consts, - }; - use ff_ext::BabyBearExt4; + use crate::gadgets::poseidon2::Poseidon2BabyBearConfig; + use ff_ext::{BabyBearExt4, PoseidonField}; use gkr_iop::circuit_builder::{CircuitBuilder, ConstraintSystem}; + use p3::babybear::BabyBear; type E = BabyBearExt4; + type F = BabyBear; #[test] fn test_poseidon2_gadget() { let mut cs = ConstraintSystem::new(|| "poseidon2 gadget test"); let mut cb = CircuitBuilder::::new(&mut cs); - let poseidon2_constants = horizen_round_consts(); - let _ = Poseidon2BabyBearConfig::construct(&mut cb, poseidon2_constants); + // let poseidon2_constants = horizen_round_consts(); + let rc = ::get_default_perm_rc().into(); + let _ = Poseidon2BabyBearConfig::construct(&mut cb, rc); } } diff --git a/ceno_zkvm/src/gadgets/poseidon2_constants.rs b/ceno_zkvm/src/gadgets/poseidon2_constants.rs deleted file mode 100644 index 85ae2a1ae..000000000 --- a/ceno_zkvm/src/gadgets/poseidon2_constants.rs +++ /dev/null @@ -1,60 +0,0 @@ -// taken from openvm/crates/circuits/poseidon2-air/src/babybear.rs -use super::poseidon2::RoundConstants; -use lazy_static::lazy_static; -use p3::{babybear::BabyBear, field::FieldAlgebra}; -use std::array::from_fn; -use zkhash::{ - ark_ff::PrimeField as _, fields::babybear::FpBabyBear as HorizenBabyBear, - poseidon2::poseidon2_instance_babybear::RC16, -}; - -const BABY_BEAR_POSEIDON2_WIDTH: usize = 16; -const BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS: usize = 4; -const BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS: usize = 13; - -#[allow(dead_code)] -pub(crate) fn horizen_to_p3_babybear(horizen_babybear: HorizenBabyBear) -> BabyBear { - BabyBear::from_canonical_u64(horizen_babybear.into_bigint().0[0]) -} - -#[allow(dead_code)] -pub(crate) fn horizen_round_consts() -> RoundConstants< - BabyBear, - BABY_BEAR_POSEIDON2_WIDTH, - BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS, - BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS, -> { - let p3_rc16: Vec> = RC16 - .iter() - .map(|round| { - round - .iter() - .map(|babybear| horizen_to_p3_babybear(*babybear)) - .collect() - }) - .collect(); - let p_end = BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS + BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS; - - let beginning_full_round_constants: [[BabyBear; BABY_BEAR_POSEIDON2_WIDTH]; - BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS] = from_fn(|i| p3_rc16[i].clone().try_into().unwrap()); - let partial_round_constants: [BabyBear; BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS] = - from_fn(|i| p3_rc16[i + BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS][0]); - let ending_full_round_constants: [[BabyBear; BABY_BEAR_POSEIDON2_WIDTH]; - BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS] = - from_fn(|i| p3_rc16[i + p_end].clone().try_into().unwrap()); - - RoundConstants { - beginning_full_round_constants, - partial_round_constants, - ending_full_round_constants, - } -} - -lazy_static! { - pub static ref BABYBEAR_BEGIN_EXT_CONSTS: [[BabyBear; BABY_BEAR_POSEIDON2_WIDTH]; BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS] = - horizen_round_consts().beginning_full_round_constants; - pub static ref BABYBEAR_PARTIAL_CONSTS: [BabyBear; BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS] = - horizen_round_consts().partial_round_constants; - pub static ref BABYBEAR_END_EXT_CONSTS: [[BabyBear; BABY_BEAR_POSEIDON2_WIDTH]; BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS] = - horizen_round_consts().ending_full_round_constants; -} diff --git a/ceno_zkvm/src/instructions/global.rs b/ceno_zkvm/src/instructions/global.rs index f4a43b5f3..2bad3fbbf 100644 --- a/ceno_zkvm/src/instructions/global.rs +++ b/ceno_zkvm/src/instructions/global.rs @@ -1,21 +1,23 @@ -use std::iter::repeat_n; +use std::{collections::HashMap, iter::repeat_n, marker::PhantomData}; use crate::{ Value, chip_handler::general::PublicIOQuery, - e2e::ShardContext, error::ZKVMError, - gadgets::{Poseidon2Config, RoundConstants}, + gadgets::Poseidon2Config, instructions::riscv::constants::UINT_LIMBS, scheme::septic_curve::{SepticExtension, SepticPoint}, structs::{ProgramParams, RAMType}, - tables::RMMCollections, + tables::{RMMCollections, TableCircuit}, witness::LkMultiplicity, }; -use ff_ext::{ExtensionField, FieldInto, POSEIDON2_BABYBEAR_WIDTH, SmallField}; +use ff_ext::{ExtensionField, FieldInto, PoseidonField, SmallField}; use gkr_iop::{ - chip::Chip, circuit_builder::CircuitBuilder, error::CircuitBuilderError, gkr::layer::Layer, - selector::SelectorType, utils::lk_multiplicity::Multiplicity, + chip::Chip, + circuit_builder::CircuitBuilder, + error::CircuitBuilderError, + gkr::{GKRCircuit, layer::Layer}, + selector::SelectorType, }; use itertools::{Itertools, chain}; use multilinear_extensions::{ @@ -34,10 +36,7 @@ use rayon::{ use std::ops::Deref; use witness::{InstancePaddingStrategy, next_pow2_instance_padding, set_val}; -use crate::{ - instructions::{Instruction, riscv::constants::UInt}, - scheme::constants::SEPTIC_EXTENSION_DEGREE, -}; +use crate::{instructions::riscv::constants::UInt, scheme::constants::SEPTIC_EXTENSION_DEGREE}; /// A record for a read/write into the global set #[derive(Default, Debug, Clone)] @@ -60,15 +59,12 @@ pub struct GlobalPoint { } impl GlobalRecord { - pub fn to_ec_point< - E: ExtensionField, - P: Permutation<[E::BaseField; POSEIDON2_BABYBEAR_WIDTH]>, - >( + pub fn to_ec_point>>( &self, hasher: &P, ) -> GlobalPoint { let mut nonce = 0; - let mut input = [ + let mut input = vec![ E::BaseField::from_canonical_u32(self.addr), E::BaseField::from_canonical_u32(self.ram_type as u32), E::BaseField::from_canonical_u32(self.value & 0xFFFF), // lower 16 bits @@ -90,7 +86,7 @@ impl GlobalRecord { let prime = E::BaseField::order().to_u64_digits()[0]; loop { let x: SepticExtension = - hasher.permute(input)[0..SEPTIC_EXTENSION_DEGREE].into(); + hasher.permute(input.clone())[0..SEPTIC_EXTENSION_DEGREE].into(); if let Some(p) = SepticPoint::from_x(x) { let y6 = (p.y.0)[SEPTIC_EXTENSION_DEGREE - 1].to_canonical_u64(); let is_y_in_2nd_half = y6 >= (prime / 2); @@ -125,7 +121,7 @@ impl GlobalRecord { /// the local finalize circuit will consume it by inserting a local read record. /// 3. For a local memory write record which will be read in the future, /// the global chip will insert a local read record and write it to the **global set**. -pub struct GlobalConfig { +pub struct GlobalConfig { addr: WitIn, is_ram_register: WitIn, value: UInt, @@ -141,16 +137,11 @@ pub struct GlobalConfig { y: Vec, slope: Vec, perm_config: Poseidon2Config, - perm: P, } -impl GlobalConfig { +impl GlobalConfig { // TODO: make `WIDTH`, `HALF_FULL_ROUNDS`, `PARTIAL_ROUNDS` generic parameters - pub fn configure( - cb: &mut CircuitBuilder, - rc: RoundConstants, - perm: P, - ) -> Result { + pub fn configure(cb: &mut CircuitBuilder) -> Result { let x: Vec = (0..SEPTIC_EXTENSION_DEGREE) .map(|i| cb.create_witin(|| format!("x{}", i))) .collect(); @@ -173,6 +164,8 @@ impl GlobalConfig { let reg: Expression = RAMType::Register.into(); let mem: Expression = RAMType::Memory.into(); let ram_type: Expression = is_ram_reg.clone() * reg + (1 - is_ram_reg) * mem; + + let rc = ::get_default_perm_rc().into(); let perm_config = Poseidon2Config::construct(cb, rc); let mut input = vec![]; @@ -256,50 +249,103 @@ impl GlobalConfig { nonce, is_global_write, perm_config, - perm, }) } } /// This chip is used to manage read/write into a global set /// shared among multiple shards -pub struct GlobalChip { - rc: RoundConstants, - perm: P, +#[derive(Default)] +pub struct GlobalChip { + _marker: PhantomData, } #[derive(Clone, Debug)] pub struct GlobalChipInput { pub record: GlobalRecord, - pub ec_point: Option>, // to be filled during instance assignment + pub ec_point: GlobalPoint, +} + +impl GlobalChip { + fn assign_instance<'a>( + config: &GlobalConfig, + instance: &mut [E::BaseField], + _lk_multiplicity: &mut LkMultiplicity, + input: &GlobalChipInput, + ) -> Result<(), crate::error::ZKVMError> { + // assign basic fields + let record = &input.record; + let is_ram_register = match record.ram_type { + RAMType::Register => 1, + RAMType::Memory => 0, + _ => unreachable!(), + }; + set_val!(instance, config.addr, record.addr as u64); + set_val!(instance, config.is_ram_register, is_ram_register as u64); + let value = Value::new_unchecked(record.value); + config.value.assign_limbs(instance, value.as_u16_limbs()); + set_val!(instance, config.shard, record.shard); + set_val!(instance, config.global_clk, record.global_clk); + set_val!(instance, config.local_clk, record.local_clk); + set_val!(instance, config.is_global_write, record.is_write as u64); + + // assign (x, y) and nonce + let GlobalPoint { nonce, point } = &input.ec_point; + set_val!(instance, config.nonce, *nonce as u64); + config + .x + .iter() + .chain(config.y.iter()) + .zip_eq((point.x.deref()).iter().chain((point.y.deref()).iter())) + .for_each(|(witin, fe)| { + instance[witin.id as usize] = *fe; + }); + + let ram_type = E::BaseField::from_canonical_u32(record.ram_type as u32); + let mut input = [E::BaseField::ZERO; 16]; + + let k = UINT_LIMBS; + input[0] = E::BaseField::from_canonical_u32(record.addr); + input[1] = ram_type; + input[2..(k + 2)] + .iter_mut() + .zip(value.as_u16_limbs().iter()) + .for_each(|(i, v)| *i = E::BaseField::from_canonical_u16(*v)); + input[2 + k] = E::BaseField::from_canonical_u64(record.shard); + input[2 + k + 1] = E::BaseField::from_canonical_u64(record.global_clk); + input[2 + k + 2] = E::BaseField::from_canonical_u32(*nonce); + + config + .perm_config + // TODO: remove hardcoded constant 28 + .assign_instance(&mut instance[28 + UINT_LIMBS..], input); + + Ok(()) + } } -impl + Send> - Instruction for GlobalChip -{ - type InstructionConfig = GlobalConfig; - type Record = GlobalChipInput; +impl TableCircuit for GlobalChip { + type TableConfig = GlobalConfig; + type FixedInput = (); + type WitnessInput = Vec>; fn name() -> String { "Global".to_string() } fn construct_circuit( - &self, cb: &mut CircuitBuilder, _param: &ProgramParams, - ) -> Result { - let config = GlobalConfig::configure(cb, self.rc.clone(), self.perm.clone())?; + ) -> Result { + let config = GlobalConfig::configure(cb)?; Ok(config) } fn build_gkr_iop_circuit( - &self, cb: &mut CircuitBuilder, param: &ProgramParams, - ) -> Result<(Self::InstructionConfig, gkr_iop::gkr::GKRCircuit), crate::error::ZKVMError> - { + ) -> Result<(Self::TableConfig, Option>), crate::error::ZKVMError> { // create three selectors: selector_r, selector_w, selector_zero let selector_r = cb.create_structural_witin( || "selector_r", @@ -332,7 +378,7 @@ impl }, ); - let config = self.construct_circuit(cb, param)?; + let config = Self::construct_circuit(cb, param)?; let w_len = cb.cs.w_expressions.len(); let r_len = cb.cs.r_expressions.len(); @@ -371,73 +417,23 @@ impl let layer = Layer::from_circuit_builder(cb, format!("{}_main", Self::name()), 0, out_evals); chip.add_layer(layer); - Ok((config, chip.gkr_circuit())) + Ok((config, Some(chip.gkr_circuit()))) } - fn assign_instance<'a>( - config: &Self::InstructionConfig, - shard_ctx: &mut ShardContext<'a>, - instance: &mut [E::BaseField], - lk_multiplicity: &mut LkMultiplicity, - input: &Self::Record, - ) -> Result<(), crate::error::ZKVMError> { - // assign basic fields - let record = &input.record; - let is_ram_register = match record.ram_type { - RAMType::Register => 1, - RAMType::Memory => 0, - _ => unreachable!(), - }; - set_val!(instance, config.addr, record.addr as u64); - set_val!(instance, config.is_ram_register, is_ram_register as u64); - let value = Value::new(record.value, lk_multiplicity); - config.value.assign_limbs(instance, value.as_u16_limbs()); - set_val!(instance, config.shard, record.shard); - set_val!(instance, config.global_clk, record.global_clk); - set_val!(instance, config.local_clk, record.local_clk); - set_val!(instance, config.is_global_write, record.is_write as u64); - - // assign (x, y) and nonce - let GlobalPoint { nonce, point } = input.ec_point.as_ref().unwrap(); - set_val!(instance, config.nonce, *nonce as u64); - config - .x - .iter() - .chain(config.y.iter()) - .zip_eq((point.x.deref()).iter().chain((point.y.deref()).iter())) - .for_each(|(witin, fe)| { - instance[witin.id as usize] = *fe; - }); - - let ram_type = E::BaseField::from_canonical_u32(record.ram_type as u32); - let mut input = [E::BaseField::ZERO; 16]; - - let k = UINT_LIMBS; - input[0] = E::BaseField::from_canonical_u32(record.addr); - input[1] = ram_type; - input[2..(k + 2)] - .iter_mut() - .zip(value.as_u16_limbs().iter()) - .for_each(|(i, v)| *i = E::BaseField::from_canonical_u16(*v)); - input[2 + k] = E::BaseField::from_canonical_u64(record.shard); - input[2 + k + 1] = E::BaseField::from_canonical_u64(record.global_clk); - input[2 + k + 2] = E::BaseField::from_canonical_u32(*nonce); - - config - .perm_config - // TODO: remove hardcoded constant 28 - .assign_instance(&mut instance[28 + UINT_LIMBS..], input); - - Ok(()) + fn generate_fixed_traces( + _config: &Self::TableConfig, + _num_fixed: usize, + _input: &Self::FixedInput, + ) -> witness::RowMajorMatrix<::BaseField> { + unimplemented!() } - fn assign_instances<'a>( - config: &Self::InstructionConfig, - shard_ctx: &mut ShardContext<'a>, + config: &Self::TableConfig, num_witin: usize, num_structural_witin: usize, - mut steps: Vec, - ) -> Result<(RMMCollections, Multiplicity), ZKVMError> { + _multiplicity: &[HashMap], + steps: &Self::WitnessInput, + ) -> Result, ZKVMError> { // FIXME selector is the only structural witness // this is workaround, as call `construct_circuit` will not initialized selector // we can remove this one all opcode unittest migrate to call `build_gkr_iop_circuit` @@ -461,15 +457,6 @@ impl let n = next_pow2_instance_padding(steps.len()); // compute the input for the binary tree for ec point summation - steps - .par_chunks_mut(num_instance_per_batch) - .for_each(|chunk| { - chunk.iter_mut().for_each(|step| { - let point = step.record.to_ec_point::(&config.perm); - - step.ec_point.replace(point); - }); - }); let lk_multiplicity = LkMultiplicity::default(); // *2 because we need to store the internal nodes of binary tree for ec point summation @@ -501,47 +488,37 @@ impl [0..steps.len() * num_structural_witin] .par_chunks_mut(num_instance_per_batch * num_structural_witin); - let shard_ctx_vec = shard_ctx.get_forked(); raw_witin_iter .zip_eq(raw_structual_witin_iter) .zip_eq(steps.par_chunks(num_instance_per_batch)) - .zip(shard_ctx_vec) .enumerate() - .flat_map( - |(chunk_idx, (((instances, structural_instance), steps), mut shard_ctx))| { - let mut lk_multiplicity = lk_multiplicity.clone(); - instances - .chunks_mut(num_witin) - .zip_eq(structural_instance.chunks_mut(num_structural_witin)) - .zip_eq(steps) - .enumerate() - .map(|(i, ((instance, structural_instance), step))| { - let row = chunk_idx * num_instance_per_batch + i; - let (sel_r, sel_w) = if row < num_local_reads { - (E::BaseField::ONE, E::BaseField::ZERO) - } else { - (E::BaseField::ZERO, E::BaseField::ONE) - }; - set_val!(structural_instance, selector_r_witin, sel_r); - set_val!(structural_instance, selector_w_witin, sel_w); - set_val!(structural_instance, selector_zero_witin, E::BaseField::ONE); - Self::assign_instance( - config, - &mut shard_ctx, - instance, - &mut lk_multiplicity, - step, - ) - }) - .collect::>() - }, - ) + .flat_map(|(chunk_idx, ((instances, structural_instance), steps))| { + let mut lk_multiplicity = lk_multiplicity.clone(); + instances + .chunks_mut(num_witin) + .zip_eq(structural_instance.chunks_mut(num_structural_witin)) + .zip_eq(steps) + .enumerate() + .map(|(i, ((instance, structural_instance), step))| { + let row = chunk_idx * num_instance_per_batch + i; + let (sel_r, sel_w) = if row < num_local_reads { + (E::BaseField::ONE, E::BaseField::ZERO) + } else { + (E::BaseField::ZERO, E::BaseField::ONE) + }; + set_val!(structural_instance, selector_r_witin, sel_r); + set_val!(structural_instance, selector_w_witin, sel_w); + set_val!(structural_instance, selector_zero_witin, E::BaseField::ONE); + Self::assign_instance(config, instance, &mut lk_multiplicity, step) + }) + .collect::>() + }) .collect::>()?; // assign internal nodes in the binary tree for ec point summation let mut cur_layer_points = steps .iter() - .map(|step| step.ec_point.as_ref().map(|p| p.point.clone()).unwrap()) + .map(|step| step.ec_point.point.clone()) .enumerate() .collect_vec(); @@ -609,10 +586,7 @@ impl raw_structual_witin, InstancePaddingStrategy::Default, ); - Ok(( - [raw_witin, raw_structual_witin], - lk_multiplicity.into_finalize_result(), - )) + Ok([raw_witin, raw_structual_witin]) } } @@ -631,17 +605,13 @@ mod tests { use crate::{ circuit_builder::{CircuitBuilder, ConstraintSystem}, - e2e::ShardContext, - gadgets::horizen_round_consts, - instructions::{ - Instruction, - global::{GlobalChip, GlobalChipInput, GlobalRecord}, - }, + instructions::global::{GlobalChip, GlobalChipInput, GlobalRecord}, scheme::{ PublicValues, create_backend, create_prover, hal::ProofInput, prover::ZKVMProver, septic_curve::SepticPoint, verifier::ZKVMVerifier, }, structs::{ComposedConstrainSystem, PointAndEval, ProgramParams, RAMType, ZKVMProvingKey}, + tables::TableCircuit, }; use multilinear_extensions::mle::IntoMLE; use p3::field::PrimeField32; @@ -664,16 +634,13 @@ mod tests { .init(); // init global chip with horizen_rc_consts - let rc = horizen_round_consts(); let perm = ::get_default_perm(); - let global_chip = GlobalChip:: { rc, perm }; let mut cs = ConstraintSystem::new(|| "global chip test"); let mut cb = CircuitBuilder::new(&mut cs); - let (config, gkr_circuit) = global_chip - .build_gkr_iop_circuit(&mut cb, &ProgramParams::default()) - .unwrap(); + let (config, gkr_circuit) = + GlobalChip::build_gkr_iop_circuit(&mut cb, &ProgramParams::default()).unwrap(); // create a bunch of random memory read/write records let n_global_reads = 1700; @@ -712,10 +679,18 @@ mod tests { }) .collect::>(); - let global_ec_sum: SepticPoint = global_reads + let input = global_writes // local reads + .into_iter() + .chain(global_reads) // local writes + .map(|record| { + let ec_point = record.to_ec_point::(&perm); + GlobalChipInput { record, ec_point } + }) + .collect::>(); + + let global_ec_sum: SepticPoint = input .iter() - .chain(global_writes.iter()) - .map(|record| record.to_ec_point::(&global_chip.perm).point) + .map(|record| record.ec_point.point.clone()) .sum(); let public_value = PublicValues::new( @@ -733,27 +708,20 @@ mod tests { .map(|fe| fe.as_canonical_u32()) .collect_vec(), ); - let mut shard_context = ShardContext::default(); + // assign witness - let (witness, _) = GlobalChip::assign_instances( + let witness = GlobalChip::assign_instances( &config, - &mut shard_context, cs.num_witin as usize, cs.num_structural_witin as usize, - global_writes // local reads - .into_iter() - .chain(global_reads) // local writes - .map(|record| GlobalChipInput { - record, - ec_point: None, - }) - .collect::>(), + &[], + &input, ) .unwrap(); let composed_cs = ComposedConstrainSystem { zkvm_v1_css: cs, - gkr_circuit: Some(gkr_circuit), + gkr_circuit, }; let pk = composed_cs.key_gen(); diff --git a/ceno_zkvm/src/instructions/riscv/rv32im/mmu.rs b/ceno_zkvm/src/instructions/riscv/rv32im/mmu.rs index 82a8d0c91..6e24f8f10 100644 --- a/ceno_zkvm/src/instructions/riscv/rv32im/mmu.rs +++ b/ceno_zkvm/src/instructions/riscv/rv32im/mmu.rs @@ -1,17 +1,19 @@ use crate::{ e2e::ShardContext, error::ZKVMError, + instructions::global::{GlobalChip, GlobalChipInput, GlobalRecord}, structs::{ProgramParams, ZKVMConstraintSystem, ZKVMFixedTraces, ZKVMWitnesses}, tables::{ DynVolatileRamTable, HeapInitCircuit, HeapTable, HintsCircuit, LocalFinalCircuit, - MemFinalRecord, MemInitRecord, NonVolatileTable, PubIOCircuit, PubIOTable, RBCircuit, - RegTable, RegTableInitCircuit, StackInitCircuit, StackTable, StaticMemInitCircuit, - StaticMemTable, TableCircuit, + MemFinalRecord, MemInitRecord, NonVolatileTable, PubIOCircuit, PubIOTable, RegTable, + RegTableInitCircuit, StackInitCircuit, StackTable, StaticMemInitCircuit, StaticMemTable, + TableCircuit, }, }; use ceno_emul::{Addr, Cycle, IterAddresses, WORD_SIZE, Word}; -use ff_ext::ExtensionField; +use ff_ext::{ExtensionField, PoseidonField}; use itertools::{Itertools, chain}; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator as _}; use std::{collections::HashSet, iter::zip, ops::Range, sync::Arc}; use witness::InstancePaddingStrategy; @@ -31,7 +33,7 @@ pub struct MmuConfig<'a, E: ExtensionField> { /// finalized circuit for all MMIO pub local_final_circuit: as TableCircuit>::TableConfig, /// ram bus to deal with cross shard read/write - pub ram_bus_circuit: as TableCircuit>::TableConfig, + pub ram_bus_circuit: as TableCircuit>::TableConfig, pub params: ProgramParams, } @@ -47,7 +49,7 @@ impl MmuConfig<'_, E> { let stack_init_config = cs.register_table_circuit::>(); let heap_init_config = cs.register_table_circuit::>(); let local_final_circuit = cs.register_table_circuit::>(); - let ram_bus_circuit = cs.register_table_circuit::>(); + let ram_bus_circuit = cs.register_table_circuit::>(); Self { reg_init_config, @@ -94,7 +96,7 @@ impl MmuConfig<'_, E> { fixed.register_table_circuit::>(cs, &self.stack_init_config, &()); fixed.register_table_circuit::>(cs, &self.heap_init_config, &()); fixed.register_table_circuit::>(cs, &self.local_final_circuit, &()); - fixed.register_table_circuit::>(cs, &self.ram_bus_circuit, &()); + // fixed.register_table_circuit::>(cs, &self.ram_bus_circuit, &()); } #[allow(clippy::too_many_arguments)] @@ -163,7 +165,43 @@ impl MmuConfig<'_, E> { &(shard_ctx, all_records.as_slice()), )?; - witness.assign_table_circuit::>(cs, &self.ram_bus_circuit, shard_ctx)?; + let perm = ::get_default_perm(); + let global_input = shard_ctx + .read_records() + .par_iter() + .chain(shard_ctx.write_records().par_iter()) + .flat_map_iter(|records| { + records.iter().map(|(vma, record)| { + let addr = match record.ram_type { + gkr_iop::RAMType::Register => record.id as u32, + gkr_iop::RAMType::Memory => (*vma).into(), + _ => unreachable!(), + }; + let (is_write, local_clk, global_clk) = if record.prev_value.is_some() { + // global write + (true, record.cycle, record.cycle) + } else { + (false, 0, record.prev_cycle) + }; + let global_rw = GlobalRecord { + addr, + ram_type: record.ram_type, + value: record.value, + shard: record.prev_cycle, // TODO: extract shard id properly + local_clk: local_clk, + global_clk: global_clk, + is_write: is_write, + }; + + let ec_point = global_rw.to_ec_point(&perm); + GlobalChipInput { + record: global_rw, + ec_point, + } + }) + }) + .collect::>(); + witness.assign_table_circuit::>(cs, &self.ram_bus_circuit, &global_input)?; Ok(()) } diff --git a/ceno_zkvm/src/scheme/verifier.rs b/ceno_zkvm/src/scheme/verifier.rs index 2dfc21c8a..1e1d738e6 100644 --- a/ceno_zkvm/src/scheme/verifier.rs +++ b/ceno_zkvm/src/scheme/verifier.rs @@ -9,7 +9,7 @@ use crate::{ error::ZKVMError, scheme::{ constants::{NUM_FANIN, NUM_FANIN_LOGUP, SEPTIC_EXTENSION_DEGREE}, - septic_curve::SepticExtension, + septic_curve::{SepticExtension, SepticPoint}, }, structs::{ ComposedConstrainSystem, EccQuarkProof, PointAndEval, TowerProofs, VerifyingKey, @@ -372,13 +372,36 @@ impl> ZKVMVerifier // to store the internal partial sums for ecc additions log2_num_instances += 1; } - println!("{log2_num_instances}"); let num_var_with_rotation = log2_num_instances + composed_cs.rotation_vars().unwrap_or(0); // verify ecc proof if exists if composed_cs.has_ecc_ops() { + tracing::debug!("verifying ecc proof..."); assert!(proof.ecc_proof.is_some()); let ecc_proof = proof.ecc_proof.as_ref().unwrap(); + + let xy = cs + .ec_final_sum + .iter() + .map(|expr| { + eval_by_expr_with_instance(&[], &[], &[], pi, challenges, &expr) + .right() + .and_then(|v| v.as_base()) + .unwrap() + }) + .collect_vec(); + let x: SepticExtension = xy[0..SEPTIC_EXTENSION_DEGREE].into(); + let y: SepticExtension = xy[SEPTIC_EXTENSION_DEGREE..].into(); + + assert_eq!( + SepticPoint { + x, + y, + is_infinity: false, + }, + ecc_proof.sum + ); + // assert ec sum in public input matches that in ecc proof EccVerifier::new().verify_ecc_proof(ecc_proof, transcript)?; } diff --git a/ceno_zkvm/src/structs.rs b/ceno_zkvm/src/structs.rs index 57202bd87..54ffaeb12 100644 --- a/ceno_zkvm/src/structs.rs +++ b/ceno_zkvm/src/structs.rs @@ -7,7 +7,7 @@ use crate::{ state::StateCircuit, tables::{RMMCollections, TableCircuit}, }; -use ceno_emul::{CENO_PLATFORM, Platform, StepRecord}; +use ceno_emul::{CENO_PLATFORM, Platform}; use ff_ext::ExtensionField; use gkr_iop::{gkr::GKRCircuit, tables::LookupTable, utils::lk_multiplicity::Multiplicity}; use itertools::Itertools; @@ -336,12 +336,12 @@ impl ZKVMWitnesses { self.lk_mlts.get(name) } - pub fn assign_opcode_circuit>( + pub fn assign_opcode_circuit>( &mut self, cs: &ZKVMConstraintSystem, shard_ctx: &mut ShardContext, config: &OC::InstructionConfig, - records: Vec, + records: Vec, ) -> Result<(), ZKVMError> { assert!(self.combined_lk_mlt.is_none());