diff --git a/Cargo.lock b/Cargo.lock index 0ac2383f3..f4321e206 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1767,6 +1767,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2877,6 +2898,16 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "linkme" version = "0.3.27" @@ -3275,6 +3306,12 @@ dependencies = [ "zero_bin_common", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "overload" version = "0.1.1" @@ -3962,6 +3999,17 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.10.5" @@ -5780,8 +5828,10 @@ dependencies = [ "async-stream", "cargo_metadata", "clap", + "directories", "evm_arithmetization", "futures", + "once_cell", "plonky2", "proof_gen", "serde", diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 0d0e35191..d5a317bf1 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -9,6 +9,8 @@ keywords.workspace = true categories.workspace = true [dependencies] +directories = "5.0.1" + thiserror = { workspace = true } tracing = { workspace = true } proof_gen = { workspace = true } @@ -24,6 +26,7 @@ alloy = { workspace = true } async-stream = { workspace = true } cargo_metadata = { workspace = true } vergen = { workspace = true } +once_cell = { workspace = true } [build-dependencies] cargo_metadata = { workspace = true } diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index 750726696..02637df3c 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -6,6 +6,7 @@ use std::{ path::Path, }; +use directories::ProjectDirs; use plonky2::util::serialization::{ Buffer, DefaultGateSerializer, DefaultGeneratorSerializer, IoError, }; @@ -17,10 +18,10 @@ use super::{ Config, RecursiveCircuitsForTableSize, SIZE, }; -const CIRCUITS_DIR: &str = "circuits/"; const PROVER_STATE_FILE_PREFIX: &str = "prover_state"; const VERIFIER_STATE_FILE_PREFIX: &str = "verifier_state"; -const CARGO_WORKSPACE_DIR_ENV: &str = "CARGO_WORKSPACE_DIR"; +const ZK_EVM_CACHE_DIR_NAME: &str = "zk_evm_circuit_cache"; +const ZK_EVM_CACHE_DIR_ENV: &str = "ZK_EVM_CACHE_DIR"; fn get_serializers() -> ( DefaultGateSerializer, @@ -73,14 +74,15 @@ pub(crate) trait DiskResource { p: &Self::PathConstrutor, r: &Self::Resource, ) -> Result<(), DiskResourceError> { - let circuits_dir = relative_circuit_dir_path(); + let circuits_dir = circuit_dir(); // Create the base folder if non-existent. if std::fs::metadata(&circuits_dir).is_err() { - std::fs::create_dir(&circuits_dir).map_err(|_| { - DiskResourceError::IoError::(std::io::Error::other( - "Could not create circuits folder", - )) + std::fs::create_dir_all(&circuits_dir).map_err(|err| { + DiskResourceError::IoError::(std::io::Error::other(format!( + "Could not create circuits folder with error \"{:?}\"", + err + ))) })?; } @@ -107,7 +109,7 @@ impl DiskResource for BaseProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_base_{}_{}", - &relative_circuit_dir_path(), + circuit_dir(), PROVER_STATE_FILE_PREFIX, env!("EVM_ARITHMETIZATION_PKG_VER"), p.get_configuration_digest() @@ -143,7 +145,7 @@ impl DiskResource for MonolithicProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_monolithic_{}_{}", - &relative_circuit_dir_path(), + circuit_dir(), PROVER_STATE_FILE_PREFIX, env!("EVM_ARITHMETIZATION_PKG_VER"), p.get_configuration_digest() @@ -178,7 +180,7 @@ impl DiskResource for RecursiveCircuitResource { fn path((circuit_type, size): &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_{}_{}_{}", - &relative_circuit_dir_path(), + circuit_dir(), PROVER_STATE_FILE_PREFIX, env!("EVM_ARITHMETIZATION_PKG_VER"), circuit_type.as_short_str(), @@ -222,7 +224,7 @@ impl DiskResource for VerifierResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_{}_{}", - &relative_circuit_dir_path(), + circuit_dir(), VERIFIER_STATE_FILE_PREFIX, env!("EVM_ARITHMETIZATION_PKG_VER"), p.get_configuration_digest() @@ -277,11 +279,28 @@ fn prover_to_disk( Ok(()) } -/// If we're running in the cargo workspace, then always use the `circuits` -/// directory that lives in `tools/`. Otherwise, just use `circuits` in the -/// current directory. -fn relative_circuit_dir_path() -> String { - env::var(CARGO_WORKSPACE_DIR_ENV) - .map(|p| format!("{}/{}", p, CIRCUITS_DIR)) - .unwrap_or_else(|_| CIRCUITS_DIR.to_string()) +fn circuit_dir() -> String { + // Guaranteed to be set by the binary if not set by the user. + std::env::var(ZK_EVM_CACHE_DIR_ENV).unwrap_or_else(|_| { + panic!( + "expected the env var \"{}\" to be set", + ZK_EVM_CACHE_DIR_ENV + ) + }) +} + +/// We store serialized circuits inside the cache directory specified by an env +/// variable. If the user does not set this, then we set it base to the OS's +/// standard location for the cache directory. +pub fn set_circuit_cache_dir_env_if_not_set() -> anyhow::Result<()> { + if std::env::var_os(ZK_EVM_CACHE_DIR_ENV).is_none() { + let circuit_cache_dir = match ProjectDirs::from("", "", ZK_EVM_CACHE_DIR_NAME) { + Some(proj_dir) => proj_dir.cache_dir().to_path_buf(), + None => std::env::current_dir()?, + }; + + std::env::set_var(ZK_EVM_CACHE_DIR_ENV, circuit_cache_dir); + } + + Ok(()) } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 9aafcd5fd..04a8126b1 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -10,8 +10,10 @@ use ops::register; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use tracing::{info, warn}; -use zero_bin_common::block_interval::BlockInterval; use zero_bin_common::version; +use zero_bin_common::{ + block_interval::BlockInterval, prover_state::persistence::set_circuit_cache_dir_env_if_not_set, +}; use crate::client::{client_main, ProofParams}; @@ -38,6 +40,7 @@ fn get_previous_proof(path: Option) -> Result Result<()> { load_dotenvy_vars_if_present(); + set_circuit_cache_dir_env_if_not_set()?; init::tracing(); if env::var_os(EVM_ARITHMETIZATION_PKG_VER).is_none() { diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index e14ad7827..4b8c3a9ab 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -7,7 +7,7 @@ use dotenvy::dotenv; use proof_gen::proof_types::GeneratedBlockProof; use serde_json::Deserializer; use tracing::info; -use zero_bin_common::version; +use zero_bin_common::{prover_state::persistence::set_circuit_cache_dir_env_if_not_set, version}; mod cli; mod init; @@ -15,6 +15,7 @@ mod init; fn main() -> Result<()> { dotenv().ok(); init::tracing(); + set_circuit_cache_dir_env_if_not_set()?; let args: Vec = env::args().collect(); if args.contains(&"--version".to_string()) { diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index 2358401f4..7e26fb7c3 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -5,7 +5,9 @@ use clap::Parser; use dotenvy::dotenv; use ops::register; use paladin::runtime::WorkerRuntime; -use zero_bin_common::prover_state::cli::CliProverStateConfig; +use zero_bin_common::prover_state::{ + cli::CliProverStateConfig, persistence::set_circuit_cache_dir_env_if_not_set, +}; use zero_bin_common::version; mod init; @@ -38,6 +40,7 @@ async fn main() -> Result<()> { dotenv().ok(); init::tracing(); + set_circuit_cache_dir_env_if_not_set()?; let args = Cli::parse(); args.prover_state_config