From 6266b242edad2d315b753155a6538ea900be2b9c Mon Sep 17 00:00:00 2001 From: Han Date: Tue, 2 Dec 2025 21:07:35 +0900 Subject: [PATCH] Refactor crate `ere-io` (#233) --- .github/workflows/test-common.yml | 2 +- Cargo.lock | 134 +++++++++++++++++++++- Cargo.toml | 6 +- crates/dockerized/src/zkvm.rs | 67 ++++++++--- crates/io-serde/Cargo.toml | 15 --- crates/io-serde/src/bincode.rs | 62 ---------- crates/io-serde/src/lib.rs | 22 ---- crates/io/Cargo.toml | 22 ++++ crates/io/src/lib.rs | 31 +++++ crates/io/src/rkyv.rs | 57 +++++++++ crates/io/src/serde.rs | 44 +++++++ crates/io/src/serde/bincode.rs | 67 +++++++++++ crates/test-utils/Cargo.toml | 3 +- crates/test-utils/src/host.rs | 67 +++++++---- crates/test-utils/src/lib.rs | 2 + crates/test-utils/src/program.rs | 25 ++-- crates/test-utils/src/program/basic.rs | 54 ++++----- crates/zkvm-interface/platform/src/lib.rs | 15 ++- crates/zkvm/airbender/src/zkvm.rs | 21 ++-- crates/zkvm/jolt/src/zkvm.rs | 21 ++-- crates/zkvm/miden/src/zkvm.rs | 2 +- crates/zkvm/nexus/src/zkvm.rs | 21 ++-- crates/zkvm/openvm/src/zkvm.rs | 21 ++-- crates/zkvm/pico/src/zkvm.rs | 21 ++-- crates/zkvm/risc0/Cargo.toml | 2 +- crates/zkvm/risc0/platform/src/lib.rs | 4 +- crates/zkvm/risc0/src/zkvm.rs | 21 ++-- crates/zkvm/sp1/src/zkvm.rs | 23 ++-- crates/zkvm/ziren/src/zkvm.rs | 21 ++-- crates/zkvm/zisk/src/zkvm.rs | 21 ++-- tests/airbender/basic/src/main.rs | 3 +- tests/jolt/basic/src/main.rs | 7 +- tests/nexus/basic/src/main.rs | 7 +- tests/openvm/basic/src/main.rs | 3 +- tests/pico/basic/src/main.rs | 7 +- tests/risc0/basic/src/main.rs | 7 +- tests/sp1/basic/src/main.rs | 7 +- tests/ziren/basic/src/main.rs | 7 +- tests/zisk/basic_rust/src/main.rs | 7 +- 39 files changed, 664 insertions(+), 285 deletions(-) delete mode 100644 crates/io-serde/Cargo.toml delete mode 100644 crates/io-serde/src/bincode.rs delete mode 100644 crates/io-serde/src/lib.rs create mode 100644 crates/io/Cargo.toml create mode 100644 crates/io/src/lib.rs create mode 100644 crates/io/src/rkyv.rs create mode 100644 crates/io/src/serde.rs create mode 100644 crates/io/src/serde/bincode.rs diff --git a/.github/workflows/test-common.yml b/.github/workflows/test-common.yml index 4b42c71..83f2581 100644 --- a/.github/workflows/test-common.yml +++ b/.github/workflows/test-common.yml @@ -21,7 +21,7 @@ jobs: run_test: true - crate: ere-dockerized run_test: false # They are run in per-zkVM workflows - - crate: ere-io-serde + - crate: ere-io run_test: true - crate: ere-build-utils run_test: true diff --git a/Cargo.lock b/Cargo.lock index 7aa637c..100b994 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2066,6 +2066,29 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" +[[package]] +name = "bytecheck" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "bytemuck" version = "1.23.1" @@ -3721,10 +3744,11 @@ dependencies = [ ] [[package]] -name = "ere-io-serde" +name = "ere-io" version = "0.0.15" dependencies = [ "bincode 2.0.1", + "rkyv", "serde", ] @@ -3912,7 +3936,7 @@ dependencies = [ "borsh", "ere-build-utils", "ere-compile-utils", - "ere-io-serde", + "ere-io", "ere-test-utils", "ere-zkvm-interface", "risc0-binfmt", @@ -3975,11 +3999,12 @@ dependencies = [ name = "ere-test-utils" version = "0.0.15" dependencies = [ - "ere-io-serde", + "ere-io", "ere-platform-trait", "ere-zkvm-interface", "rand 0.9.2", "serde", + "serde_bytes", "sha2", ] @@ -6997,6 +7022,26 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -10777,6 +10822,26 @@ dependencies = [ "worker", ] +[[package]] +name = "ptr_meta" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "puffin" version = "0.19.1" @@ -10907,6 +10972,15 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "rancor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +dependencies = [ + "ptr_meta", +] + [[package]] name = "rand" version = "0.8.5" @@ -11152,6 +11226,15 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.27" @@ -11722,7 +11805,7 @@ dependencies = [ "field", "inferno", "memmap2", - "object 0.35.0", + "object 0.37.3", "poseidon2", "rand 0.9.2", "ringbuffer", @@ -11738,6 +11821,33 @@ dependencies = [ "heapless", ] +[[package]] +name = "rkyv" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" +dependencies = [ + "bytecheck", + "hashbrown 0.15.3", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd83f5f173ff41e00337d97f6572e416d022ef8a19f371817259ae960324c482" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "rlp" version = "0.5.2" @@ -12398,6 +12508,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.221" @@ -12638,6 +12758,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "simple_asn1" version = "0.6.3" diff --git a/Cargo.toml b/Cargo.toml index 4fcb995..84b9b18 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ members = [ "crates/dockerized/compiler", "crates/dockerized/server", # Utils - "crates/io-serde", + "crates/io", "crates/build-utils", "crates/compile-utils", "crates/test-utils", @@ -62,7 +62,9 @@ postcard = { version = "1.0.8", default-features = false } prost = "0.13" prost-build = "0.13" rand = "0.9.2" +rkyv = { version = "0.8.12", default-features = false } serde = { version = "1.0.219", default-features = false } +serde_bytes = { version = "0.11.19", default-features = false } serde_json = "1.0.142" serde_yaml = "0.9.34" sha2 = { version = "0.10.9", default-features = false } @@ -162,7 +164,7 @@ ere-dockerized = { path = "crates/dockerized" } ere-compiler = { path = "crates/dockerized/compiler" } ere-server = { path = "crates/dockerized/server" } -ere-io-serde = { path = "crates/io-serde" } +ere-io = { path = "crates/io" } ere-build-utils = { path = "crates/build-utils" } ere-compile-utils = { path = "crates/compile-utils" } ere-test-utils = { path = "crates/test-utils" } diff --git a/crates/dockerized/src/zkvm.rs b/crates/dockerized/src/zkvm.rs index 37d60e7..8180481 100644 --- a/crates/dockerized/src/zkvm.rs +++ b/crates/dockerized/src/zkvm.rs @@ -351,7 +351,9 @@ mod test { zkVMKind, zkvm::{DockerizedzkVM, Error}, }; - use ere_test_utils::{host::*, program::basic::BasicProgramInput}; + use ere_test_utils::{ + host::*, io::serde::bincode::BincodeLegacy, program::basic::BasicProgram, + }; use ere_zkvm_interface::zkvm::{ProofKind, ProverResourceType, zkVM}; fn zkvm( @@ -405,8 +407,11 @@ mod test { Airbender, Rust, "basic", - [BasicProgramInput::valid().into_output_sha256()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case().into_output_sha256()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -416,8 +421,11 @@ mod test { Jolt, RustCustomized, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -427,8 +435,11 @@ mod test { Nexus, Rust, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -438,8 +449,11 @@ mod test { OpenVM, RustCustomized, "basic", - [BasicProgramInput::valid().into_output_sha256()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case().into_output_sha256()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -449,8 +463,11 @@ mod test { Pico, RustCustomized, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -460,8 +477,11 @@ mod test { Risc0, RustCustomized, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -471,8 +491,11 @@ mod test { SP1, RustCustomized, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -482,8 +505,11 @@ mod test { Ziren, RustCustomized, "basic", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } @@ -493,8 +519,11 @@ mod test { Zisk, RustCustomized, "basic_rust", - [BasicProgramInput::valid()], - [Vec::new(), BasicProgramInput::invalid().serialized_input()] + [BasicProgram::::valid_test_case()], + [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input() + ] ); } } diff --git a/crates/io-serde/Cargo.toml b/crates/io-serde/Cargo.toml deleted file mode 100644 index c5db767..0000000 --- a/crates/io-serde/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "ere-io-serde" -version.workspace = true -edition.workspace = true -rust-version.workspace = true -license.workspace = true - -[dependencies] -bincode = { workspace = true, features = ["alloc", "serde"] } -serde.workspace = true - -[dev-dependencies] - -[lints] -workspace = true diff --git a/crates/io-serde/src/bincode.rs b/crates/io-serde/src/bincode.rs deleted file mode 100644 index a0847b2..0000000 --- a/crates/io-serde/src/bincode.rs +++ /dev/null @@ -1,62 +0,0 @@ -use crate::IoSerde; -use alloc::vec::Vec; -use bincode::config::{Config, Configuration, Fixint, LittleEndian, NoLimit, Varint}; -use core::{ - error::Error, - fmt::{self, Display, Formatter}, -}; -use serde::{Deserialize, Serialize}; - -pub use bincode::{ - config, - error::{DecodeError, EncodeError}, -}; - -#[derive(Debug)] -pub enum BincodeError { - Encode(EncodeError), - Decode(DecodeError), -} - -impl Display for BincodeError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - Self::Encode(err) => write!(f, "{err:?}"), - Self::Decode(err) => write!(f, "{err:?}"), - } - } -} - -impl Error for BincodeError {} - -/// IO de/serialization implementation with [`bincode`]. -#[derive(Clone, Copy, Debug)] -pub struct Bincode(pub O); - -impl Bincode> { - /// `Bincode` with legacy configuration, same as the default of `bincode@1`. - pub fn legacy() -> Self { - Self(bincode::config::legacy()) - } -} - -impl Bincode> { - /// `Bincode` with standard configuration. - pub fn standard() -> Self { - Self(bincode::config::standard()) - } -} - -impl IoSerde for Bincode { - type Error = BincodeError; - - fn serialize(&self, value: &T) -> Result, Self::Error> { - bincode::serde::encode_to_vec(value, self.0).map_err(BincodeError::Encode) - } - - fn deserialize<'a, T: Deserialize<'a>>(&self, bytes: &'a [u8]) -> Result { - let (value, _) = bincode::serde::borrow_decode_from_slice(bytes, self.0) - .map_err(BincodeError::Decode)?; - Ok(value) - } -} diff --git a/crates/io-serde/src/lib.rs b/crates/io-serde/src/lib.rs deleted file mode 100644 index 6cfd8a1..0000000 --- a/crates/io-serde/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! This crate provides IO de/serialization implementation to be shared between -//! host and guest, if the guest is also written in Rust. - -#![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![no_std] - -extern crate alloc; - -use alloc::vec::Vec; -use core::error::Error; -use serde::{Deserialize, Serialize}; - -pub mod bincode; - -/// IO de/serialization to be shared between host and guest. -pub trait IoSerde { - type Error: Error; - - fn serialize(&self, value: &T) -> Result, Self::Error>; - - fn deserialize<'a, T: Deserialize<'a>>(&self, bytes: &'a [u8]) -> Result; -} diff --git a/crates/io/Cargo.toml b/crates/io/Cargo.toml new file mode 100644 index 0000000..5b4b3c0 --- /dev/null +++ b/crates/io/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "ere-io" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +bincode = { workspace = true, features = ["alloc", "serde"], optional = true } +serde = { workspace = true, optional = true } +rkyv = { workspace = true, features = ["alloc", "bytecheck", "unaligned"], optional = true } + +[dev-dependencies] + +[features] +default = [] +serde = ["dep:serde"] +bincode = ["dep:bincode", "serde"] +rkyv = ["dep:rkyv"] + +[lints] +workspace = true diff --git a/crates/io/src/lib.rs b/crates/io/src/lib.rs new file mode 100644 index 0000000..6c603b9 --- /dev/null +++ b/crates/io/src/lib.rs @@ -0,0 +1,31 @@ +//! This crate provides IO de/serialization implementation to be shared between +//! host and guest, if the guest is also written in Rust. + +#![cfg_attr(not(test), warn(unused_crate_dependencies))] +#![no_std] + +use alloc::vec::Vec; +use core::{error::Error, fmt::Debug}; + +extern crate alloc; + +#[cfg(feature = "serde")] +pub mod serde; + +#[cfg(feature = "rkyv")] +pub mod rkyv; + +/// IO de/serialization to be shared between host and guest. +pub trait Io { + type Input: Clone + Debug + Send + Sync; + type Output: Clone + Debug + Send + Sync + PartialEq; + type Error: 'static + Error + Send + Sync; + + fn serialize_input(input: &Self::Input) -> Result, Self::Error>; + + fn deserialize_input(bytes: &[u8]) -> Result; + + fn serialize_output(output: &Self::Output) -> Result, Self::Error>; + + fn deserialize_output(bytes: &[u8]) -> Result; +} diff --git a/crates/io/src/rkyv.rs b/crates/io/src/rkyv.rs new file mode 100644 index 0000000..98fa3ed --- /dev/null +++ b/crates/io/src/rkyv.rs @@ -0,0 +1,57 @@ +use crate::Io; +use alloc::vec::Vec; +use core::{fmt::Debug, marker::PhantomData}; +use rkyv::{ + Archive, Deserialize, Serialize, + api::high::{HighSerializer, HighValidator}, + bytecheck::CheckBytes, + de::Pool, + rancor::{Error, Strategy}, + ser::allocator::ArenaHandle, + util::AlignedVec, +}; + +pub use rkyv; + +pub struct IoRkyv(PhantomData<(I, O)>); + +impl Io for IoRkyv +where + I: Clone + + Debug + + Send + + Sync + + for<'a> Serialize, Error>> + + Archive, + I::Archived: + for<'a> CheckBytes> + Deserialize>, + O: Clone + + Debug + + Send + + Sync + + PartialEq + + for<'a> Serialize, Error>> + + Archive, + O::Archived: + for<'a> CheckBytes> + Deserialize>, +{ + type Input = I; + type Output = O; + type Error = Error; + + fn serialize_input(input: &Self::Input) -> Result, Self::Error> { + rkyv::to_bytes(input).map(|vec| vec.to_vec()) + } + + fn deserialize_input(bytes: &[u8]) -> Result { + rkyv::from_bytes(bytes) + } + + fn serialize_output(output: &Self::Output) -> Result, Self::Error> { + rkyv::to_bytes(output).map(|vec| vec.to_vec()) + } + + fn deserialize_output(bytes: &[u8]) -> Result { + rkyv::from_bytes(bytes) + } +} diff --git a/crates/io/src/serde.rs b/crates/io/src/serde.rs new file mode 100644 index 0000000..c388d18 --- /dev/null +++ b/crates/io/src/serde.rs @@ -0,0 +1,44 @@ +use crate::Io; +use alloc::vec::Vec; +use core::{error::Error, fmt::Debug, marker::PhantomData}; +use serde::{Serialize, de::DeserializeOwned}; + +#[cfg(feature = "bincode")] +pub mod bincode; + +pub trait Serde: Clone + Default + Send + Sync { + type Error: 'static + Error + Send + Sync; + + fn serialize(&self, value: &T) -> Result, Self::Error>; + + fn deserialize(&self, bytes: &[u8]) -> Result; +} + +pub struct IoSerde(PhantomData<(I, O, T)>); + +impl Io for IoSerde +where + I: Clone + Debug + Send + Sync + Serialize + DeserializeOwned, + O: Clone + Debug + Send + Sync + PartialEq + Serialize + DeserializeOwned, + T: Serde, +{ + type Input = I; + type Output = O; + type Error = T::Error; + + fn serialize_input(input: &Self::Input) -> Result, Self::Error> { + T::default().serialize(input) + } + + fn deserialize_input(bytes: &[u8]) -> Result { + T::default().deserialize(bytes) + } + + fn serialize_output(output: &Self::Output) -> Result, Self::Error> { + T::default().serialize(output) + } + + fn deserialize_output(bytes: &[u8]) -> Result { + T::default().deserialize(bytes) + } +} diff --git a/crates/io/src/serde/bincode.rs b/crates/io/src/serde/bincode.rs new file mode 100644 index 0000000..4ba55f1 --- /dev/null +++ b/crates/io/src/serde/bincode.rs @@ -0,0 +1,67 @@ +use crate::serde::Serde; +use alloc::vec::Vec; +use bincode::config::{Config, Configuration, Fixint, LittleEndian, NoLimit, Varint}; +use core::{ + error::Error, + fmt::{self, Debug, Display, Formatter}, +}; +use serde::{Serialize, de::DeserializeOwned}; + +pub use bincode::{ + config, + error::{DecodeError, EncodeError}, +}; + +pub type BincodeLegacyConfig = Configuration; +pub type BincodeLegacy = Bincode; +pub type BincodeStandardConfig = Configuration; +pub type BincodeStandard = Bincode; + +#[derive(Debug)] +pub enum BincodeError { + Serialize(EncodeError), + Deserialize(DecodeError), +} + +impl Display for BincodeError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + Self::Serialize(err) => write!(f, "Bincode serialize error: {err:?}"), + Self::Deserialize(err) => write!(f, "Bincode deserialize error: {err:?}"), + } + } +} + +impl Error for BincodeError {} + +/// IO de/serialization implementation with [`bincode`]. +#[derive(Clone, Copy, Debug, Default)] +pub struct Bincode(pub O); + +impl Bincode { + /// `Bincode` with legacy configuration, same as the default of `bincode@1`. + pub fn legacy() -> Self { + Self(bincode::config::legacy()) + } +} + +impl Bincode { + /// `Bincode` with standard configuration. + pub fn standard() -> Self { + Self(bincode::config::standard()) + } +} + +impl Serde for Bincode { + type Error = BincodeError; + + fn serialize(&self, value: &T) -> Result, Self::Error> { + bincode::serde::encode_to_vec(value, self.0).map_err(BincodeError::Serialize) + } + + fn deserialize(&self, bytes: &[u8]) -> Result { + let (value, _) = + bincode::serde::decode_from_slice(bytes, self.0).map_err(BincodeError::Deserialize)?; + Ok(value) + } +} diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml index 424786b..52191ac 100644 --- a/crates/test-utils/Cargo.toml +++ b/crates/test-utils/Cargo.toml @@ -8,12 +8,13 @@ license.workspace = true [dependencies] rand = { workspace = true, optional = true } serde = { workspace = true, features = ["derive"] } +serde_bytes = { workspace = true, features = ["alloc"] } sha2.workspace = true # Local dependencies ere-zkvm-interface = { workspace = true, optional = true } ere-platform-trait.workspace = true -ere-io-serde.workspace = true +ere-io = { workspace = true, features = ["bincode"] } [lints] workspace = true diff --git a/crates/test-utils/src/host.rs b/crates/test-utils/src/host.rs index 42e83ee..3861200 100644 --- a/crates/test-utils/src/host.rs +++ b/crates/test-utils/src/host.rs @@ -1,7 +1,8 @@ -use crate::program::{Program, ProgramInput}; -use ere_io_serde::IoSerde; +use crate::program::Program; +use core::ops::Deref; +use ere_io::Io; use ere_zkvm_interface::zkvm::{ProofKind, PublicValues, zkVM}; -use sha2::Digest; +use sha2::{Digest, Sha256}; use std::{marker::PhantomData, path::PathBuf}; fn workspace() -> PathBuf { @@ -50,48 +51,74 @@ pub trait TestCase { fn assert_output(&self, public_values: &[u8]); } -/// Auto-implementation [`TestCase`] for [`ProgramInput`] that can be shared -/// between host and guest, if the guest is also written in Rust. -impl TestCase for T { +/// Wrapper for [`ProgramInput`] that implements [`TestCase`]. +pub struct ProgramTestCase { + input: ::Input, + _marker: PhantomData

, +} + +impl ProgramTestCase

