From 222ef15665cf9417dc16c2abd88523f8e97f65e9 Mon Sep 17 00:00:00 2001 From: Stan Bondi Date: Mon, 8 Aug 2022 13:03:29 +0400 Subject: [PATCH] fix: apply network config overrides from cli or else file (#4407) Description --- Uses `network` value from cli, config, then default (currently, Esmeralda) in that order. The network is read from the config file before getting and applying config overrides. Fixes #4402 Motivation and Context --- On the base node, the network would need to be explicitly provided on the cli for config file overrides to be applied. The network value set in the config file was previously ignored. The default network `Network::default()` is set in one place for every application. How Has This Been Tested? --- Manually: - not setting a network in cli on the base node and checking that esme is used - changing network on in the config file and checking that it is used --- .../tari_app_utilities/src/common_cli_args.rs | 5 ++- applications/tari_base_node/src/cli.rs | 23 ++++++----- applications/tari_base_node/src/config.rs | 2 +- applications/tari_base_node/src/main.rs | 3 +- .../tari_collectibles/src-tauri/src/cli.rs | 26 ++++++------ .../tari_collectibles/src-tauri/src/main.rs | 6 +-- applications/tari_console_wallet/src/cli.rs | 19 +++++---- applications/tari_console_wallet/src/main.rs | 4 +- .../tari_merge_mining_proxy/src/cli.rs | 16 ++++---- .../tari_merge_mining_proxy/src/main.rs | 2 +- applications/tari_miner/src/main.rs | 2 +- applications/tari_validator_node/src/cli.rs | 20 ++++----- applications/tari_validator_node/src/main.rs | 4 +- .../wallet/src/transaction_service/service.rs | 1 + common/src/configuration/mod.rs | 13 ++++++ common/src/configuration/network.rs | 6 ++- common/src/configuration/utils.rs | 41 +++++++++++++++---- 17 files changed, 121 insertions(+), 72 deletions(-) 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) }