diff --git a/Cargo.lock b/Cargo.lock index 3caf437f..fe9d1ed4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,6 +383,26 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -913,7 +933,7 @@ dependencies = [ [[package]] name = "cuprated" -version = "0.1.0" +version = "0.0.1" dependencies = [ "anyhow", "async-trait", @@ -924,6 +944,7 @@ dependencies = [ "cfg-if", "chrono", "clap", + "const_format", "crossbeam", "crypto-bigint", "cuprate-address-book", @@ -2899,6 +2920,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index 254d3ce4..0aa5875a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,7 @@ clap = { version = "4.5.17", default-features = false } chrono = { version = "0.4.38", default-features = false } crypto-bigint = { version = "0.5.5", default-features = false } crossbeam = { version = "0.8.4", default-features = false } +const_format = { version = "0.2.33", default-features = false } curve25519-dalek = { version = "4.1.3", default-features = false } dashmap = { version = "5.5.3", default-features = false } dirs = { version = "5.0.1", default-features = false } diff --git a/binaries/cuprated/Cargo.toml b/binaries/cuprated/Cargo.toml index a886c124..c8ccd5a6 100644 --- a/binaries/cuprated/Cargo.toml +++ b/binaries/cuprated/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cuprated" -version = "0.1.0" +version = "0.0.1" edition = "2021" description = "The Cuprate Monero Rust node." license = "AGPL-3.0-only" @@ -42,11 +42,12 @@ borsh = { workspace = true } bytemuck = { workspace = true } bytes = { workspace = true } cfg-if = { workspace = true } -clap = { workspace = true } +clap = { workspace = true, features = ["cargo"] } chrono = { workspace = true } crypto-bigint = { workspace = true } crossbeam = { workspace = true } curve25519-dalek = { workspace = true } +const_format = { workspace = true } dashmap = { workspace = true } dirs = { workspace = true } futures = { workspace = true } diff --git a/binaries/cuprated/src/constants.rs b/binaries/cuprated/src/constants.rs new file mode 100644 index 00000000..9463d476 --- /dev/null +++ b/binaries/cuprated/src/constants.rs @@ -0,0 +1,34 @@ +//! General constants used throughout `cuprated`. + +use const_format::formatcp; + +/// `cuprated`'s semantic version (`MAJOR.MINOR.PATCH`) as string. +pub const VERSION: &str = clap::crate_version!(); + +/// [`VERSION`] + the build type. +/// +/// If a debug build, the suffix is `-debug`, else it is `-release`. +pub const VERSION_BUILD: &str = if cfg!(debug_assertions) { + formatcp!("{VERSION}-debug") +} else { + formatcp!("{VERSION}-release") +}; + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn version() { + assert_eq!(VERSION, "0.0.1"); + } + + #[test] + fn version_build() { + if cfg!(debug_assertions) { + assert_eq!(VERSION_BUILD, "0.0.1-debug"); + } else { + assert_eq!(VERSION_BUILD, "0.0.1-release"); + } + } +} diff --git a/binaries/cuprated/src/main.rs b/binaries/cuprated/src/main.rs index 76eb85e8..775843df 100644 --- a/binaries/cuprated/src/main.rs +++ b/binaries/cuprated/src/main.rs @@ -13,10 +13,16 @@ mod blockchain; mod config; +mod constants; mod p2p; mod rpc; +mod statics; mod txpool; fn main() { + // Initialize global static `LazyLock` data. + statics::init_lazylock_statics(); + + // TODO: everything else. todo!() } diff --git a/binaries/cuprated/src/statics.rs b/binaries/cuprated/src/statics.rs new file mode 100644 index 00000000..8aab1c9a --- /dev/null +++ b/binaries/cuprated/src/statics.rs @@ -0,0 +1,53 @@ +//! Global `static`s used throughout `cuprated`. + +use std::{ + sync::{atomic::AtomicU64, LazyLock}, + time::{SystemTime, UNIX_EPOCH}, +}; + +/// Define all the `static`s that should be always be initialized early on. +/// +/// This wraps all `static`s inside a `LazyLock` and generates +/// a [`init_lazylock_statics`] function that must/should be +/// used by `main()` early on. +macro_rules! define_init_lazylock_statics { + ($( + $( #[$attr:meta] )* + $name:ident: $t:ty = $init_fn:expr; + )*) => { + /// Initialize global static `LazyLock` data. + pub fn init_lazylock_statics() { + $( + LazyLock::force(&$name); + )* + } + + $( + $(#[$attr])* + pub static $name: LazyLock<$t> = LazyLock::new(|| $init_fn); + )* + }; +} + +define_init_lazylock_statics! { + /// The start time of `cuprated`. + START_INSTANT: SystemTime = SystemTime::now(); + + /// Start time of `cuprated` as a UNIX timestamp. + START_INSTANT_UNIX: u64 = START_INSTANT + .duration_since(UNIX_EPOCH) + .expect("Failed to set `cuprated` startup time.") + .as_secs(); +} + +#[cfg(test)] +mod test { + use super::*; + + /// Sanity check for startup UNIX time. + #[test] + fn start_instant_unix() { + // Fri Sep 27 01:07:13 AM UTC 2024 + assert!(*START_INSTANT_UNIX > 1727399233); + } +}