diff --git a/applications/tari_app_utilities/src/common_cli_args.rs b/applications/tari_app_utilities/src/common_cli_args.rs index 51e8e1b4fd..6da5808d48 100644 --- a/applications/tari_app_utilities/src/common_cli_args.rs +++ b/applications/tari_app_utilities/src/common_cli_args.rs @@ -23,6 +23,7 @@ use std::{error::Error, path::PathBuf}; use clap::Args; use log::Level; +use tari_common::configuration::{ConfigOverrideProvider, Network}; #[derive(Args, Debug)] pub struct CommonCliArgs { @@ -101,8 +102,10 @@ impl CommonCliArgs { path } } +} - pub fn config_property_overrides(&self) -> Vec<(String, String)> { +impl ConfigOverrideProvider for CommonCliArgs { + fn get_config_property_overrides(&self, _default_network: Network) -> Vec<(String, String)> { let mut overrides = self.config_property_overrides.clone(); overrides.push(("common.base_path".to_string(), self.base_path.clone())); overrides diff --git a/applications/tari_base_node/src/cli.rs b/applications/tari_base_node/src/cli.rs index 1e78765001..337bcac116 100644 --- a/applications/tari_base_node/src/cli.rs +++ b/applications/tari_base_node/src/cli.rs @@ -22,6 +22,7 @@ use clap::Parser; use tari_app_utilities::common_cli_args::CommonCliArgs; +use tari_common::configuration::{ConfigOverrideProvider, Network}; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -51,16 +52,18 @@ pub(crate) struct Cli { pub network: Option, } -impl Cli { - pub fn config_property_overrides(&self) -> Vec<(String, String)> { - let mut overrides = self.common.config_property_overrides(); - if let Some(network) = &self.network { - overrides.push(("base_node.override_from".to_string(), network.clone())); - overrides.push(("p2p.seeds.override_from".to_string(), network.clone())); - overrides.push(("auto_update.override_from".to_string(), network.clone())); - #[cfg(features = "metrics")] - overrides.push(("metrics.override_from".to_string(), network.clone())); - } +impl ConfigOverrideProvider for Cli { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)> { + let mut overrides = self.common.get_config_property_overrides(default_network); + let network = self + .network + .as_ref() + .cloned() + .unwrap_or_else(|| default_network.to_string()); + overrides.push(("base_node.override_from".to_string(), network.to_string())); + overrides.push(("p2p.seeds.override_from".to_string(), network.to_string())); + overrides.push(("auto_update.override_from".to_string(), network.to_string())); + overrides.push(("metrics.override_from".to_string(), network)); overrides } } diff --git a/applications/tari_base_node/src/config.rs b/applications/tari_base_node/src/config.rs index 30484023c8..031ff4eb55 100644 --- a/applications/tari_base_node/src/config.rs +++ b/applications/tari_base_node/src/config.rs @@ -143,7 +143,7 @@ impl Default for BaseNodeConfig { }; Self { override_from: None, - network: Network::Esmeralda, + network: Network::default(), grpc_address: Some("/ip4/127.0.0.1/tcp/18142".parse().unwrap()), identity_file: PathBuf::from("config/base_node_id.json"), use_libtor: false, diff --git a/applications/tari_base_node/src/main.rs b/applications/tari_base_node/src/main.rs index 55dcabcda2..24112d98d7 100644 --- a/applications/tari_base_node/src/main.rs +++ b/applications/tari_base_node/src/main.rs @@ -138,7 +138,8 @@ fn main_inner() -> Result<(), ExitError> { let cli = Cli::parse(); let config_path = cli.common.config_path(); - let cfg = load_configuration(config_path, true, &cli.config_property_overrides())?; + let cfg = load_configuration(config_path, true, &cli)?; + initialize_logging( &cli.common.log_config_path("base_node"), include_str!("../log4rs_sample.yml"), diff --git a/applications/tari_collectibles/src-tauri/src/cli.rs b/applications/tari_collectibles/src-tauri/src/cli.rs index 5ee2ed826e..4f97357538 100644 --- a/applications/tari_collectibles/src-tauri/src/cli.rs +++ b/applications/tari_collectibles/src-tauri/src/cli.rs @@ -25,11 +25,12 @@ use crate::{ }; use clap::{Parser, Subcommand}; use tari_app_utilities::common_cli_args::CommonCliArgs; -use tari_common::exit_codes::{ExitCode, ExitError}; +use tari_common::{ + configuration::{ConfigOverrideProvider, Network}, + exit_codes::{ExitCode, ExitError}, +}; use uuid::Uuid; -const DEFAULT_NETWORK: &str = "esmeralda"; - #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] #[clap(propagate_version = true)] @@ -40,17 +41,18 @@ pub(crate) struct Cli { #[clap(subcommand)] pub command: Option, /// Supply a network (overrides existing configuration) - #[clap(long, default_value = DEFAULT_NETWORK, env = "TARI_NETWORK")] - pub network: String, + #[clap(long, env = "TARI_NETWORK")] + pub network: Option, } -impl Cli { - pub fn config_property_overrides(&self) -> Vec<(String, String)> { - let mut overrides = self.common.config_property_overrides(); - overrides.push(( - "collectibles.override_from".to_string(), - self.network.clone(), - )); +impl ConfigOverrideProvider for Cli { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)> { + let mut overrides = self.common.get_config_property_overrides(default_network); + let network = self + .network + .clone() + .unwrap_or_else(|| default_network.to_string()); + overrides.push(("collectibles.override_from".to_string(), network)); overrides } } diff --git a/applications/tari_collectibles/src-tauri/src/main.rs b/applications/tari_collectibles/src-tauri/src/main.rs index 1413cfae75..53a0ecb9bb 100644 --- a/applications/tari_collectibles/src-tauri/src/main.rs +++ b/applications/tari_collectibles/src-tauri/src/main.rs @@ -59,11 +59,7 @@ pub fn process_command(command: Commands, state: &ConcurrentAppState) -> Result< fn main() -> Result<(), Box> { let cli = Cli::parse(); - let cfg = load_configuration( - cli.common.config_path(), - true, - &cli.config_property_overrides(), - )?; + let cfg = load_configuration(cli.common.config_path(), true, &cli)?; let config = CollectiblesConfig::load_from(&cfg)?; let state = ConcurrentAppState::new(cli.common.get_base_path(), config); diff --git a/applications/tari_console_wallet/src/cli.rs b/applications/tari_console_wallet/src/cli.rs index 5c3266813c..cf2a3d920d 100644 --- a/applications/tari_console_wallet/src/cli.rs +++ b/applications/tari_console_wallet/src/cli.rs @@ -25,6 +25,7 @@ use std::{path::PathBuf, time::Duration}; use chrono::{DateTime, Utc}; use clap::{Args, Parser, Subcommand}; use tari_app_utilities::{common_cli_args::CommonCliArgs, utilities::UniPublicKey}; +use tari_common::configuration::{ConfigOverrideProvider, Network}; use tari_comms::multiaddr::Multiaddr; use tari_core::transactions::{tari_amount, tari_amount::MicroTari}; use tari_utilities::{ @@ -32,8 +33,6 @@ use tari_utilities::{ SafePassword, }; -const DEFAULT_NETWORK: &str = "esmeralda"; - #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] #[clap(propagate_version = true)] @@ -77,17 +76,19 @@ pub(crate) struct Cli { #[clap(long, alias = "auto-exit")] pub command_mode_auto_exit: bool, /// Supply a network (overrides existing configuration) - #[clap(long, default_value = DEFAULT_NETWORK, env = "TARI_NETWORK")] - pub network: String, + #[clap(long, env = "TARI_NETWORK")] + pub network: Option, #[clap(subcommand)] pub command2: Option, } -impl Cli { - pub fn config_property_overrides(&self) -> Vec<(String, String)> { - let mut overrides = self.common.config_property_overrides(); - overrides.push(("wallet.override_from".to_string(), self.network.clone())); - overrides.push(("p2p.seeds.override_from".to_string(), self.network.clone())); +impl ConfigOverrideProvider for Cli { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)> { + let mut overrides = self.common.get_config_property_overrides(default_network); + let network = self.network.clone().unwrap_or_else(|| default_network.to_string()); + overrides.push(("wallet.network".to_string(), network.clone())); + overrides.push(("wallet.override_from".to_string(), network.clone())); + overrides.push(("p2p.seeds.override_from".to_string(), network)); overrides } } diff --git a/applications/tari_console_wallet/src/main.rs b/applications/tari_console_wallet/src/main.rs index b679fa33ec..df96d1882c 100644 --- a/applications/tari_console_wallet/src/main.rs +++ b/applications/tari_console_wallet/src/main.rs @@ -93,14 +93,14 @@ fn main_inner() -> Result<(), ExitError> { let cli = Cli::parse(); let config_path = cli.common.config_path(); - let cfg = load_configuration(config_path.as_path(), true, &cli.config_property_overrides())?; + let cfg = load_configuration(config_path.as_path(), true, &cli)?; initialize_logging( &cli.common.log_config_path("wallet"), include_str!("../log4rs_sample.yml"), )?; + #[cfg_attr(feature = "libtor", allow(unused_mut))] let mut config = ApplicationConfig::load_from(&cfg)?; - config.wallet.network = cli.network.parse()?; let runtime = tokio::runtime::Builder::new_multi_thread() .enable_all() diff --git a/applications/tari_merge_mining_proxy/src/cli.rs b/applications/tari_merge_mining_proxy/src/cli.rs index c5ab6b80af..8cdadc90eb 100644 --- a/applications/tari_merge_mining_proxy/src/cli.rs +++ b/applications/tari_merge_mining_proxy/src/cli.rs @@ -22,8 +22,7 @@ use clap::Parser; use tari_app_utilities::common_cli_args::CommonCliArgs; - -const DEFAULT_NETWORK: &str = "esmeralda"; +use tari_common::configuration::{ConfigOverrideProvider, Network}; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -32,14 +31,15 @@ pub(crate) struct Cli { #[clap(flatten)] pub common: CommonCliArgs, /// Supply a network (overrides existing configuration) - #[clap(long, default_value = DEFAULT_NETWORK, env = "TARI_NETWORK")] - pub network: String, + #[clap(long, env = "TARI_NETWORK")] + pub network: Option, } -impl Cli { - pub fn config_property_overrides(&self) -> Vec<(String, String)> { - let mut overrides = self.common.config_property_overrides.clone(); - overrides.push(("merge_mining_proxy.override_from".to_string(), self.network.clone())); +impl ConfigOverrideProvider for Cli { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)> { + let mut overrides = self.common.get_config_property_overrides(default_network); + let network = self.network.clone().unwrap_or_else(|| default_network.to_string()); + overrides.push(("merge_mining_proxy.override_from".to_string(), network)); overrides } } diff --git a/applications/tari_merge_mining_proxy/src/main.rs b/applications/tari_merge_mining_proxy/src/main.rs index b96c970174..90b6e25a17 100644 --- a/applications/tari_merge_mining_proxy/src/main.rs +++ b/applications/tari_merge_mining_proxy/src/main.rs @@ -67,7 +67,7 @@ async fn main() -> Result<(), anyhow::Error> { let cli = Cli::parse(); let config_path = cli.common.config_path(); - let cfg = load_configuration(&config_path, true, &cli.config_property_overrides())?; + let cfg = load_configuration(&config_path, true, &cli)?; initialize_logging( &cli.common.log_config_path("proxy"), include_str!("../log4rs_sample.yml"), diff --git a/applications/tari_miner/src/main.rs b/applications/tari_miner/src/main.rs index b98fa355da..fec42dc7ee 100644 --- a/applications/tari_miner/src/main.rs +++ b/applications/tari_miner/src/main.rs @@ -85,7 +85,7 @@ async fn main_inner() -> Result<(), ExitError> { let cli = Cli::parse(); let config_path = cli.common.config_path(); - let cfg = load_configuration(config_path.as_path(), true, &cli.common.config_property_overrides)?; + let cfg = load_configuration(config_path.as_path(), true, &cli.common)?; initialize_logging( &cli.common.log_config_path("miner"), include_str!("../log4rs_sample.yml"), diff --git a/applications/tari_validator_node/src/cli.rs b/applications/tari_validator_node/src/cli.rs index 80cc7a5392..d9d86ae85b 100644 --- a/applications/tari_validator_node/src/cli.rs +++ b/applications/tari_validator_node/src/cli.rs @@ -22,8 +22,7 @@ use clap::Parser; use tari_app_utilities::common_cli_args::CommonCliArgs; - -const DEFAULT_NETWORK: &str = "esmeralda"; +use tari_common::configuration::{ConfigOverrideProvider, Network}; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -35,16 +34,17 @@ pub(crate) struct Cli { #[clap(long, aliases = &["tracing", "enable-tracing"])] pub tracing_enabled: bool, /// Supply a network (overrides existing configuration) - #[clap(long, default_value = DEFAULT_NETWORK, env = "TARI_NETWORK")] - pub network: String, + #[clap(long, env = "TARI_NETWORK")] + pub network: Option, } -impl Cli { - pub fn config_property_overrides(&self) -> Vec<(String, String)> { - let mut overrides = self.common.config_property_overrides(); - overrides.push(("network".to_string(), self.network.clone())); - overrides.push(("validator_node.override_from".to_string(), self.network.clone())); - overrides.push(("p2p.seeds.override_from".to_string(), self.network.clone())); +impl ConfigOverrideProvider for Cli { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)> { + let mut overrides = self.common.get_config_property_overrides(default_network); + let network = self.network.clone().unwrap_or_else(|| default_network.to_string()); + overrides.push(("network".to_string(), network.clone())); + overrides.push(("validator_node.override_from".to_string(), network.clone())); + overrides.push(("p2p.seeds.override_from".to_string(), network)); overrides } } diff --git a/applications/tari_validator_node/src/main.rs b/applications/tari_validator_node/src/main.rs index 2acc221efb..4a9770e4ff 100644 --- a/applications/tari_validator_node/src/main.rs +++ b/applications/tari_validator_node/src/main.rs @@ -98,14 +98,14 @@ fn main() { fn main_inner() -> Result<(), ExitError> { let cli = Cli::parse(); - println!("Starting validator node on network {}", cli.network); let config_path = cli.common.config_path(); - let cfg = load_configuration(config_path, true, &cli.config_property_overrides())?; + let cfg = load_configuration(config_path, true, &cli)?; initialize_logging( &cli.common.log_config_path("validator"), include_str!("../log4rs_sample.yml"), )?; let config = ApplicationConfig::load_from(&cfg)?; + println!("Starting validator node on network {}", config.network); let runtime = build_runtime()?; runtime.block_on(run_node(&config))?; diff --git a/base_layer/wallet/src/transaction_service/service.rs b/base_layer/wallet/src/transaction_service/service.rs index a5069d6562..093b120709 100644 --- a/base_layer/wallet/src/transaction_service/service.rs +++ b/base_layer/wallet/src/transaction_service/service.rs @@ -1055,6 +1055,7 @@ where let sender_offset_private_key = stp .get_recipient_sender_offset_private_key(0) .map_err(|e| TransactionServiceProtocolError::new(tx_id, e.into()))?; + let spend_key = PrivateKey::from_bytes( CommsPublicKey::shared_secret(&sender_offset_private_key.clone(), &dest_pubkey.clone()).as_bytes(), ) diff --git a/common/src/configuration/mod.rs b/common/src/configuration/mod.rs index 82a89258b9..d6af5a87e6 100644 --- a/common/src/configuration/mod.rs +++ b/common/src/configuration/mod.rs @@ -65,6 +65,19 @@ pub fn socket_or_multi(addr: &str) -> Result { .or_else(|_| addr.parse::()) } +/// Implement this trait to specify custom configuration overrides for a network when loading the config +pub trait ConfigOverrideProvider { + fn get_config_property_overrides(&self, default_network: Network) -> Vec<(String, String)>; +} + +pub struct NoConfigOverrides; + +impl ConfigOverrideProvider for NoConfigOverrides { + fn get_config_property_overrides(&self, _default_network: Network) -> Vec<(String, String)> { + Vec::new() + } +} + #[cfg(test)] mod test { use std::net::{Ipv4Addr, Ipv6Addr}; diff --git a/common/src/configuration/network.rs b/common/src/configuration/network.rs index b9048759db..0122b3ab2a 100644 --- a/common/src/configuration/network.rs +++ b/common/src/configuration/network.rs @@ -68,9 +68,11 @@ impl Network { } } +/// The default network for all applications impl Default for Network { fn default() -> Self { - Network::MainNet + // TODO: set the default network to mainnet + Network::Esmeralda } } @@ -157,7 +159,7 @@ mod test { #[test] fn network_default() { let network = Network::default(); - assert_eq!(network, Network::MainNet); + assert_eq!(network, Network::Esmeralda); } #[test] diff --git a/common/src/configuration/utils.rs b/common/src/configuration/utils.rs index 79570a0933..bd152aa546 100644 --- a/common/src/configuration/utils.rs +++ b/common/src/configuration/utils.rs @@ -12,14 +12,18 @@ use serde::{ Serializer, }; -use crate::{ConfigError, LOG_TARGET}; +use crate::{ + configuration::{ConfigOverrideProvider, Network}, + ConfigError, + LOG_TARGET, +}; //------------------------------------- Main API functions --------------------------------------// -pub fn load_configuration>( +pub fn load_configuration, TOverride: ConfigOverrideProvider>( config_path: P, create_if_not_exists: bool, - overrides: &[(String, String)], + overrides: &TOverride, ) -> Result { debug!( target: LOG_TARGET, @@ -34,24 +38,47 @@ pub fn load_configuration>( .as_ref() .to_str() .ok_or_else(|| ConfigError::new("Invalid config file path", None))?; - let mut cfg = Config::builder() + let cfg = Config::builder() .add_source(config::File::with_name(filename)) .add_source( config::Environment::with_prefix("TARI") .prefix_separator("_") .separator("__"), - ); + ) + .build() + .map_err(|ce| ConfigError::new("Could not build config", Some(ce.to_string())))?; + + let network = match cfg.get_string("network") { + Ok(network) => { + Network::from_str(&network).map_err(|e| ConfigError::new("Invalid network", Some(e.to_string())))? + }, + Err(config::ConfigError::NotFound(_)) => { + debug!(target: LOG_TARGET, "No network configuration found. Using default."); + Network::default() + }, + Err(e) => { + return Err(ConfigError::new( + "Could not get network configuration", + Some(e.to_string()), + )); + }, + }; + info!(target: LOG_TARGET, "Configuration file loaded."); + let overrides = overrides.get_config_property_overrides(network); + if overrides.is_empty() { + return Ok(cfg); + } + + let mut cfg = Config::builder().add_source(cfg); for (key, value) in overrides { cfg = cfg .set_override(key.as_str(), value.as_str()) .map_err(|ce| ConfigError::new("Could not override config property", Some(ce.to_string())))?; } - let cfg = cfg .build() .map_err(|ce| ConfigError::new("Could not build config", Some(ce.to_string())))?; - info!(target: LOG_TARGET, "Configuration file loaded."); Ok(cfg) }