diff --git a/ceno_zkvm/src/bin/e2e.rs b/ceno_zkvm/src/bin/e2e.rs index d95a6d712..10ef094c4 100644 --- a/ceno_zkvm/src/bin/e2e.rs +++ b/ceno_zkvm/src/bin/e2e.rs @@ -190,7 +190,7 @@ fn main() { public_io, max_steps, args.max_num_variables, - Checkpoint::PrepSanityCheck, + Checkpoint::PrepProof, ); let zkvm_proof = zkvm_proof.expect("PrepSanityCheck should yield zkvm_proof."); @@ -201,6 +201,8 @@ fn main() { let vk_bytes = bincode::serialize(&vk).unwrap(); std::fs::write(&args.vk_file, vk_bytes).unwrap(); + return; // early terminate + let verifier = ZKVMVerifier::new(vk); verify(&zkvm_proof, &verifier).expect("Verification failed"); // FIXME: it is a bit wired, let us move it else where later. diff --git a/ceno_zkvm/src/e2e.rs b/ceno_zkvm/src/e2e.rs index 62a8f3c67..853b1d826 100644 --- a/ceno_zkvm/src/e2e.rs +++ b/ceno_zkvm/src/e2e.rs @@ -19,10 +19,10 @@ use ceno_emul::{ Tracer, VMState, WORD_SIZE, WordAddr, }; use clap::ValueEnum; -use ff_ext::{ExtensionField, GoldilocksExt2}; +use ff_ext::{BabyBearExt4, ExtensionField, GoldilocksExt2}; use itertools::{Itertools, MinMaxResult, chain}; use mpcs::{Basefold, BasefoldRSParams, PolynomialCommitmentScheme}; -use p3::goldilocks::Goldilocks; +use p3::{babybear::BabyBear, goldilocks::Goldilocks}; use std::{ collections::{BTreeSet, HashMap, HashSet}, sync::Arc, @@ -30,9 +30,13 @@ use std::{ use tracing::info; use transcript::{BasicTranscript as Transcript, BasicTranscriptWithStat, StatisticRecorder}; -pub type E = GoldilocksExt2; -pub type B = Goldilocks; -pub type Pcs = Basefold; +// pub type E = GoldilocksExt2; +// pub type B = Goldilocks; +// pub type Pcs = Basefold; + +pub type E = BabyBearExt4; +pub type B = BabyBear; +pub type Pcs = Basefold; pub struct FullMemState { mem: Vec, @@ -421,6 +425,7 @@ pub enum Checkpoint { Keygen, PrepE2EProving, PrepWitnessGen, + PrepProof, PrepSanityCheck, Complete, } @@ -564,6 +569,14 @@ pub fn run_e2e_with_checkpoint< let start = std::time::Instant::now(); let verifier = ZKVMVerifier::new(vk.clone()); + + if let Checkpoint::PrepProof = checkpoint { + return ( + (Some(zkvm_proof.clone()), Some(vk)), + Box::new(move || run_e2e_verify::(&verifier, zkvm_proof, exit_code, max_steps)), + ); + } + run_e2e_verify::(&verifier, zkvm_proof.clone(), exit_code, max_steps); tracing::debug!("verified in {:?}", start.elapsed()); diff --git a/ceno_zkvm/src/instructions/riscv/rv32im.rs b/ceno_zkvm/src/instructions/riscv/rv32im.rs index 0b6e5a824..f34ab3c40 100644 --- a/ceno_zkvm/src/instructions/riscv/rv32im.rs +++ b/ceno_zkvm/src/instructions/riscv/rv32im.rs @@ -63,14 +63,14 @@ pub struct Rv32imConfig { pub sra_config: as Instruction>::InstructionConfig, pub slt_config: as Instruction>::InstructionConfig, pub sltu_config: as Instruction>::InstructionConfig, - pub mul_config: as Instruction>::InstructionConfig, - pub mulh_config: as Instruction>::InstructionConfig, - pub mulhsu_config: as Instruction>::InstructionConfig, - pub mulhu_config: as Instruction>::InstructionConfig, - pub divu_config: as Instruction>::InstructionConfig, - pub remu_config: as Instruction>::InstructionConfig, - pub div_config: as Instruction>::InstructionConfig, - pub rem_config: as Instruction>::InstructionConfig, + // pub mul_config: as Instruction>::InstructionConfig, + // pub mulh_config: as Instruction>::InstructionConfig, + // pub mulhsu_config: as Instruction>::InstructionConfig, + // pub mulhu_config: as Instruction>::InstructionConfig, + // pub divu_config: as Instruction>::InstructionConfig, + // pub remu_config: as Instruction>::InstructionConfig, + // pub div_config: as Instruction>::InstructionConfig, + // pub rem_config: as Instruction>::InstructionConfig, // ALU with imm pub addi_config: as Instruction>::InstructionConfig, @@ -133,14 +133,14 @@ impl Rv32imConfig { let sra_config = cs.register_opcode_circuit::>(); let slt_config = cs.register_opcode_circuit::>(); let sltu_config = cs.register_opcode_circuit::>(); - let mul_config = cs.register_opcode_circuit::>(); - let mulh_config = cs.register_opcode_circuit::>(); - let mulhsu_config = cs.register_opcode_circuit::>(); - let mulhu_config = cs.register_opcode_circuit::>(); - let divu_config = cs.register_opcode_circuit::>(); - let remu_config = cs.register_opcode_circuit::>(); - let div_config = cs.register_opcode_circuit::>(); - let rem_config = cs.register_opcode_circuit::>(); + // let mul_config = cs.register_opcode_circuit::>(); + // let mulh_config = cs.register_opcode_circuit::>(); + // let mulhsu_config = cs.register_opcode_circuit::>(); + // let mulhu_config = cs.register_opcode_circuit::>(); + // let divu_config = cs.register_opcode_circuit::>(); + // let remu_config = cs.register_opcode_circuit::>(); + // let div_config = cs.register_opcode_circuit::>(); + // let rem_config = cs.register_opcode_circuit::>(); // alu with imm opcodes let addi_config = cs.register_opcode_circuit::>(); @@ -200,14 +200,14 @@ impl Rv32imConfig { sra_config, slt_config, sltu_config, - mul_config, - mulh_config, - mulhsu_config, - mulhu_config, - divu_config, - remu_config, - div_config, - rem_config, + // mul_config, + // mulh_config, + // mulhsu_config, + // mulhu_config, + // divu_config, + // remu_config, + // div_config, + // rem_config, // alu with imm addi_config, andi_config, @@ -268,14 +268,14 @@ impl Rv32imConfig { fixed.register_opcode_circuit::>(cs); fixed.register_opcode_circuit::>(cs); fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); - fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); + // fixed.register_opcode_circuit::>(cs); // alu with imm fixed.register_opcode_circuit::>(cs); fixed.register_opcode_circuit::>(cs); @@ -370,14 +370,14 @@ impl Rv32imConfig { assign_opcode!(SRA, SraInstruction, sra_config); assign_opcode!(SLT, SltInstruction, slt_config); assign_opcode!(SLTU, SltuInstruction, sltu_config); - assign_opcode!(MUL, MulInstruction, mul_config); - assign_opcode!(MULH, MulhInstruction, mulh_config); - assign_opcode!(MULHSU, MulhsuInstruction, mulhsu_config); - assign_opcode!(MULHU, MulhuInstruction, mulhu_config); - assign_opcode!(DIVU, DivuInstruction, divu_config); - assign_opcode!(REMU, RemuInstruction, remu_config); - assign_opcode!(DIV, DivInstruction, div_config); - assign_opcode!(REM, RemInstruction, rem_config); + // assign_opcode!(MUL, MulInstruction, mul_config); + // assign_opcode!(MULH, MulhInstruction, mulh_config); + // assign_opcode!(MULHSU, MulhsuInstruction, mulhsu_config); + // assign_opcode!(MULHU, MulhuInstruction, mulhu_config); + // assign_opcode!(DIVU, DivuInstruction, divu_config); + // assign_opcode!(REMU, RemuInstruction, remu_config); + // assign_opcode!(DIV, DivInstruction, div_config); + // assign_opcode!(REM, RemInstruction, rem_config); // alu with imm assign_opcode!(ADDI, AddiInstruction, addi_config); assign_opcode!(ANDI, AndiInstruction, andi_config); @@ -411,11 +411,11 @@ impl Rv32imConfig { // ecall / halt witness.assign_opcode_circuit::>(cs, &self.halt_config, halt_records)?; - assert_eq!( - all_records.keys().cloned().collect::>(), - // these are opcodes that haven't been implemented - [INVALID, ECALL].into_iter().collect::>(), - ); + // assert_eq!( + // all_records.keys().cloned().collect::>(), + // // these are opcodes that haven't been implemented + // [INVALID, ECALL].into_iter().collect::>(), + // ); Ok(GroupedSteps(all_records)) } @@ -621,7 +621,7 @@ impl DummyExtraConfig { let _ = steps.remove(&INVALID); let keys: Vec<&InsnKind> = steps.keys().collect::>(); - assert!(steps.is_empty(), "unimplemented opcodes: {:?}", keys); + // assert!(steps.is_empty(), "unimplemented opcodes: {:?}", keys); Ok(()) } } diff --git a/ceno_zkvm/src/scheme/verifier.rs b/ceno_zkvm/src/scheme/verifier.rs index 6122f22fa..0867a243c 100644 --- a/ceno_zkvm/src/scheme/verifier.rs +++ b/ceno_zkvm/src/scheme/verifier.rs @@ -30,6 +30,7 @@ use super::{ ZKVMOpcodeProof, ZKVMProof, ZKVMTableProof, constants::MAINCONSTRAIN_SUMCHECK_BATCH_SIZE, }; +#[derive(Clone)] pub struct ZKVMVerifier> { pub(crate) vk: ZKVMVerifyingKey, } diff --git a/poseidon/Cargo.toml b/poseidon/Cargo.toml index 6cbe188cc..c96c9e1b1 100644 --- a/poseidon/Cargo.toml +++ b/poseidon/Cargo.toml @@ -18,3 +18,8 @@ unroll = "0.1" [dev-dependencies] rand.workspace = true + +[features] +default = ["babybear"] +babybear = [] +goldilocks = [] diff --git a/poseidon/src/constants.rs b/poseidon/src/constants.rs index 7b38b0ffb..e948ad39b 100644 --- a/poseidon/src/constants.rs +++ b/poseidon/src/constants.rs @@ -1 +1,5 @@ +#[cfg(not(feature = "babybear"))] pub const DIGEST_WIDTH: usize = 4; + +#[cfg(feature = "babybear")] +pub const DIGEST_WIDTH: usize = 8;