diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 1444b61f8..dd9a6cafb 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -55,17 +55,16 @@ jobs: MOCK_PROVING: 1 run: cargo run --package ceno_zkvm --features sanity-check --bin e2e -- --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/debug/examples/fibonacci - - name: Run fibonacci (debug) + feature u16limb_circuit + - name: Run fibonacci (release) env: - RUST_LOG: debug RUSTFLAGS: "-C opt-level=3" - run: cargo run --package ceno_zkvm --features u16limb_circuit --bin e2e -- --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/debug/examples/fibonacci - + run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci - - name: Run fibonacci (release) + - name: Run fibonacci (release + goldilocks) env: RUSTFLAGS: "-C opt-level=3" - run: cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci + run: cargo run --release --package ceno_zkvm --no-default-features --features goldilocks --bin e2e -- --field=goldilocks --platform=ceno --hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci + - name: Install cargo make run: | diff --git a/ceno_zkvm/Cargo.toml b/ceno_zkvm/Cargo.toml index 52c17447c..2a6f8dc8a 100644 --- a/ceno_zkvm/Cargo.toml +++ b/ceno_zkvm/Cargo.toml @@ -59,9 +59,10 @@ ceno-examples = { path = "../examples-builder" } glob = "0.3" [features] -default = ["forbid_overflow"] +default = ["forbid_overflow", "nightly-features", "u16limb_circuit"] flamegraph = ["pprof2/flamegraph", "pprof2/criterion"] forbid_overflow = [] +goldilocks = ["forbid_overflow", "nightly-features"] jemalloc = ["dep:tikv-jemallocator", "dep:tikv-jemalloc-ctl"] jemalloc-prof = ["jemalloc", "tikv-jemallocator?/profiling"] nightly-features = [ diff --git a/ceno_zkvm/benches/fibonacci.rs b/ceno_zkvm/benches/fibonacci.rs index 8887b7ec0..e13f12265 100644 --- a/ceno_zkvm/benches/fibonacci.rs +++ b/ceno_zkvm/benches/fibonacci.rs @@ -10,7 +10,7 @@ use ceno_zkvm::{ mod alloc; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::BasefoldDefault; use transcript::BasicTranscript; @@ -26,7 +26,7 @@ criterion_main!(fibonacci_prove_group); const NUM_SAMPLES: usize = 10; type Pcs = BasefoldDefault; -type E = GoldilocksExt2; +type E = BabyBearExt4; // Relevant init data for fibonacci run fn setup() -> (Program, Platform) { diff --git a/ceno_zkvm/benches/fibonacci_witness.rs b/ceno_zkvm/benches/fibonacci_witness.rs index 73cf8f113..7339c32b1 100644 --- a/ceno_zkvm/benches/fibonacci_witness.rs +++ b/ceno_zkvm/benches/fibonacci_witness.rs @@ -7,7 +7,7 @@ use ceno_zkvm::{ use std::{fs, path::PathBuf, rc::Rc, time::Duration}; mod alloc; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::BasefoldDefault; @@ -21,7 +21,7 @@ criterion_main!(fibonacci); const NUM_SAMPLES: usize = 10; type Pcs = BasefoldDefault; -type E = GoldilocksExt2; +type E = BabyBearExt4; // Relevant init data for fibonacci run fn setup() -> (Program, Platform) { @@ -79,5 +79,5 @@ fn fibonacci_witness(c: &mut Criterion) { group.finish(); - type E = GoldilocksExt2; + type E = BabyBearExt4; } diff --git a/ceno_zkvm/benches/is_prime.rs b/ceno_zkvm/benches/is_prime.rs index 26c1904dd..06cc5a8a6 100644 --- a/ceno_zkvm/benches/is_prime.rs +++ b/ceno_zkvm/benches/is_prime.rs @@ -8,7 +8,7 @@ use ceno_zkvm::{ }; mod alloc; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::BasefoldDefault; @@ -22,7 +22,7 @@ criterion_main!(is_prime); const NUM_SAMPLES: usize = 10; type Pcs = BasefoldDefault; -type E = GoldilocksExt2; +type E = BabyBearExt4; // Relevant init data for fibonacci run fn setup() -> (Program, Platform) { @@ -75,6 +75,4 @@ fn is_prime_1(c: &mut Criterion) { group.finish(); } - - type E = GoldilocksExt2; } diff --git a/ceno_zkvm/benches/keccak.rs b/ceno_zkvm/benches/keccak.rs index 96506f37f..929b4d1d5 100644 --- a/ceno_zkvm/benches/keccak.rs +++ b/ceno_zkvm/benches/keccak.rs @@ -9,7 +9,7 @@ use ceno_zkvm::{ mod alloc; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::BasefoldDefault; @@ -24,7 +24,7 @@ criterion_main!(keccak_prove_group); const NUM_SAMPLES: usize = 10; type Pcs = BasefoldDefault; -type E = GoldilocksExt2; +type E = BabyBearExt4; // Relevant init data for keccak run fn setup() -> (Program, Platform) { diff --git a/ceno_zkvm/benches/lookup_keccakf.rs b/ceno_zkvm/benches/lookup_keccakf.rs index 7c9659214..cf5d75396 100644 --- a/ceno_zkvm/benches/lookup_keccakf.rs +++ b/ceno_zkvm/benches/lookup_keccakf.rs @@ -2,7 +2,7 @@ use std::time::Duration; use ceno_zkvm::precompiles::{run_faster_keccakf, setup_lookup_keccak_gkr_circuit}; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use itertools::Itertools; use mpcs::BasefoldDefault; @@ -41,14 +41,13 @@ fn keccak_f_fn(c: &mut Criterion) { let circuit = setup_lookup_keccak_gkr_circuit().expect("setup circuit error"); #[allow(clippy::unit_arg)] - let _ = - run_faster_keccakf::>( - circuit, - black_box(states), - false, - false, - ) - .expect("unable to get proof"); + let _ = run_faster_keccakf::>( + circuit, + black_box(states), + false, + false, + ) + .expect("unable to get proof"); let elapsed = instant.elapsed(); println!( "keccak_f::create_proof, instances = {}, time = {}", diff --git a/ceno_zkvm/benches/quadratic_sorting.rs b/ceno_zkvm/benches/quadratic_sorting.rs index 2dd9654d4..377dccd99 100644 --- a/ceno_zkvm/benches/quadratic_sorting.rs +++ b/ceno_zkvm/benches/quadratic_sorting.rs @@ -8,7 +8,7 @@ use ceno_zkvm::{ }; mod alloc; use criterion::*; -use ff_ext::GoldilocksExt2; +use ff_ext::BabyBearExt4; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::BasefoldDefault; use rand::{RngCore, SeedableRng}; @@ -23,7 +23,7 @@ criterion_main!(quadratic_sorting); const NUM_SAMPLES: usize = 10; type Pcs = BasefoldDefault; -type E = GoldilocksExt2; +type E = BabyBearExt4; // Relevant init data for fibonacci run fn setup() -> (Program, Platform) { @@ -77,6 +77,4 @@ fn quadratic_sorting_1(c: &mut Criterion) { group.finish(); } - - type E = GoldilocksExt2; } diff --git a/ceno_zkvm/benches/riscv_add.rs b/ceno_zkvm/benches/riscv_add.rs index 8c26bde2f..dfa4022cb 100644 --- a/ceno_zkvm/benches/riscv_add.rs +++ b/ceno_zkvm/benches/riscv_add.rs @@ -10,10 +10,10 @@ mod alloc; use criterion::*; use ceno_zkvm::scheme::constants::MAX_NUM_VARIABLES; -use ff_ext::GoldilocksExt2; use gkr_iop::cpu::{CpuBackend, CpuProver}; use mpcs::{BasefoldDefault, PolynomialCommitmentScheme, SecurityLevel}; +use ff_ext::BabyBearExt4; use rand::rngs::OsRng; use transcript::{BasicTranscript, Transcript}; use witness::RowMajorMatrix; @@ -121,5 +121,5 @@ fn bench_add(c: &mut Criterion) { group.finish(); } - type E = GoldilocksExt2; + type E = BabyBearExt4; } diff --git a/ceno_zkvm/src/bin/e2e.rs b/ceno_zkvm/src/bin/e2e.rs index 8a180749e..72936524b 100644 --- a/ceno_zkvm/src/bin/e2e.rs +++ b/ceno_zkvm/src/bin/e2e.rs @@ -271,7 +271,7 @@ fn main() { max_steps, args.proof_file, args.vk_file, - Checkpoint::PrepVerify, // FIXME: when whir and babybear is ready + Checkpoint::Complete, ) } (PcsKind::Whir, FieldType::Goldilocks) => { diff --git a/ceno_zkvm/src/e2e.rs b/ceno_zkvm/src/e2e.rs index a5292cb6e..b4985f67b 100644 --- a/ceno_zkvm/src/e2e.rs +++ b/ceno_zkvm/src/e2e.rs @@ -71,8 +71,8 @@ pub enum PcsKind { )] pub enum FieldType { #[default] - Goldilocks, BabyBear, + Goldilocks, } pub struct FullMemState { diff --git a/ceno_zkvm/src/instructions/riscv/im_insn.rs b/ceno_zkvm/src/instructions/riscv/im_insn.rs index ffa5628d0..5fa6cd501 100644 --- a/ceno_zkvm/src/instructions/riscv/im_insn.rs +++ b/ceno_zkvm/src/instructions/riscv/im_insn.rs @@ -23,6 +23,7 @@ pub struct IMInstructionConfig { } impl IMInstructionConfig { + #[allow(clippy::too_many_arguments)] pub fn construct_circuit( circuit_builder: &mut CircuitBuilder, insn_kind: InsnKind, diff --git a/ceno_zkvm/src/instructions/riscv/rv32im.rs b/ceno_zkvm/src/instructions/riscv/rv32im.rs index 4cd9875db..c33812243 100644 --- a/ceno_zkvm/src/instructions/riscv/rv32im.rs +++ b/ceno_zkvm/src/instructions/riscv/rv32im.rs @@ -6,6 +6,8 @@ use super::{ use crate::instructions::riscv::auipc::AuipcInstruction; #[cfg(feature = "u16limb_circuit")] use crate::instructions::riscv::lui::LuiInstruction; +#[cfg(not(feature = "u16limb_circuit"))] +use crate::tables::PowTableCircuit; use crate::{ error::ZKVMError, instructions::{ @@ -28,9 +30,8 @@ use crate::{ }, structs::{ZKVMConstraintSystem, ZKVMFixedTraces, ZKVMWitnesses}, tables::{ - AndTableCircuit, LtuTableCircuit, OrTableCircuit, PowTableCircuit, TableCircuit, - U5TableCircuit, U8TableCircuit, U14TableCircuit, U16TableCircuit, U18TableCircuit, - XorTableCircuit, + AndTableCircuit, LtuTableCircuit, OrTableCircuit, TableCircuit, U5TableCircuit, + U8TableCircuit, U14TableCircuit, U16TableCircuit, U18TableCircuit, XorTableCircuit, }, }; use ceno_emul::{ @@ -127,6 +128,7 @@ pub struct Rv32imConfig { pub or_table_config: as TableCircuit>::TableConfig, pub xor_table_config: as TableCircuit>::TableConfig, pub ltu_config: as TableCircuit>::TableConfig, + #[cfg(not(feature = "u16limb_circuit"))] pub pow_config: as TableCircuit>::TableConfig, } @@ -204,6 +206,7 @@ impl Rv32imConfig { let or_table_config = cs.register_table_circuit::>(); let xor_table_config = cs.register_table_circuit::>(); let ltu_config = cs.register_table_circuit::>(); + #[cfg(not(feature = "u16limb_circuit"))] let pow_config = cs.register_table_circuit::>(); Self { @@ -272,6 +275,7 @@ impl Rv32imConfig { or_table_config, xor_table_config, ltu_config, + #[cfg(not(feature = "u16limb_circuit"))] pow_config, } } @@ -350,6 +354,7 @@ impl Rv32imConfig { fixed.register_table_circuit::>(cs, &self.or_table_config, &()); fixed.register_table_circuit::>(cs, &self.xor_table_config, &()); fixed.register_table_circuit::>(cs, &self.ltu_config, &()); + #[cfg(not(feature = "u16limb_circuit"))] fixed.register_table_circuit::>(cs, &self.pow_config, &()); } @@ -480,6 +485,7 @@ impl Rv32imConfig { witness.assign_table_circuit::>(cs, &self.or_table_config, &())?; witness.assign_table_circuit::>(cs, &self.xor_table_config, &())?; witness.assign_table_circuit::>(cs, &self.ltu_config, &())?; + #[cfg(not(feature = "u16limb_circuit"))] witness.assign_table_circuit::>(cs, &self.pow_config, &())?; Ok(()) diff --git a/gkr_iop/src/cpu/mod.rs b/gkr_iop/src/cpu/mod.rs index 0ff825508..b159e2373 100644 --- a/gkr_iop/src/cpu/mod.rs +++ b/gkr_iop/src/cpu/mod.rs @@ -35,7 +35,7 @@ impl> Default for CpuBacke impl> CpuBackend { pub fn new(max_poly_size_log2: usize, security_level: SecurityLevel) -> Self { - let param = PCS::setup(E::BaseField::TWO_ADICITY, security_level).unwrap(); + let param = PCS::setup(1 << E::BaseField::TWO_ADICITY, security_level).unwrap(); let (pp, vp) = PCS::trim(param, 1 << max_poly_size_log2).unwrap(); Self { pp,