{ + pub fn new(input: ::Input) -> Self { + Self { + input, + _marker: PhantomData, + } + } + + /// Wrap into [`OutputHashedProgramTestCase`] with [`Sha256`]. + pub fn into_output_sha256(self) -> impl TestCase { + OutputHashedProgramTestCase::<_, Sha256>::new(self) + } +} + +impl Deref for ProgramTestCase

{ + type Target = ::Input; + + fn deref(&self) -> &Self::Target { + &self.input + } +} + +impl TestCase for ProgramTestCase

{ fn serialized_input(&self) -> Vec { - T::Program::io_serde().serialize(&self.clone()).unwrap() + P::Io::serialize_input(&self.input).unwrap() } fn assert_output(&self, public_values: &[u8]) { assert_eq!( - T::Program::compute(self.clone()), - T::Program::io_serde().deserialize(public_values).unwrap() + P::compute(self.input.clone()), + P::Io::deserialize_output(public_values).unwrap() ) } } -/// Wrapper for [`TestCase`] that asserts output to be hashed. -pub struct OutputHashedTestCase { - inner: T, +/// Wrapper for [`ProgramTestCase`] that asserts output to be hashed. +pub struct OutputHashedProgramTestCase { + test_case: ProgramTestCase

, _marker: PhantomData, } -impl OutputHashedTestCase { - pub fn new(inner: T) -> Self { +impl OutputHashedProgramTestCase { + pub fn new(test_case: ProgramTestCase

) -> Self { Self { - inner, + test_case, _marker: PhantomData, } } } -impl TestCase for OutputHashedTestCase +impl TestCase for OutputHashedProgramTestCase where - T: ProgramInput, + P: Program, D: Digest, { fn serialized_input(&self) -> Vec { - self.inner.serialized_input() + self.test_case.serialized_input() } fn assert_output(&self, public_values: &[u8]) { - let output = T::Program::compute(self.inner.clone()); - let digest = D::digest(T::Program::io_serde().serialize(&output).unwrap()); + let output = P::compute(self.test_case.clone()); + let digest = D::digest(P::Io::serialize_output(&output).unwrap()); assert_eq!(&*digest, public_values) } } diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs index 5c40d37..fc23969 100644 --- a/crates/test-utils/src/lib.rs +++ b/crates/test-utils/src/lib.rs @@ -7,3 +7,5 @@ pub mod program; #[cfg(feature = "host")] pub mod host; + +pub use ere_io as io; diff --git a/crates/test-utils/src/program.rs b/crates/test-utils/src/program.rs index e0c65ca..5a8a47e 100644 --- a/crates/test-utils/src/program.rs +++ b/crates/test-utils/src/program.rs @@ -1,28 +1,19 @@ -use core::fmt::Debug; -use ere_io_serde::IoSerde; +use ere_io::Io; use ere_platform_trait::Platform; -use serde::{Serialize, de::DeserializeOwned}; pub mod basic; /// Program that can be ran given [`Platform`] implementation. pub trait Program { - type Input: Serialize + DeserializeOwned; - type Output: Debug + PartialEq + Serialize + DeserializeOwned; + type Io: Io; - fn io_serde() -> impl IoSerde; - - fn compute(input: Self::Input) -> Self::Output; + fn compute(input: ::Input) -> ::Output; fn run() { - let io_serde = Self::io_serde(); - let input = io_serde.deserialize(&P::read_whole_input()).unwrap(); - let output = io_serde.serialize(&Self::compute(input)).unwrap(); - P::write_whole_output(&output); + let input_bytes = P::read_whole_input(); + let input = Self::Io::deserialize_input(&input_bytes).unwrap(); + let output = Self::compute(input); + let output_bytes = Self::Io::serialize_output(&output).unwrap(); + P::write_whole_output(&output_bytes); } } - -/// [`Program::Input`] that has [`TestCase`] auto-implemented. -pub trait ProgramInput: Clone + Serialize { - type Program: Program; -} diff --git a/crates/test-utils/src/program/basic.rs b/crates/test-utils/src/program/basic.rs index c480dcd..ee83526 100644 --- a/crates/test-utils/src/program/basic.rs +++ b/crates/test-utils/src/program/basic.rs @@ -1,20 +1,18 @@ use crate::program::Program; use alloc::vec::Vec; -use core::panic; -use ere_io_serde::{IoSerde, bincode::Bincode}; +use core::{marker::PhantomData, panic}; +use ere_io::serde::{IoSerde, Serde, bincode::BincodeLegacy}; use serde::{Deserialize, Serialize}; /// The basic program takes `BasicProgramInput` as input, and computes /// `BasicProgramOutput` as output. -pub struct BasicProgram; +pub struct BasicProgram(PhantomData); -impl Program for BasicProgram { - type Input = BasicProgramInput; - type Output = BasicProgramOutput; - - fn io_serde() -> impl IoSerde { - Bincode::legacy() - } +impl Program for BasicProgram +where + S: Serde, +{ + type Io = IoSerde; fn compute(input: BasicProgramInput) -> BasicProgramOutput { if input.should_panic { @@ -37,11 +35,13 @@ pub struct BasicProgramInput { pub b: u16, pub c: u32, pub d: u64, + #[serde(with = "serde_bytes")] pub e: Vec, } -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BasicProgramOutput { + #[serde(with = "serde_bytes")] pub e: Vec, pub d: u64, pub c: u32, @@ -52,44 +52,32 @@ pub struct BasicProgramOutput { #[cfg(feature = "host")] mod host { use crate::{ - host::{OutputHashedTestCase, TestCase}, - program::{ - ProgramInput, - basic::{BasicProgram, BasicProgramInput}, - }, + host::ProgramTestCase, + program::basic::{BasicProgram, BasicProgramInput}, }; + use ere_io::serde::Serde; use rand::{Rng, rng}; - use sha2::Sha256; - impl ProgramInput for BasicProgramInput { - type Program = BasicProgram; - } - - impl BasicProgramInput { - pub fn valid() -> Self { + impl BasicProgram { + pub fn valid_test_case() -> ProgramTestCase { let mut rng = rng(); let n = rng.random_range(16..32); - Self { + ProgramTestCase::new(BasicProgramInput { should_panic: false, a: rng.random(), b: rng.random(), c: rng.random(), d: rng.random(), e: rng.random_iter().take(n).collect(), - } + }) } /// Invalid input that causes panic in guest program. - pub fn invalid() -> Self { - Self { + pub fn invalid_test_case() -> ProgramTestCase { + ProgramTestCase::new(BasicProgramInput { should_panic: true, ..Default::default() - } - } - - /// Wrap into [`OutputHashedTestCase`] with [`Sha256`]. - pub fn into_output_sha256(self) -> impl TestCase { - OutputHashedTestCase::<_, Sha256>::new(self) + }) } } } diff --git a/crates/zkvm-interface/platform/src/lib.rs b/crates/zkvm-interface/platform/src/lib.rs index be2a2a7..2d17ce4 100644 --- a/crates/zkvm-interface/platform/src/lib.rs +++ b/crates/zkvm-interface/platform/src/lib.rs @@ -25,27 +25,32 @@ pub trait Platform { /// Returns the current cycle count. /// - /// Note that this function will return `None` if the platform doesn't support. - fn cycle_count() -> Option { - None + /// Note that this function will return `0` if the platform doesn't support. + #[inline] + fn cycle_count() -> u64 { + 0 } /// Enters a cycle scope of `name`. /// /// Note that this function will be a no-op if the platform doesn't support. + #[inline] fn cycle_scope_start(_name: &str) {} /// Exits a cycle scope of `name`. /// /// Note that this function will be a no-op if the platform doesn't support. + #[inline] fn cycle_scope_end(_name: &str) {} /// Runs a given function `f` within a cycle scope `name`. /// /// Note that this function will be a no-op if the platform doesn't support. - fn cycle_scope(name: &str, f: impl Fn()) { + #[inline] + fn cycle_scope(name: &str, f: impl FnOnce() -> T) -> T { Self::cycle_scope_start(name); - f(); + let t = f(); Self::cycle_scope_end(name); + t } } diff --git a/crates/zkvm/airbender/src/zkvm.rs b/crates/zkvm/airbender/src/zkvm.rs index 10d257d..f348d0e 100644 --- a/crates/zkvm/airbender/src/zkvm.rs +++ b/crates/zkvm/airbender/src/zkvm.rs @@ -107,7 +107,8 @@ mod tests { use crate::{compiler::RustRv32ima, program::AirbenderProgram, zkvm::EreAirbender}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -131,16 +132,19 @@ mod tests { let program = basic_program(); let zkvm = EreAirbender::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid().into_output_sha256(); + let test_case = BasicProgram::::valid_test_case().into_output_sha256(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreAirbender::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -150,16 +154,19 @@ mod tests { let program = basic_program(); let zkvm = EreAirbender::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid().into_output_sha256(); + let test_case = BasicProgram::::valid_test_case().into_output_sha256(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreAirbender::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/jolt/src/zkvm.rs b/crates/zkvm/jolt/src/zkvm.rs index b85b25e..d719554 100644 --- a/crates/zkvm/jolt/src/zkvm.rs +++ b/crates/zkvm/jolt/src/zkvm.rs @@ -104,7 +104,8 @@ mod tests { use crate::{compiler::RustRv64imacCustomized, program::JoltProgram, zkvm::EreJolt}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -133,16 +134,19 @@ mod tests { let program = basic_program(); let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -154,18 +158,21 @@ mod tests { let _guard = PROVE_LOCK.lock().unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); let _guard = PROVE_LOCK.lock().unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/miden/src/zkvm.rs b/crates/zkvm/miden/src/zkvm.rs index 896b74a..918b269 100644 --- a/crates/zkvm/miden/src/zkvm.rs +++ b/crates/zkvm/miden/src/zkvm.rs @@ -247,7 +247,7 @@ mod tests { } #[test] - fn test_invalid_input() { + fn test_invalid_test_case() { let program = load_miden_program("add"); let zkvm = EreMiden::new(program, ProverResourceType::Cpu).unwrap(); diff --git a/crates/zkvm/nexus/src/zkvm.rs b/crates/zkvm/nexus/src/zkvm.rs index dbeff8f..6ca5608 100644 --- a/crates/zkvm/nexus/src/zkvm.rs +++ b/crates/zkvm/nexus/src/zkvm.rs @@ -160,7 +160,8 @@ mod tests { use crate::{compiler::RustRv32i, program::NexusProgram, zkvm::EreNexus}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -184,16 +185,19 @@ mod tests { let program = basic_program(); let zkvm = EreNexus::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreNexus::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -203,16 +207,19 @@ mod tests { let program = basic_program(); let zkvm = EreNexus::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreNexus::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/openvm/src/zkvm.rs b/crates/zkvm/openvm/src/zkvm.rs index 48f7f5e..33a4d29 100644 --- a/crates/zkvm/openvm/src/zkvm.rs +++ b/crates/zkvm/openvm/src/zkvm.rs @@ -250,7 +250,8 @@ mod tests { use crate::{compiler::RustRv32imaCustomized, program::OpenVMProgram, zkvm::EreOpenVM}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -274,16 +275,19 @@ mod tests { let program = basic_program(); let zkvm = EreOpenVM::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid().into_output_sha256(); + let test_case = BasicProgram::::valid_test_case().into_output_sha256(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreOpenVM::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -293,16 +297,19 @@ mod tests { let program = basic_program(); let zkvm = EreOpenVM::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid().into_output_sha256(); + let test_case = BasicProgram::::valid_test_case().into_output_sha256(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreOpenVM::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/pico/src/zkvm.rs b/crates/zkvm/pico/src/zkvm.rs index e411701..e79f6ba 100644 --- a/crates/zkvm/pico/src/zkvm.rs +++ b/crates/zkvm/pico/src/zkvm.rs @@ -183,7 +183,8 @@ mod tests { use crate::{compiler::RustRv32imaCustomized, program::PicoProgram, zkvm::ErePico}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -207,16 +208,19 @@ mod tests { let program = basic_program(); let zkvm = ErePico::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = ErePico::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -226,16 +230,19 @@ mod tests { let program = basic_program(); let zkvm = ErePico::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = ErePico::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/risc0/Cargo.toml b/crates/zkvm/risc0/Cargo.toml index 6f9e358..d259ec5 100644 --- a/crates/zkvm/risc0/Cargo.toml +++ b/crates/zkvm/risc0/Cargo.toml @@ -23,7 +23,7 @@ ere-compile-utils = { workspace = true, optional = true } ere-zkvm-interface.workspace = true [dev-dependencies] -ere-io-serde.workspace = true +ere-io.workspace = true ere-test-utils = { workspace = true, features = ["host"] } [build-dependencies] diff --git a/crates/zkvm/risc0/platform/src/lib.rs b/crates/zkvm/risc0/platform/src/lib.rs index 503d0df..ea7295b 100644 --- a/crates/zkvm/risc0/platform/src/lib.rs +++ b/crates/zkvm/risc0/platform/src/lib.rs @@ -37,7 +37,7 @@ impl Platform for Risc0Platform { risc0_zkvm::guest::env::stdout().write_slice(message.as_bytes()); } - fn cycle_count() -> Option { - Some(risc0_zkvm::guest::env::cycle_count()) + fn cycle_count() -> u64 { + risc0_zkvm::guest::env::cycle_count() } } diff --git a/crates/zkvm/risc0/src/zkvm.rs b/crates/zkvm/risc0/src/zkvm.rs index d76aaaa..b82e08a 100644 --- a/crates/zkvm/risc0/src/zkvm.rs +++ b/crates/zkvm/risc0/src/zkvm.rs @@ -218,9 +218,10 @@ impl zkVMProgramDigest for EreRisc0 { #[cfg(test)] mod tests { use crate::{compiler::RustRv32imaCustomized, program::Risc0Program, zkvm::EreRisc0}; + use ere_io::serde::bincode::BincodeLegacy; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -244,16 +245,19 @@ mod tests { let program = basic_program(); let zkvm = EreRisc0::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreRisc0::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -263,16 +267,19 @@ mod tests { let program = basic_program(); let zkvm = EreRisc0::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreRisc0::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/sp1/src/zkvm.rs b/crates/zkvm/sp1/src/zkvm.rs index a71b2d7..4393d54 100644 --- a/crates/zkvm/sp1/src/zkvm.rs +++ b/crates/zkvm/sp1/src/zkvm.rs @@ -180,7 +180,8 @@ mod tests { use crate::{compiler::RustRv32imaCustomized, program::SP1Program, zkvm::EreSP1}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -204,16 +205,19 @@ mod tests { let program = basic_program(); let zkvm = EreSP1::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreSP1::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -223,16 +227,19 @@ mod tests { let program = basic_program(); let zkvm = EreSP1::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreSP1::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } @@ -254,7 +261,7 @@ mod tests { let program = basic_program(); let zkvm = EreSP1::new(program, ProverResourceType::Network(network_config)).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } } diff --git a/crates/zkvm/ziren/src/zkvm.rs b/crates/zkvm/ziren/src/zkvm.rs index acba3eb..799fc1d 100644 --- a/crates/zkvm/ziren/src/zkvm.rs +++ b/crates/zkvm/ziren/src/zkvm.rs @@ -146,7 +146,8 @@ mod tests { use crate::{compiler::RustMips32r2Customized, program::ZirenProgram, zkvm::EreZiren}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -170,16 +171,19 @@ mod tests { let program = basic_program(); let zkvm = EreZiren::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreZiren::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -189,16 +193,19 @@ mod tests { let program = basic_program(); let zkvm = EreZiren::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreZiren::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/crates/zkvm/zisk/src/zkvm.rs b/crates/zkvm/zisk/src/zkvm.rs index 1eb9264..491f76f 100644 --- a/crates/zkvm/zisk/src/zkvm.rs +++ b/crates/zkvm/zisk/src/zkvm.rs @@ -142,7 +142,8 @@ mod tests { use crate::{compiler::RustRv64imaCustomized, program::ZiskProgram, zkvm::EreZisk}; use ere_test_utils::{ host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, - program::basic::BasicProgramInput, + io::serde::bincode::BincodeLegacy, + program::basic::BasicProgram, }; use ere_zkvm_interface::{ compiler::Compiler, @@ -170,16 +171,19 @@ mod tests { let program = basic_program(); let zkvm = EreZisk::new(program, ProverResourceType::Cpu).unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_execute(&zkvm, &test_case); } #[test] - fn test_execute_invalid_input() { + fn test_execute_invalid_test_case() { let program = basic_program(); let zkvm = EreZisk::new(program, ProverResourceType::Cpu).unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.execute(&input).unwrap_err(); } } @@ -191,18 +195,21 @@ mod tests { let _guard = PROVE_LOCK.lock().unwrap(); - let test_case = BasicProgramInput::valid(); + let test_case = BasicProgram::::valid_test_case(); run_zkvm_prove(&zkvm, &test_case); } #[test] - fn test_prove_invalid_input() { + fn test_prove_invalid_test_case() { let program = basic_program(); let zkvm = EreZisk::new(program, ProverResourceType::Cpu).unwrap(); let _guard = PROVE_LOCK.lock().unwrap(); - for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + for input in [ + Vec::new(), + BasicProgram::::invalid_test_case().serialized_input(), + ] { zkvm.prove(&input, ProofKind::default()).unwrap_err(); } } diff --git a/tests/airbender/basic/src/main.rs b/tests/airbender/basic/src/main.rs index 1495174..ec5d8fb 100644 --- a/tests/airbender/basic/src/main.rs +++ b/tests/airbender/basic/src/main.rs @@ -8,6 +8,7 @@ use ere_platform_airbender::AirbenderPlatform; use ere_test_utils::{ guest::Sha256, + io::serde::bincode::BincodeLegacy, program::{basic::BasicProgram, Program}, }; @@ -15,5 +16,5 @@ mod airbender_rt; #[inline(never)] fn main() { - BasicProgram::run::>(); + BasicProgram::::run::>(); } diff --git a/tests/jolt/basic/src/main.rs b/tests/jolt/basic/src/main.rs index 1c3eb00..775990a 100644 --- a/tests/jolt/basic/src/main.rs +++ b/tests/jolt/basic/src/main.rs @@ -4,9 +4,12 @@ extern crate alloc; use ere_platform_jolt::{jolt, JoltPlatform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; #[jolt::provable(guest_only)] fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/nexus/basic/src/main.rs b/tests/nexus/basic/src/main.rs index a41e54b..6768fbf 100644 --- a/tests/nexus/basic/src/main.rs +++ b/tests/nexus/basic/src/main.rs @@ -1,9 +1,12 @@ #![cfg_attr(target_arch = "riscv32", no_std, no_main)] use ere_platform_nexus::{nexus_rt, NexusPlatform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; #[nexus_rt::main] fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/openvm/basic/src/main.rs b/tests/openvm/basic/src/main.rs index cae963d..45a4dfb 100644 --- a/tests/openvm/basic/src/main.rs +++ b/tests/openvm/basic/src/main.rs @@ -1,9 +1,10 @@ use ere_platform_openvm::OpenVMPlatform; use ere_test_utils::{ guest::Sha256, + io::serde::bincode::BincodeLegacy, program::{basic::BasicProgram, Program}, }; fn main() { - BasicProgram::run::>(); + BasicProgram::::run::>(); } diff --git a/tests/pico/basic/src/main.rs b/tests/pico/basic/src/main.rs index b261a32..2aa1e83 100644 --- a/tests/pico/basic/src/main.rs +++ b/tests/pico/basic/src/main.rs @@ -1,10 +1,13 @@ #![no_main] use ere_platform_pico::{pico_sdk, PicoPlatform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; pico_sdk::entrypoint!(main); pub fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/risc0/basic/src/main.rs b/tests/risc0/basic/src/main.rs index 92d2687..1be6fcd 100644 --- a/tests/risc0/basic/src/main.rs +++ b/tests/risc0/basic/src/main.rs @@ -1,6 +1,9 @@ use ere_platform_risc0::Risc0Platform; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/sp1/basic/src/main.rs b/tests/sp1/basic/src/main.rs index 8d8a84c..133aea9 100644 --- a/tests/sp1/basic/src/main.rs +++ b/tests/sp1/basic/src/main.rs @@ -1,10 +1,13 @@ #![no_main] use ere_platform_sp1::{sp1_zkvm, SP1Platform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; sp1_zkvm::entrypoint!(main); pub fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/ziren/basic/src/main.rs b/tests/ziren/basic/src/main.rs index 2cf490e..ce59bbc 100644 --- a/tests/ziren/basic/src/main.rs +++ b/tests/ziren/basic/src/main.rs @@ -1,10 +1,13 @@ #![no_main] use ere_platform_ziren::{zkm_zkvm, ZirenPlatform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; zkm_zkvm::entrypoint!(main); pub fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); } diff --git a/tests/zisk/basic_rust/src/main.rs b/tests/zisk/basic_rust/src/main.rs index 945d712..9b9617a 100644 --- a/tests/zisk/basic_rust/src/main.rs +++ b/tests/zisk/basic_rust/src/main.rs @@ -1,10 +1,13 @@ #![no_main] use ere_platform_zisk::{ziskos, ZiskPlatform}; -use ere_test_utils::program::{basic::BasicProgram, Program}; +use ere_test_utils::{ + io::serde::bincode::BincodeLegacy, + program::{basic::BasicProgram, Program}, +}; ziskos::entrypoint!(main); fn main() { - BasicProgram::run::(); + BasicProgram::::run::(); }