From a2748d746093d6456501669c38ff4ad6b40f68ea Mon Sep 17 00:00:00 2001 From: jason <94618524+mellowcroc@users.noreply.github.com> Date: Mon, 27 Jan 2025 17:14:56 +0900 Subject: [PATCH] chore: remove stone-prover-sdk dependency --- Cargo.lock | 174 ++++--------------------------------------- Cargo.toml | 1 - src/fri.rs | 100 +++++++++++++++++++++++++ src/lib.rs | 1 + src/prover.rs | 16 +++- src/prover/config.rs | 20 ++--- 6 files changed, 134 insertions(+), 178 deletions(-) create mode 100644 src/fri.rs diff --git a/Cargo.lock b/Cargo.lock index 88b39c6..1946421 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,18 +38,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -344,19 +332,9 @@ version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95" dependencies = [ - "bincode_derive", "serde", ] -[[package]] -name = "bincode_derive" -version = "2.0.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e30759b3b99a1b802a7a3aa21c85c3ded5c28e1c83170d82d70f08bbf7f3e4c" -dependencies = [ - "virtue", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -488,12 +466,12 @@ name = "cairo-bootloader" version = "0.1.0" source = "git+https://github.com/zksecurity/cairo-bootloader?rev=ca1435a6cf52c7cea6d98e1c4edecff8424b4bae#ca1435a6cf52c7cea6d98e1c4edecff8424b4bae" dependencies = [ - "cairo-vm 2.0.0-rc2", + "cairo-vm", "num-traits", "serde", "serde_json", "starknet-crypto 0.6.2", - "starknet-types-core 0.1.7", + "starknet-types-core", "thiserror 1.0.69", "thiserror-no-std", ] @@ -511,36 +489,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cairo-vm" -version = "1.0.0-rc0" -source = "git+https://github.com/Moonsong-Labs/cairo-vm?rev=e0a4653aa5634664a3f792b38715a572e9f89b44#e0a4653aa5634664a3f792b38715a572e9f89b44" -dependencies = [ - "anyhow", - "bincode", - "bitvec", - "generic-array", - "hashbrown 0.14.5", - "hex", - "keccak", - "lazy_static", - "mimalloc", - "nom", - "num-bigint", - "num-integer", - "num-prime", - "num-traits", - "rand", - "serde", - "serde_json", - "sha2", - "sha3", - "starknet-crypto 0.6.2", - "starknet-types-core 0.0.6", - "thiserror-no-std", - "zip", -] - [[package]] name = "cairo-vm" version = "2.0.0-rc2" @@ -566,7 +514,7 @@ dependencies = [ "sha2", "sha3", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", "thiserror-no-std", "wasm-bindgen", "zip", @@ -1820,17 +1768,6 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - [[package]] name = "hashbrown" version = "0.15.2" @@ -2463,21 +2400,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbc2a4da0d9e52ccfe6306801a112e81a8fc0c76aa3e4449fefeda7fef72bb34" dependencies = [ - "lambdaworks-math 0.10.0", + "lambdaworks-math", "serde", "sha2", "sha3", ] -[[package]] -name = "lambdaworks-math" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6c4d0ddd1fcd235be5196b1bcc404f89ad3e911f4c190fa01459e05dbf40f8" -dependencies = [ - "thiserror 1.0.69", -] - [[package]] name = "lambdaworks-math" version = "0.10.0" @@ -2503,16 +2431,6 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" -[[package]] -name = "libmimalloc-sys" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "libredox" version = "0.1.3" @@ -2577,15 +2495,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "mimalloc" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" -dependencies = [ - "libmimalloc-sys", -] - [[package]] name = "mime" version = "0.3.17" @@ -4045,24 +3954,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "stark_evm_adapter" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f997ed88a7b0a690222aed7a0ee319457c97a30730052d43db12319edce651" -dependencies = [ - "clap 3.2.25", - "ethers", - "num-bigint", - "num-traits", - "regex", - "serde", - "serde_json", - "serde_with 3.12.0", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "stark_evm_adapter" version = "0.1.5" @@ -4096,7 +3987,7 @@ dependencies = [ "serde_with 2.3.3", "sha3", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", ] [[package]] @@ -4134,7 +4025,7 @@ dependencies = [ "rfc6979", "sha2", "starknet-curve 0.5.1", - "starknet-types-core 0.1.7", + "starknet-types-core", "zeroize", ] @@ -4164,7 +4055,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcde6bd74269b8161948190ace6cf069ef20ac6e79cd2ba09b320efa7500b6de" dependencies = [ - "starknet-types-core 0.1.7", + "starknet-types-core", ] [[package]] @@ -4179,21 +4070,6 @@ dependencies = [ "hex", ] -[[package]] -name = "starknet-types-core" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6b868f545d43b474c2c00e9349c489fdeb7ff17eb00cdf339744ac4cae0930" -dependencies = [ - "bitvec", - "lambdaworks-math 0.4.0", - "lazy_static", - "num-bigint", - "num-integer", - "num-traits", - "serde", -] - [[package]] name = "starknet-types-core" version = "0.1.7" @@ -4201,7 +4077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa1b9e01ccb217ab6d475c5cda05dbb22c30029f7bb52b192a010a00d77a3d74" dependencies = [ "lambdaworks-crypto", - "lambdaworks-math 0.10.0", + "lambdaworks-math", "num-bigint", "num-integer", "num-traits", @@ -4223,7 +4099,7 @@ dependencies = [ "bincode", "cairo-bootloader", "cairo-felt", - "cairo-vm 2.0.0-rc2", + "cairo-vm", "clap 4.5.26", "flate2", "itertools 0.13.0", @@ -4236,9 +4112,8 @@ dependencies = [ "serde", "serde_json", "sha256", - "stark_evm_adapter 0.1.5 (git+https://github.com/zksecurity/stark-evm-adapter.git?rev=e044116e3cf4e3cbca11cce7b9e508a0f3e6870b)", + "stark_evm_adapter", "starknet-crypto 0.7.4", - "stone-prover-sdk", "swiftness", "swiftness_air", "swiftness_fri", @@ -4250,21 +4125,6 @@ dependencies = [ "uuid 1.12.0", ] -[[package]] -name = "stone-prover-sdk" -version = "0.1.0" -source = "git+https://github.com/zksecurity/stone-prover-sdk#7cf38fce052413fc656e737f5c671e482ef8f474" -dependencies = [ - "bincode", - "cairo-vm 1.0.0-rc0", - "serde", - "serde_json", - "stark_evm_adapter 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "string_cache" version = "0.8.7" @@ -4372,7 +4232,7 @@ dependencies = [ "serde_with 3.12.0", "starknet-core", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", "swiftness_commitment", "swiftness_transcript", "thiserror 1.0.69", @@ -4391,7 +4251,7 @@ dependencies = [ "sha3", "starknet-core", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", "swiftness_transcript", "thiserror 1.0.69", "thiserror-no-std", @@ -4423,7 +4283,7 @@ dependencies = [ "serde", "sha3", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", "swiftness_commitment", "swiftness_transcript", "thiserror 1.0.69", @@ -4442,7 +4302,7 @@ dependencies = [ "serde", "serde_json", "starknet-crypto 0.7.4", - "starknet-types-core 0.1.7", + "starknet-types-core", "thiserror 1.0.69", ] @@ -5076,12 +4936,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "virtue" -version = "0.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314" - [[package]] name = "wait-timeout" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 002a477..8487353 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,6 @@ rstest = "0.21.0" serde = { version = "1.0", features = ["derive"], default-features = false } serde_json = "1" stark_evm_adapter = { git = "https://github.com/zksecurity/stark-evm-adapter.git", rev = "e044116e3cf4e3cbca11cce7b9e508a0f3e6870b" } -stone-prover-sdk = { git = "https://github.com/zksecurity/stone-prover-sdk" } swiftness_air = { git = "https://github.com/zksecurity/integrity-calldata-generator", rev = "6f2dd268274e40e5ea75e2f17aff6b8e53f8f499" } swiftness_fri = { git = "https://github.com/zksecurity/integrity-calldata-generator", rev = "6f2dd268274e40e5ea75e2f17aff6b8e53f8f499" } swiftness_proof_parser = { git = "https://github.com/zksecurity/integrity-calldata-generator", rev = "6f2dd268274e40e5ea75e2f17aff6b8e53f8f499" } diff --git a/src/fri.rs b/src/fri.rs new file mode 100644 index 0000000..b81c77c --- /dev/null +++ b/src/fri.rs @@ -0,0 +1,100 @@ +use crate::config::FriParameters; + +const DEFAULT_N_QUERIES: u32 = 16; +const DEFAULT_PROOF_OF_WORK_BITS: u32 = 32; + +/// Implements ceil(log2(x)). +fn ceil_log2(x: u32) -> u32 { + x.next_power_of_two().ilog2() +} + +/// Computes the FRI steps list based on the specified parameters. +/// +/// This computation is based on the documentation of the Stone prover: +/// # log₂(#steps) + 4 = log₂(last_layer_degree_bound) + ∑fri_step_list +/// # log₂(#steps) = log₂(last_layer_degree_bound) + ∑fri_step_list - 4 +/// # ∑fri_step_list = log₂(#steps) + 4 - log₂(last_layer_degree_bound) +/// +/// * `nb_steps_log`: Ceiled log₂ of the number of Cairo steps of the program. +/// * `last_layer_degree_bound_log`: Ceiled log₂ of the last layer degree bound. +/// * `max_step_value`: Maximum value for each step. All elements will be in the range +/// [0, `max_step_value`]. +/// +/// Returns The FRI steps list. +fn compute_fri_steps( + nb_steps_log: u32, + last_layer_degree_bound_log: u32, + max_step_value: u32, +) -> Vec { + let sum_of_fri_steps = nb_steps_log + 4 - last_layer_degree_bound_log; + let quotient = (sum_of_fri_steps / max_step_value) as usize; + let remainder = sum_of_fri_steps % max_step_value; + + let mut fri_steps = vec![max_step_value; quotient]; + if remainder > 0 { + fri_steps.push(remainder); + } + + fri_steps +} + +pub trait FriComputer { + fn compute_fri_parameters(&self, nb_steps: u32) -> FriParameters; +} + +pub struct DefaultFriComputer; + +impl FriComputer for DefaultFriComputer { + fn compute_fri_parameters(&self, nb_steps: u32) -> FriParameters { + let last_layer_degree_bound = 64; + + let nb_steps_log = ceil_log2(nb_steps); + let last_layer_degree_bound_log = ceil_log2(last_layer_degree_bound); + let max_step_value = 4; + + // The first FRI step must be 0 + let mut fri_steps = vec![0]; + fri_steps.extend(compute_fri_steps( + nb_steps_log, + last_layer_degree_bound_log, + max_step_value, + )); + + FriParameters { + fri_step_list: Some(fri_steps), + last_layer_degree_bound: Some(last_layer_degree_bound), + n_queries: Some(DEFAULT_N_QUERIES), + proof_of_work_bits: Some(DEFAULT_PROOF_OF_WORK_BITS), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use rstest::rstest; + + #[rstest] + #[case(2, 1)] + #[case(32, 5)] + #[case(1000, 10)] + #[case(524288, 19)] + fn test_ceil_log2(#[case] x: u32, #[case] expected: u32) { + let log = ceil_log2(x); + assert_eq!(log, expected); + } + + #[rstest] + #[case(32768, vec ! [0, 4, 4, 4, 1])] + #[case(524288, vec ! [0, 4, 4, 4, 4, 1])] + #[case(768, vec ! [0, 4, 4])] + fn test_compute_fri_parameters_default(#[case] nb_steps: u32, #[case] expected: Vec) { + let expected_last_layer_degree_bound = 64; + let fri_parameters = DefaultFriComputer.compute_fri_parameters(nb_steps); + assert_eq!(fri_parameters.fri_step_list, Some(expected)); + assert_eq!( + fri_parameters.last_layer_degree_bound, + Some(expected_last_layer_degree_bound) + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index 5094dca..3db2504 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod args; pub mod bootloader; pub mod cairo; +pub mod fri; pub mod prover; pub mod serialize; pub mod utils; diff --git a/src/prover.rs b/src/prover.rs index 216c5e0..3297f3d 100644 --- a/src/prover.rs +++ b/src/prover.rs @@ -1,14 +1,26 @@ pub mod config; -use crate::args::{ProveArgs, ProveBootloaderArgs, StoneVersion}; +use crate::args::{LayoutName, ProveArgs, ProveBootloaderArgs, StoneVersion}; use crate::utils::write_json_to_file; +use cairo_vm::air_public_input::{MemorySegmentAddresses, PublicMemoryEntry}; use config::{ProverConfig, ProverParametersConfig}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; use std::fs; use std::path::PathBuf; use std::process::Command; use thiserror::Error; -use stone_prover_sdk::models::PublicInput; +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct PublicInput { + pub layout: LayoutName, + pub rc_min: u32, + pub rc_max: u32, + pub n_steps: u32, + pub memory_segments: HashMap, + pub public_memory: Vec, + pub dynamic_params: Option>, +} #[derive(Error, Debug)] pub enum ProverError { diff --git a/src/prover/config.rs b/src/prover/config.rs index 7f5c328..20e040c 100644 --- a/src/prover/config.rs +++ b/src/prover/config.rs @@ -1,8 +1,10 @@ -use crate::define_enum; +use crate::{ + define_enum, + fri::{DefaultFriComputer, FriComputer}, +}; use clap::Args; use serde::{Deserialize, Serialize}; use serde_json::Result; -use stone_prover_sdk::fri::{DefaultFriComputer, FriComputer}; define_enum! { CommitmentHash, @@ -55,17 +57,6 @@ pub struct FriParameters { pub proof_of_work_bits: Option, } -impl From for FriParameters { - fn from(params: stone_prover_sdk::models::FriParameters) -> Self { - FriParameters { - fri_step_list: Some(params.fri_step_list), - last_layer_degree_bound: Some(params.last_layer_degree_bound), - n_queries: Some(params.n_queries), - proof_of_work_bits: Some(params.proof_of_work_bits), - } - } -} - #[derive(Args, Serialize, Deserialize, Debug, Clone)] pub struct ProverParametersConfig { #[clap(long = "field", default_value = "PrimeField0")] @@ -103,8 +94,7 @@ impl ProverParametersConfig { nb_steps: u32, parameter_config: &ProverParametersConfig, ) -> Result { - let computed_fri_parameters = - FriParameters::from(DefaultFriComputer.compute_fri_parameters(nb_steps)); + let computed_fri_parameters = DefaultFriComputer.compute_fri_parameters(nb_steps); let computed_fri_step_list = parameter_config .stark .fri