diff --git a/nodes/nomos-node/Cargo.toml b/nodes/nomos-node/Cargo.toml index ea500fb4..1c8321d5 100644 --- a/nodes/nomos-node/Cargo.toml +++ b/nodes/nomos-node/Cargo.toml @@ -13,6 +13,7 @@ clap = { version = "4", features = ["derive"] } chrono = "0.4" futures = "0.3" http = "0.2.9" +hex = "0.4.3" overwatch-rs = { git = "https://github.com/logos-co/Overwatch", branch = "main" } overwatch-derive = { git = "https://github.com/logos-co/Overwatch", branch = "main" } tracing = "0.1" @@ -23,6 +24,7 @@ nomos-log = { path = "../../nomos-services/log" } nomos-mempool = { path = "../../nomos-services/mempool", features = ["mock"] } nomos-http = { path = "../../nomos-services/http", features = ["http"] } nomos-consensus = { path = "../../nomos-services/consensus" } +nomos-libp2p = { path = "../../nomos-libp2p", optional = true } metrics = { path = "../../nomos-services/metrics", optional = true } tracing-subscriber = "0.3" consensus-engine = { path = "../../consensus-engine" } @@ -37,4 +39,4 @@ waku-bindings = { version = "0.1.1", optional = true } [features] default = ["waku"] waku = ["waku-bindings", "nomos-network/waku", "nomos-mempool/waku", "nomos-consensus/waku"] -libp2p = ["nomos-network/libp2p", "nomos-mempool/libp2p", "nomos-consensus/libp2p"] +libp2p = ["nomos-libp2p", "nomos-network/libp2p", "nomos-mempool/libp2p", "nomos-consensus/libp2p"] diff --git a/nodes/nomos-node/src/lib.rs b/nodes/nomos-node/src/lib.rs index 204e5bf2..9fe56cfc 100644 --- a/nodes/nomos-node/src/lib.rs +++ b/nodes/nomos-node/src/lib.rs @@ -13,6 +13,8 @@ use nomos_core::fountain::mock::MockFountain; use nomos_http::backends::axum::AxumBackend; use nomos_http::bridge::HttpBridgeService; use nomos_http::http::HttpService; +#[cfg(feature = "libp2p")] +use nomos_libp2p::secp256k1::SecretKey; use nomos_log::Logger; #[cfg(feature = "libp2p")] use nomos_mempool::network::adapters::libp2p::Libp2pAdapter as MempoolLibp2pAdapter; @@ -27,6 +29,8 @@ use nomos_network::NetworkService; use overwatch_derive::*; use overwatch_rs::services::{handle::ServiceHandle, ServiceData}; use serde::{Deserialize, Serialize}; +#[cfg(feature = "waku")] +use waku_bindings::SecretKey; pub use tx::Tx; @@ -46,6 +50,25 @@ pub struct Config { pub metrics: > as ServiceData>::Settings, } +impl Config { + pub fn set_node_key(&mut self, node_key: Option) -> Result<()> { + if let Some(node_key) = node_key { + #[cfg(feature = "waku")] + { + use std::str::FromStr; + self.network.backend.inner.node_key = Some(SecretKey::from_str(&node_key)?) + } + #[cfg(feature = "libp2p")] + { + let mut key_bytes = hex::decode(node_key)?; + self.network.backend.node_key = + SecretKey::try_from_bytes(key_bytes.as_mut_slice())?; + } + } + Ok(()) + } +} + #[cfg(feature = "waku")] pub type Carnot = CarnotConsensus< ConsensusWakuAdapter, diff --git a/nodes/nomos-node/src/main.rs b/nodes/nomos-node/src/main.rs index 99642263..e353938a 100644 --- a/nodes/nomos-node/src/main.rs +++ b/nodes/nomos-node/src/main.rs @@ -22,11 +22,16 @@ use std::sync::Arc; struct Args { /// Path for a yaml-encoded network config file config: std::path::PathBuf, + /// Overrides node key in config file + #[clap(long = "node-key")] + node_key: Option, } fn main() -> Result<()> { - let Args { config } = Args::parse(); - let config = serde_yaml::from_reader::<_, Config>(std::fs::File::open(config)?)?; + let Args { config, node_key } = Args::parse(); + let mut config = serde_yaml::from_reader::<_, Config>(std::fs::File::open(config)?)?; + config.set_node_key(node_key)?; + let bridges: Vec = vec![ Arc::new(Box::new(bridges::carnot_info_bridge)), Arc::new(Box::new(bridges::mempool_metrics_bridge)),