diff --git a/Cargo.lock b/Cargo.lock index f1b6412e1a021f..415230e797aaed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7386,6 +7386,38 @@ dependencies = [ "tempfile", ] +[[package]] +name = "solana-genesis-config" +version = "2.2.0" +dependencies = [ + "bincode", + "chrono", + "memmap2", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-cluster-type", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-genesis-config", + "solana-hash", + "solana-inflation", + "solana-keypair", + "solana-logger", + "solana-native-token", + "solana-poh-config", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + [[package]] name = "solana-genesis-utils" version = "2.2.0" @@ -8946,7 +8978,6 @@ dependencies = [ "bytemuck", "bytemuck_derive", "byteorder", - "chrono", "curve25519-dalek 4.1.3", "digest 0.10.7", "ed25519-dalek", @@ -8957,7 +8988,6 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", "num-derive", "num-traits", "openssl", @@ -8986,6 +9016,7 @@ dependencies = [ "solana-fee-structure", "solana-frozen-abi", "solana-frozen-abi-macro", + "solana-genesis-config", "solana-hard-forks", "solana-inflation", "solana-instruction", diff --git a/Cargo.toml b/Cargo.toml index 7e1fa38779f382..07ed6fd2195a5e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -136,6 +136,7 @@ members = [ "sdk/frozen-abi", "sdk/frozen-abi/macro", "sdk/gen-headers", + "sdk/genesis-config", "sdk/hard-forks", "sdk/hash", "sdk/inflation", @@ -499,6 +500,7 @@ solana-frozen-abi-macro = { path = "sdk/frozen-abi/macro", version = "=2.2.0" } solana-tps-client = { path = "tps-client", version = "=2.2.0" } solana-file-download = { path = "sdk/file-download", version = "=2.2.0" } solana-genesis = { path = "genesis", version = "=2.2.0" } +solana-genesis-config = { path = "sdk/genesis-config", version = "=2.2.0" } solana-genesis-utils = { path = "genesis-utils", version = "=2.2.0" } agave-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=2.2.0" } solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=2.2.0" } diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 316adbe52bce1c..028683a1b3ef47 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5902,6 +5902,35 @@ dependencies = [ "reqwest", ] +[[package]] +name = "solana-genesis-config" +version = "2.2.0" +dependencies = [ + "bincode", + "chrono", + "memmap2", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-cluster-type", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-inflation", + "solana-keypair", + "solana-logger", + "solana-native-token", + "solana-poh-config", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + [[package]] name = "solana-genesis-utils" version = "2.2.0" @@ -7572,7 +7601,6 @@ dependencies = [ "bytemuck", "bytemuck_derive", "byteorder 1.5.0", - "chrono", "digest 0.10.7", "ed25519-dalek", "getrandom 0.1.14", @@ -7581,7 +7609,6 @@ dependencies = [ "lazy_static", "libsecp256k1 0.6.0", "log", - "memmap2", "num-derive", "num-traits", "qualifier_attr", @@ -7607,6 +7634,7 @@ dependencies = [ "solana-epoch-rewards-hasher", "solana-feature-set", "solana-fee-structure", + "solana-genesis-config", "solana-hard-forks", "solana-inflation", "solana-instruction", diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index b15f1b66ad93c2..f7132e403f1c1a 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -22,8 +22,6 @@ default = [ ] full = [ "byteorder", - "chrono", - "memmap2", "rand", "rand0-7", "serde_json", @@ -39,6 +37,7 @@ full = [ "dep:solana-cluster-type", "dep:solana-ed25519-program", "dep:solana-compute-budget-interface", + "dep:solana-genesis-config", "dep:solana-hard-forks", "dep:solana-keypair", "dep:solana-offchain-message", @@ -76,6 +75,7 @@ frozen-abi = [ "solana-fee-structure/frozen-abi", "solana-account/frozen-abi", "solana-cluster-type/frozen-abi", + "solana-genesis-config/frozen-abi", "solana-hard-forks/frozen-abi", "solana-inflation/frozen-abi", "solana-poh-config/frozen-abi", @@ -97,7 +97,6 @@ bs58 = { workspace = true } bytemuck = { workspace = true } bytemuck_derive = { workspace = true } byteorder = { workspace = true, optional = true } -chrono = { workspace = true, features = ["alloc"], optional = true } curve25519-dalek = { workspace = true, optional = true } digest = { workspace = true, optional = true } ed25519-dalek = { workspace = true, optional = true } @@ -105,7 +104,6 @@ itertools = { workspace = true } lazy_static = { workspace = true } libsecp256k1 = { workspace = true, optional = true, features = ["hmac"] } log = { workspace = true } -memmap2 = { workspace = true, optional = true } num-derive = { workspace = true } num-traits = { workspace = true } qualifier_attr = { workspace = true, optional = true } @@ -143,6 +141,9 @@ solana-frozen-abi = { workspace = true, optional = true, features = [ solana-frozen-abi-macro = { workspace = true, optional = true, features = [ "frozen-abi", ] } +solana-genesis-config = { workspace = true, features = [ + "serde" +], optional = true } solana-hard-forks = { workspace = true, features = [ "serde", ], optional = true } diff --git a/sdk/genesis-config/Cargo.toml b/sdk/genesis-config/Cargo.toml new file mode 100644 index 00000000000000..99b738ace6a7e2 --- /dev/null +++ b/sdk/genesis-config/Cargo.toml @@ -0,0 +1,64 @@ +[package] +name = "solana-genesis-config" +description = "A Solana network's genesis config." +documentation = "https://docs.rs/solana-genesis-config" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } + +[dependencies] +bincode = { workspace = true } +chrono = { workspace = true, features = ["alloc"] } +memmap2 = { workspace = true } +serde = { workspace = true, optional = true } +serde_derive = { workspace = true, optional = true } +solana-account = { workspace = true } +solana-clock = { workspace = true } +solana-cluster-type = { workspace = true } +solana-epoch-schedule = { workspace = true } +solana-fee-calculator = { workspace = true } +solana-frozen-abi = { workspace = true, optional = true } +solana-frozen-abi-macro = { workspace = true, optional = true } +solana-hash = { workspace = true } +solana-inflation = { workspace = true } +solana-keypair = { workspace = true } +solana-logger = { workspace = true } +solana-native-token = { workspace = true } +solana-poh-config = { workspace = true } +solana-pubkey = { workspace = true } +solana-rent = { workspace = true } +solana-sdk-ids = { workspace = true } +solana-sha256-hasher = { workspace = true } +solana-shred-version = { workspace = true } +solana-signer = { workspace = true } +solana-time-utils = { workspace = true } + +[dev-dependencies] +solana-genesis-config = { path = ".", features = ["serde"] } +solana-pubkey = { workspace = true, features = ["rand"] } + +[features] +frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro"] +serde = [ + "dep:serde", + "dep:serde_derive", + "solana-account/serde", + "solana-clock/serde", + "solana-cluster-type/serde", + "solana-epoch-schedule/serde", + "solana-fee-calculator/serde", + "solana-inflation/serde", + "solana-poh-config/serde", + "solana-rent/serde", +] + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] +all-features = true +rustdoc-args = ["--cfg=docsrs"] + +[lints] +workspace = true diff --git a/sdk/src/genesis_config.rs b/sdk/genesis-config/src/lib.rs similarity index 89% rename from sdk/src/genesis_config.rs rename to sdk/genesis-config/src/lib.rs index af86e8e3005659..8bce8c3cf5bc42 100644 --- a/sdk/src/genesis_config.rs +++ b/sdk/genesis-config/src/lib.rs @@ -1,38 +1,45 @@ //! The chain's genesis config. -#![cfg(feature = "full")] - +#![cfg_attr(feature = "frozen-abi", feature(min_specialization))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] #[deprecated( since = "2.2.0", note = "Use `solana_cluster_type::ClusterType` instead." )] pub use solana_cluster_type::ClusterType; +#[cfg(feature = "frozen-abi")] +use solana_frozen_abi_macro::{frozen_abi, AbiExample}; +#[cfg(feature = "serde")] use { - crate::{ - clock::{UnixTimestamp, DEFAULT_TICKS_PER_SLOT}, - epoch_schedule::EpochSchedule, - fee_calculator::FeeRateGovernor, - hash::{hash, Hash}, - inflation::Inflation, - poh_config::PohConfig, - pubkey::Pubkey, - rent::Rent, - shred_version::compute_shred_version, - signature::{Keypair, Signer}, - system_program, - timing::years_as_slots, - }, bincode::{deserialize, serialize}, chrono::{TimeZone, Utc}, memmap2::Mmap, - solana_account::{Account, AccountSharedData}, + solana_hash::Hash, solana_native_token::lamports_to_sol, + solana_sha256_hasher::hash, + solana_shred_version::compute_shred_version, std::{ - collections::BTreeMap, fmt, fs::{File, OpenOptions}, io::Write, path::{Path, PathBuf}, + }, +}; +use { + solana_account::{Account, AccountSharedData}, + solana_clock::{UnixTimestamp, DEFAULT_TICKS_PER_SLOT}, + solana_epoch_schedule::EpochSchedule, + solana_fee_calculator::FeeRateGovernor, + solana_inflation::Inflation, + solana_keypair::Keypair, + solana_poh_config::PohConfig, + solana_pubkey::Pubkey, + solana_rent::Rent, + solana_sdk_ids::system_program, + solana_signer::Signer, + solana_time_utils::years_as_slots, + std::{ + collections::BTreeMap, time::{SystemTime, UNIX_EPOCH}, }, }; @@ -49,7 +56,11 @@ pub const UNUSED_DEFAULT: u64 = 1024; derive(AbiExample), frozen_abi(digest = "D9VFRSj4fodCuKFC9omQY2zY2Uw8wo6SzJFLeMJaVigm") )] -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +#[cfg_attr( + feature = "serde", + derive(serde_derive::Deserialize, serde_derive::Serialize) +)] +#[derive(Clone, Debug, PartialEq)] pub struct GenesisConfig { /// when the network (bootstrap validator) was started relative to the UNIX Epoch pub creation_time: UnixTimestamp, @@ -132,15 +143,18 @@ impl GenesisConfig { } } + #[cfg(feature = "serde")] pub fn hash(&self) -> Hash { let serialized = serialize(&self).unwrap(); hash(&serialized) } + #[cfg(feature = "serde")] fn genesis_filename(ledger_path: &Path) -> PathBuf { Path::new(ledger_path).join(DEFAULT_GENESIS_FILE) } + #[cfg(feature = "serde")] pub fn load(ledger_path: &Path) -> Result { let filename = Self::genesis_filename(ledger_path); let file = OpenOptions::new() @@ -170,6 +184,7 @@ impl GenesisConfig { Ok(genesis_config) } + #[cfg(feature = "serde")] pub fn write(&self, ledger_path: &Path) -> Result<(), std::io::Error> { let serialized = serialize(&self).map_err(|err| { std::io::Error::new( @@ -216,6 +231,7 @@ impl GenesisConfig { } } +#[cfg(feature = "serde")] impl fmt::Display for GenesisConfig { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( @@ -273,13 +289,9 @@ impl fmt::Display for GenesisConfig { } } -#[cfg(test)] +#[cfg(all(feature = "serde", test))] mod tests { - use { - super::*, - crate::signature::{Keypair, Signer}, - std::path::PathBuf, - }; + use {super::*, solana_signer::Signer, std::path::PathBuf}; fn make_tmp_path(name: &str) -> PathBuf { let out_dir = std::env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_string()); @@ -310,10 +322,10 @@ mod tests { AccountSharedData::new(10_000, 0, &Pubkey::default()), ); config.add_account( - solana_sdk::pubkey::new_rand(), + solana_pubkey::new_rand(), AccountSharedData::new(1, 0, &Pubkey::default()), ); - config.add_native_instruction_processor("hi".to_string(), solana_sdk::pubkey::new_rand()); + config.add_native_instruction_processor("hi".to_string(), solana_pubkey::new_rand()); assert_eq!(config.accounts.len(), 2); assert!(config diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 2f4c09d6460133..3510f81bacd477 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -66,7 +66,9 @@ pub mod entrypoint; pub mod entrypoint_deprecated; pub mod example_mocks; pub mod feature; -pub mod genesis_config; +#[cfg(feature = "full")] +#[deprecated(since = "2.2.0", note = "Use `solana-genesis-config` crate instead")] +pub use solana_genesis_config as genesis_config; #[cfg(feature = "full")] #[deprecated(since = "2.2.0", note = "Use `solana-hard-forks` crate instead")] pub use solana_hard_forks as hard_forks; diff --git a/svm/examples/Cargo.lock b/svm/examples/Cargo.lock index ec51f4a2312caa..d51d77b3439db9 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -5743,6 +5743,35 @@ dependencies = [ "solana-native-token", ] +[[package]] +name = "solana-genesis-config" +version = "2.2.0" +dependencies = [ + "bincode", + "chrono", + "memmap2", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-cluster-type", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-inflation", + "solana-keypair", + "solana-logger", + "solana-native-token", + "solana-poh-config", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + [[package]] name = "solana-geyser-plugin-manager" version = "2.2.0" @@ -6902,7 +6931,6 @@ dependencies = [ "bytemuck", "bytemuck_derive", "byteorder", - "chrono", "digest 0.10.7", "ed25519-dalek", "getrandom 0.1.16", @@ -6911,7 +6939,6 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", "num-derive", "num-traits", "rand 0.7.3", @@ -6936,6 +6963,7 @@ dependencies = [ "solana-epoch-rewards-hasher", "solana-feature-set", "solana-fee-structure", + "solana-genesis-config", "solana-hard-forks", "solana-inflation", "solana-instruction",