diff --git a/Cargo.lock b/Cargo.lock index 0bc53266deb..0822026fe5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4999,23 +4999,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "nym-network-statistics" -version = "1.1.34" -dependencies = [ - "dirs 4.0.0", - "log", - "nym-bin-common", - "nym-statistics-common", - "nym-task", - "pretty_env_logger", - "rocket", - "serde", - "sqlx", - "thiserror", - "tokio", -] - [[package]] name = "nym-node" version = "1.1.4" diff --git a/gateway/src/commands/helpers.rs b/gateway/src/commands/helpers.rs index d1672999a70..c8551cc4452 100644 --- a/gateway/src/commands/helpers.rs +++ b/gateway/src/commands/helpers.rs @@ -1,7 +1,6 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use crate::commands::upgrade_helpers; use log::{error, info}; use nym_config::{save_formatted_config_to_file, OptionalSet}; use nym_crypto::asymmetric::identity; @@ -122,8 +121,6 @@ pub(crate) fn ensure_correct_bech32_prefix(address: &AccountId) -> Result<(), Ga } pub(crate) fn try_load_current_config(id: &str) -> Result { - upgrade_helpers::try_upgrade_config(id)?; - Config::read_from_default_path(id).map_err(|err| { error!( "Failed to load config for {id}. Are you sure you have run `init` before? (Error was: {err})", diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index 3cd84a1c0a2..d2100efab61 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -2,9 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::Cli; +use anyhow::bail; use clap::CommandFactory; use clap::Subcommand; -use log::warn; +use log::{error, warn}; use nym_bin_common::completions::{fig_generate, ArgShell}; use std::io::IsTerminal; use std::time::Duration; @@ -17,7 +18,6 @@ pub(crate) mod run; pub(crate) mod setup_ip_packet_router; pub(crate) mod setup_network_requester; pub(crate) mod sign; -mod upgrade_helpers; #[derive(Subcommand)] pub(crate) enum Commands { @@ -55,6 +55,12 @@ pub(crate) enum Commands { pub(crate) async fn execute(args: Cli) -> anyhow::Result<()> { let bin_name = "nym-gateway"; + if !args.force_run { + let msg = "standalone gateways have been deprecated - please migrate to a `nym-node` via `nym-node migrate gateways` command"; + error!("{msg}"); + bail!("{msg}") + } + warn!("standalone gateways have been deprecated - please consider migrating it to a `nym-node` via `nym-node migrate gateway` command"); if std::io::stdout().is_terminal() { // if user is running it in terminal session, diff --git a/gateway/src/commands/upgrade_helpers.rs b/gateway/src/commands/upgrade_helpers.rs deleted file mode 100644 index 3087b24aa86..00000000000 --- a/gateway/src/commands/upgrade_helpers.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use log::info; -use nym_gateway::config::old_config_v1_1_20::ConfigV1_1_20; -use nym_gateway::config::old_config_v1_1_28::ConfigV1_1_28; -use nym_gateway::config::old_config_v1_1_29::ConfigV1_1_29; -use nym_gateway::config::old_config_v1_1_31::ConfigV1_1_31; -use nym_gateway::config::old_config_v1_1_36::ConfigV1_1_36; -use nym_gateway::config::{default_config_filepath, Config}; -use nym_gateway::error::GatewayError; - -fn try_upgrade_v1_1_20_config(id: &str) -> Result { - use nym_config::legacy_helpers::nym_config::MigrationNymConfig; - - // explicitly load it as v1.1.20 (which is incompatible with the current, i.e. 1.1.21+) - let Ok(old_config) = ConfigV1_1_20::load_from_file(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the gateway is using <= v1.1.20 config template."); - info!("It is going to get updated to the current specification."); - - let updated_step1: ConfigV1_1_28 = old_config.into(); - let updated_step2: ConfigV1_1_29 = updated_step1.into(); - let updated_step3: ConfigV1_1_31 = updated_step2.into(); - let updated_step4: ConfigV1_1_36 = updated_step3.into(); - let updated: Config = updated_step4.into(); - updated - .save_to_default_location() - .map_err(|err| GatewayError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -fn try_upgrade_v1_1_28_config(id: &str) -> Result { - // explicitly load it as v1.1.28 (which is incompatible with the current, i.e. 1.1.29+) - let Ok(old_config) = ConfigV1_1_28::read_from_default_path(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the gateway is using <= v1.1.28 config template."); - info!("It is going to get updated to the current specification."); - - let updated_step1: ConfigV1_1_29 = old_config.into(); - let updated_step2: ConfigV1_1_31 = updated_step1.into(); - let updated_step3: ConfigV1_1_36 = updated_step2.into(); - let updated: Config = updated_step3.into(); - updated - .save_to_default_location() - .map_err(|err| GatewayError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -fn try_upgrade_v1_1_29_config(id: &str) -> Result { - // explicitly load it as v1.1.29 (which is incompatible with the current, i.e. 1.1.30+) - let Ok(old_config) = ConfigV1_1_29::read_from_default_path(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the gateway is using <= v1.1.29 config template."); - info!("It is going to get updated to the current specification."); - - let updated_step1: ConfigV1_1_31 = old_config.into(); - let updated_step2: ConfigV1_1_36 = updated_step1.into(); - let updated: Config = updated_step2.into(); - updated - .save_to_default_location() - .map_err(|err| GatewayError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -fn try_upgrade_v1_1_31_config(id: &str) -> Result { - // explicitly load it as v1.1.31 (which is incompatible with the current, i.e. 1.1.32+) - let Ok(old_config) = ConfigV1_1_31::read_from_default_path(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the gateway is using <= v1.1.31 config template."); - info!("It is going to get updated to the current specification."); - - let updated_step1: ConfigV1_1_36 = old_config.into(); - let updated: Config = updated_step1.into(); - updated - .save_to_default_location() - .map_err(|err| GatewayError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -fn try_upgrade_v1_1_36_config(id: &str) -> Result { - // explicitly load it as v1.1.36 (which is incompatible with the current, i.e. 1.1.37+) - let Ok(old_config) = ConfigV1_1_36::read_from_default_path(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the gateway is using <= v1.1.36 config template."); - info!("It is going to get updated to the current specification."); - - let updated: Config = old_config.into(); - updated - .save_to_default_location() - .map_err(|err| GatewayError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -pub(crate) fn try_upgrade_config(id: &str) -> Result<(), GatewayError> { - if try_upgrade_v1_1_20_config(id)? { - return Ok(()); - } - if try_upgrade_v1_1_28_config(id)? { - return Ok(()); - } - if try_upgrade_v1_1_29_config(id)? { - return Ok(()); - } - if try_upgrade_v1_1_31_config(id)? { - return Ok(()); - } - if try_upgrade_v1_1_36_config(id)? { - return Ok(()); - } - - Ok(()) -} diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index 564c0b60a58..91d1e3b92e9 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -22,11 +22,6 @@ use zeroize::{Zeroize, ZeroizeOnDrop}; pub use crate::config::persistence::paths::GatewayPaths; -pub mod old_config_v1_1_20; -pub mod old_config_v1_1_28; -pub mod old_config_v1_1_29; -pub mod old_config_v1_1_31; -pub mod old_config_v1_1_36; pub mod persistence; mod template; diff --git a/gateway/src/config/old_config_v1_1_20.rs b/gateway/src/config/old_config_v1_1_20.rs deleted file mode 100644 index 2ab7431a318..00000000000 --- a/gateway/src/config/old_config_v1_1_20.rs +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config::old_config_v1_1_28::{ - ConfigV1_1_28, DebugV1_1_28, GatewayPathsV1_1_28, GatewayV1_1_28, KeysPathsV1_1_28, - LoggingSettingsV1_1_28, -}; -use nym_config::legacy_helpers::nym_config::MigrationNymConfig; -use nym_validator_client::nyxd; -use serde::{Deserialize, Serialize}; -use std::net::{IpAddr, Ipv4Addr}; -use std::path::PathBuf; -use std::str::FromStr; -use std::time::Duration; -use url::Url; - -const STATISTICS_SERVICE_DOMAIN_ADDRESS: &str = "https://mainnet-stats.nymte.ch:8090/"; -const NYXD_URL: &str = "https://rpc.nymtech.net"; -const NYM_API: &str = "https://validator.nymtech.net/api/"; -const DEFAULT_MIX_LISTENING_PORT: u16 = 1789; -const DEFAULT_CLIENT_LISTENING_PORT: u16 = 9000; - -const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; -const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; - -/// returns a `0.0.0.0` / INADDR_ANY -fn bind_all_address() -> IpAddr { - IpAddr::V4(Ipv4Addr::UNSPECIFIED) -} - -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -pub struct ConfigV1_1_20 { - gateway: GatewayV1_1_20, - - #[serde(default)] - logging: LoggingV1_1_20, - #[serde(default)] - debug: DebugV1_1_20, -} - -impl From for ConfigV1_1_28 { - fn from(value: ConfigV1_1_20) -> Self { - ConfigV1_1_28 { - gateway: GatewayV1_1_28 { - version: value.gateway.version, - id: value.gateway.id, - only_coconut_credentials: value.gateway.only_coconut_credentials, - listening_address: value.gateway.listening_address, - mix_port: value.gateway.mix_port, - clients_port: value.gateway.clients_port, - enabled_statistics: value.gateway.enabled_statistics, - nym_api_urls: value.gateway.nym_api_urls, - nyxd_urls: value.gateway.nyxd_urls, - statistics_service_url: value.gateway.statistics_service_url, - cosmos_mnemonic: value.gateway.cosmos_mnemonic, - }, - storage_paths: GatewayPathsV1_1_28 { - keys: KeysPathsV1_1_28 { - private_identity_key_file: value.gateway.private_identity_key_file, - public_identity_key_file: value.gateway.public_identity_key_file, - private_sphinx_key_file: value.gateway.private_sphinx_key_file, - public_sphinx_key_file: value.gateway.public_sphinx_key_file, - }, - clients_storage: value.gateway.persistent_storage, - }, - logging: value.logging.into(), - debug: value.debug.into(), - } - } -} - -impl MigrationNymConfig for ConfigV1_1_20 { - fn default_root_directory() -> PathBuf { - // unless this is run on some esoteric system, it should not fail thus the expect is fine - #[allow(clippy::expect_used)] - dirs::home_dir() - .expect("Failed to evaluate $HOME value") - .join(".nym") - .join("gateways") - } -} - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] -pub struct GatewayV1_1_20 { - version: String, - id: String, - - #[serde(default)] - only_coconut_credentials: bool, - #[serde(default = "bind_all_address")] - listening_address: IpAddr, - announce_address: String, - mix_port: u16, - clients_port: u16, - private_identity_key_file: PathBuf, - public_identity_key_file: PathBuf, - private_sphinx_key_file: PathBuf, - public_sphinx_key_file: PathBuf, - enabled_statistics: bool, - statistics_service_url: Url, - #[serde(alias = "validator_api_urls")] - nym_api_urls: Vec, - #[serde(alias = "validator_nymd_urls")] - nyxd_urls: Vec, - cosmos_mnemonic: bip39::Mnemonic, - nym_root_directory: PathBuf, - persistent_storage: PathBuf, - wallet_address: Option, -} - -impl Default for GatewayV1_1_20 { - fn default() -> Self { - // allow usage of `expect` here as our default mainnet values should have been well-formed. - #[allow(clippy::expect_used)] - GatewayV1_1_20 { - version: env!("CARGO_PKG_VERSION").to_string(), - id: "".to_string(), - only_coconut_credentials: false, - listening_address: bind_all_address(), - announce_address: "127.0.0.1".to_string(), - mix_port: DEFAULT_MIX_LISTENING_PORT, - clients_port: DEFAULT_CLIENT_LISTENING_PORT, - private_identity_key_file: Default::default(), - public_identity_key_file: Default::default(), - private_sphinx_key_file: Default::default(), - public_sphinx_key_file: Default::default(), - enabled_statistics: false, - statistics_service_url: Url::from_str(STATISTICS_SERVICE_DOMAIN_ADDRESS) - .expect("Invalid default statistics service URL"), - nym_api_urls: vec![Url::from_str(NYM_API).expect("Invalid default API URL")], - nyxd_urls: vec![Url::from_str(NYXD_URL).expect("Invalid default nyxd URL")], - cosmos_mnemonic: bip39::Mnemonic::generate(24) - .expect("failed to generate fresh mnemonic"), - nym_root_directory: ConfigV1_1_20::default_root_directory(), - persistent_storage: Default::default(), - wallet_address: None, - } - } -} - -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -struct LoggingV1_1_20 {} - -impl From for LoggingSettingsV1_1_28 { - fn from(_value: LoggingV1_1_20) -> Self { - LoggingSettingsV1_1_28 {} - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -struct DebugV1_1_20 { - #[serde(with = "humantime_serde")] - packet_forwarding_initial_backoff: Duration, - #[serde(with = "humantime_serde")] - packet_forwarding_maximum_backoff: Duration, - #[serde(with = "humantime_serde")] - initial_connection_timeout: Duration, - maximum_connection_buffer_size: usize, - #[serde(with = "humantime_serde")] - presence_sending_delay: Duration, - stored_messages_filename_length: u16, - message_retrieval_limit: i64, - use_legacy_framed_packet_version: bool, -} - -impl From for DebugV1_1_28 { - fn from(value: DebugV1_1_20) -> Self { - DebugV1_1_28 { - packet_forwarding_initial_backoff: value.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.initial_connection_timeout, - maximum_connection_buffer_size: value.maximum_connection_buffer_size, - presence_sending_delay: value.presence_sending_delay, - stored_messages_filename_length: value.stored_messages_filename_length, - message_retrieval_limit: value.message_retrieval_limit, - use_legacy_framed_packet_version: value.use_legacy_framed_packet_version, - } - } -} - -impl Default for DebugV1_1_20 { - fn default() -> Self { - DebugV1_1_20 { - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, - message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, - // TODO: remember to change it in one of future releases!! - use_legacy_framed_packet_version: true, - } - } -} diff --git a/gateway/src/config/old_config_v1_1_28.rs b/gateway/src/config/old_config_v1_1_28.rs deleted file mode 100644 index 42311d36de1..00000000000 --- a/gateway/src/config/old_config_v1_1_28.rs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2020-2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config::old_config_v1_1_29::{ - ConfigV1_1_29, DebugV1_1_29, GatewayPathsV1_1_29, GatewayV1_1_29, KeysPathsV1_1_29, - LoggingSettingsV1_1_29, -}; -use nym_config::{ - must_get_home, read_config_from_toml_file, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, NYM_DIR, -}; -use serde::{Deserialize, Serialize}; -use std::io; -use std::net::IpAddr; -use std::path::{Path, PathBuf}; -use std::time::Duration; -use url::Url; - -const DEFAULT_GATEWAYS_DIR: &str = "gateways"; - -// 'DEBUG' -// where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; -const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; - -/// Derive default path to gateway's config directory. -/// It should get resolved to `$HOME/.nym/gateways//config` -pub fn default_config_directory>(id: P) -> PathBuf { - must_get_home() - .join(NYM_DIR) - .join(DEFAULT_GATEWAYS_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to gateways's config file. -/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { - default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct KeysPathsV1_1_28 { - pub private_identity_key_file: PathBuf, - pub public_identity_key_file: PathBuf, - pub private_sphinx_key_file: PathBuf, - pub public_sphinx_key_file: PathBuf, -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct GatewayPathsV1_1_28 { - pub keys: KeysPathsV1_1_28, - #[serde(alias = "persistent_storage")] - pub clients_storage: PathBuf, -} - -#[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct LoggingSettingsV1_1_28 {} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_28 { - pub gateway: GatewayV1_1_28, - - pub storage_paths: GatewayPathsV1_1_28, - - #[serde(default)] - pub logging: LoggingSettingsV1_1_28, - - #[serde(default)] - pub debug: DebugV1_1_28, -} - -impl ConfigV1_1_28 { - pub fn read_from_default_path>(id: P) -> io::Result { - read_config_from_toml_file(default_config_filepath(id)) - } -} - -impl From for ConfigV1_1_29 { - fn from(value: ConfigV1_1_28) -> Self { - ConfigV1_1_29 { - // \/ ADDED - save_path: None, - // /\ ADDED - gateway: GatewayV1_1_29 { - version: value.gateway.version, - id: value.gateway.id, - only_coconut_credentials: value.gateway.only_coconut_credentials, - listening_address: value.gateway.listening_address, - mix_port: value.gateway.mix_port, - clients_port: value.gateway.clients_port, - enabled_statistics: value.gateway.enabled_statistics, - nym_api_urls: value.gateway.nym_api_urls, - nyxd_urls: value.gateway.nyxd_urls, - statistics_service_url: value.gateway.statistics_service_url, - cosmos_mnemonic: value.gateway.cosmos_mnemonic, - }, - storage_paths: GatewayPathsV1_1_29 { - keys: KeysPathsV1_1_29 { - private_identity_key_file: value.storage_paths.keys.private_identity_key_file, - public_identity_key_file: value.storage_paths.keys.public_identity_key_file, - private_sphinx_key_file: value.storage_paths.keys.private_sphinx_key_file, - public_sphinx_key_file: value.storage_paths.keys.public_sphinx_key_file, - }, - clients_storage: value.storage_paths.clients_storage, - - // \/ ADDED - network_requester_config: None, - // /\ ADDED - }, - - // \/ ADDED - network_requester: Default::default(), - // /\ ADDED - logging: LoggingSettingsV1_1_29 {}, - debug: DebugV1_1_29 { - packet_forwarding_initial_backoff: value.debug.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.debug.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.debug.initial_connection_timeout, - maximum_connection_buffer_size: value.debug.maximum_connection_buffer_size, - presence_sending_delay: value.debug.presence_sending_delay, - stored_messages_filename_length: value.debug.stored_messages_filename_length, - message_retrieval_limit: value.debug.message_retrieval_limit, - use_legacy_framed_packet_version: value.debug.use_legacy_framed_packet_version, - }, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] -pub struct GatewayV1_1_28 { - /// Version of the gateway for which this configuration was created. - pub version: String, - - /// ID specifies the human readable ID of this particular gateway. - pub id: String, - - /// Indicates whether this gateway is accepting only coconut credentials for accessing the - /// the mixnet, or if it also accepts non-paying clients - #[serde(default)] - pub only_coconut_credentials: bool, - - /// Address to which this mixnode will bind to and will be listening for packets. - pub listening_address: IpAddr, - - /// Port used for listening for all mixnet traffic. - /// (default: 1789) - pub mix_port: u16, - - /// Port used for listening for all client-related traffic. - /// (default: 9000) - pub clients_port: u16, - - /// Whether gateway collects and sends anonymized statistics - pub enabled_statistics: bool, - - /// Domain address of the statistics service - pub statistics_service_url: Url, - - /// Addresses to APIs from which the node gets the view of the network. - #[serde(alias = "validator_api_urls")] - pub nym_api_urls: Vec, - - /// Addresses to validators which the node uses to check for double spending of ERC20 tokens. - #[serde(alias = "validator_nymd_urls")] - pub nyxd_urls: Vec, - - /// Mnemonic of a cosmos wallet used in checking for double spending. - // #[deprecated(note = "move to storage")] - // TODO: I don't think this should be stored directly in the config... - pub cosmos_mnemonic: bip39::Mnemonic, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct DebugV1_1_28 { - /// Initial value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_initial_backoff: Duration, - - /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_maximum_backoff: Duration, - - /// Timeout for establishing initial connection when trying to forward a sphinx packet. - #[serde(with = "humantime_serde")] - pub initial_connection_timeout: Duration, - - /// Maximum number of packets that can be stored waiting to get sent to a particular connection. - pub maximum_connection_buffer_size: usize, - - /// Delay between each subsequent presence data being sent. - #[serde(with = "humantime_serde")] - pub presence_sending_delay: Duration, - - /// Length of filenames for new client messages. - pub stored_messages_filename_length: u16, - - /// Number of messages from offline client that can be pulled at once from the storage. - pub message_retrieval_limit: i64, - - /// Specifies whether the mixnode should be using the legacy framing for the sphinx packets. - // it's set to true by default. The reason for that decision is to preserve compatibility with the - // existing nodes whilst everyone else is upgrading and getting the code for handling the new field. - // It shall be disabled in the subsequent releases. - pub use_legacy_framed_packet_version: bool, -} - -impl Default for DebugV1_1_28 { - fn default() -> Self { - DebugV1_1_28 { - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, - message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, - use_legacy_framed_packet_version: false, - } - } -} diff --git a/gateway/src/config/old_config_v1_1_29.rs b/gateway/src/config/old_config_v1_1_29.rs deleted file mode 100644 index e3fd44a8c9e..00000000000 --- a/gateway/src/config/old_config_v1_1_29.rs +++ /dev/null @@ -1,282 +0,0 @@ -// Copyright 2020-2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config::Host; -use nym_config::{ - must_get_home, read_config_from_toml_file, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, NYM_DIR, -}; -use serde::{Deserialize, Deserializer, Serialize}; -use std::io; -use std::net::IpAddr; -use std::path::{Path, PathBuf}; -use std::time::Duration; -use url::Url; - -use super::old_config_v1_1_31::{ - ConfigV1_1_31, DebugV1_1_31, GatewayPathsV1_1_31, GatewayV1_1_31, KeysPathsV1_1_31, - LoggingSettingsV1_1_31, NetworkRequesterV1_1_31, -}; - -const DEFAULT_GATEWAYS_DIR: &str = "gateways"; - -// 'DEBUG' -// where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; -const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; - -/// Derive default path to gateway's config directory. -/// It should get resolved to `$HOME/.nym/gateways//config` -pub fn default_config_directory>(id: P) -> PathBuf { - must_get_home() - .join(NYM_DIR) - .join(DEFAULT_GATEWAYS_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to gateways's config file. -/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { - default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct KeysPathsV1_1_29 { - pub private_identity_key_file: PathBuf, - pub public_identity_key_file: PathBuf, - pub private_sphinx_key_file: PathBuf, - pub public_sphinx_key_file: PathBuf, -} - -fn de_maybe_path<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let path = PathBuf::deserialize(deserializer)?; - if path.as_os_str().is_empty() { - Ok(None) - } else { - Ok(Some(path)) - } -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct GatewayPathsV1_1_29 { - pub keys: KeysPathsV1_1_29, - - #[serde(alias = "persistent_storage")] - pub clients_storage: PathBuf, - - #[serde(deserialize_with = "de_maybe_path")] - pub network_requester_config: Option, -} - -#[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct LoggingSettingsV1_1_29 {} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_29 { - #[serde(skip)] - pub save_path: Option, - - pub gateway: GatewayV1_1_29, - - pub storage_paths: GatewayPathsV1_1_29, - - pub network_requester: NetworkRequesterV1_1_29, - - #[serde(default)] - pub logging: LoggingSettingsV1_1_29, - - #[serde(default)] - pub debug: DebugV1_1_29, -} - -impl ConfigV1_1_29 { - pub fn read_from_default_path>(id: P) -> io::Result { - read_config_from_toml_file(default_config_filepath(id)) - } -} - -impl From for ConfigV1_1_31 { - fn from(value: ConfigV1_1_29) -> Self { - ConfigV1_1_31 { - save_path: value.save_path, - - // \/ ADDED - host: Host { - // this is a very bad default! - public_ips: vec![value.gateway.listening_address], - hostname: None, - }, - // /\ ADDED - - // \/ ADDED - http: Default::default(), - // /\ ADDED - gateway: GatewayV1_1_31 { - version: value.gateway.version, - id: value.gateway.id, - only_coconut_credentials: value.gateway.only_coconut_credentials, - listening_address: value.gateway.listening_address, - mix_port: value.gateway.mix_port, - clients_port: value.gateway.clients_port, - - // \/ ADDED - clients_wss_port: None, - // /\ ADDED - enabled_statistics: value.gateway.enabled_statistics, - nym_api_urls: value.gateway.nym_api_urls, - nyxd_urls: value.gateway.nyxd_urls, - statistics_service_url: value.gateway.statistics_service_url, - cosmos_mnemonic: value.gateway.cosmos_mnemonic, - }, - // \/ ADDED - wireguard: Default::default(), - // /\ ADDED - storage_paths: GatewayPathsV1_1_31 { - keys: KeysPathsV1_1_31 { - private_identity_key_file: value.storage_paths.keys.private_identity_key_file, - public_identity_key_file: value.storage_paths.keys.public_identity_key_file, - private_sphinx_key_file: value.storage_paths.keys.private_sphinx_key_file, - public_sphinx_key_file: value.storage_paths.keys.public_sphinx_key_file, - }, - clients_storage: value.storage_paths.clients_storage, - network_requester_config: value.storage_paths.network_requester_config, - }, - network_requester: NetworkRequesterV1_1_31 { - enabled: value.network_requester.enabled, - }, - logging: LoggingSettingsV1_1_31 {}, - debug: DebugV1_1_31 { - packet_forwarding_initial_backoff: value.debug.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.debug.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.debug.initial_connection_timeout, - maximum_connection_buffer_size: value.debug.maximum_connection_buffer_size, - presence_sending_delay: value.debug.presence_sending_delay, - stored_messages_filename_length: value.debug.stored_messages_filename_length, - message_retrieval_limit: value.debug.message_retrieval_limit, - use_legacy_framed_packet_version: value.debug.use_legacy_framed_packet_version, - }, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] -pub struct GatewayV1_1_29 { - /// Version of the gateway for which this configuration was created. - pub version: String, - - /// ID specifies the human readable ID of this particular gateway. - pub id: String, - - /// Indicates whether this gateway is accepting only coconut credentials for accessing the - /// the mixnet, or if it also accepts non-paying clients - #[serde(default)] - pub only_coconut_credentials: bool, - - /// Address to which this mixnode will bind to and will be listening for packets. - pub listening_address: IpAddr, - - /// Port used for listening for all mixnet traffic. - /// (default: 1789) - pub mix_port: u16, - - /// Port used for listening for all client-related traffic. - /// (default: 9000) - pub clients_port: u16, - - /// Whether gateway collects and sends anonymized statistics - pub enabled_statistics: bool, - - /// Domain address of the statistics service - pub statistics_service_url: Url, - - /// Addresses to APIs from which the node gets the view of the network. - #[serde(alias = "validator_api_urls")] - pub nym_api_urls: Vec, - - /// Addresses to validators which the node uses to check for double spending of ERC20 tokens. - #[serde(alias = "validator_nymd_urls")] - pub nyxd_urls: Vec, - - /// Mnemonic of a cosmos wallet used in checking for double spending. - // #[deprecated(note = "move to storage")] - // TODO: I don't think this should be stored directly in the config... - pub cosmos_mnemonic: bip39::Mnemonic, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct NetworkRequesterV1_1_29 { - pub enabled: bool, -} - -#[allow(clippy::derivable_impls)] -impl Default for NetworkRequesterV1_1_29 { - fn default() -> Self { - NetworkRequesterV1_1_29 { enabled: false } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct DebugV1_1_29 { - /// Initial value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_initial_backoff: Duration, - - /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_maximum_backoff: Duration, - - /// Timeout for establishing initial connection when trying to forward a sphinx packet. - #[serde(with = "humantime_serde")] - pub initial_connection_timeout: Duration, - - /// Maximum number of packets that can be stored waiting to get sent to a particular connection. - pub maximum_connection_buffer_size: usize, - - /// Delay between each subsequent presence data being sent. - #[serde(with = "humantime_serde")] - pub presence_sending_delay: Duration, - - /// Length of filenames for new client messages. - pub stored_messages_filename_length: u16, - - /// Number of messages from offline client that can be pulled at once from the storage. - pub message_retrieval_limit: i64, - - /// Specifies whether the mixnode should be using the legacy framing for the sphinx packets. - // it's set to true by default. The reason for that decision is to preserve compatibility with the - // existing nodes whilst everyone else is upgrading and getting the code for handling the new field. - // It shall be disabled in the subsequent releases. - pub use_legacy_framed_packet_version: bool, -} - -impl Default for DebugV1_1_29 { - fn default() -> Self { - DebugV1_1_29 { - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, - message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, - use_legacy_framed_packet_version: false, - } - } -} diff --git a/gateway/src/config/old_config_v1_1_31.rs b/gateway/src/config/old_config_v1_1_31.rs deleted file mode 100644 index be4ed819a2b..00000000000 --- a/gateway/src/config/old_config_v1_1_31.rs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2020-2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use nym_config::{ - must_get_home, read_config_from_toml_file, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, NYM_DIR, -}; -use nym_network_defaults::WG_PORT; -use serde::{Deserialize, Deserializer, Serialize}; -use std::io; -use std::net::{IpAddr, Ipv4Addr, SocketAddr}; -use std::path::{Path, PathBuf}; -use std::time::Duration; -use url::Url; - -use super::old_config_v1_1_36::{ - ConfigV1_1_36, DebugV1_1_36, GatewayPathsV1_1_36, GatewayV1_1_36, KeysPathsV1_1_36, - LoggingSettingsV1_1_36, NetworkRequesterV1_1_36, WireguardPathsV1_1_36, WireguardV1_1_36, -}; -use super::{Host, Http}; - -const DEFAULT_GATEWAYS_DIR: &str = "gateways"; - -// 'DEBUG' -// where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; -const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; - -fn de_maybe_port<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let port = u16::deserialize(deserializer)?; - if port == 0 { - Ok(None) - } else { - Ok(Some(port)) - } -} - -fn de_maybe_path<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let path = PathBuf::deserialize(deserializer)?; - if path.as_os_str().is_empty() { - Ok(None) - } else { - Ok(Some(path)) - } -} - -/// Derive default path to gateway's config directory. -/// It should get resolved to `$HOME/.nym/gateways//config` -pub fn default_config_directory>(id: P) -> PathBuf { - must_get_home() - .join(NYM_DIR) - .join(DEFAULT_GATEWAYS_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to gateways's config file. -/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { - default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_31 { - // additional metadata holding on-disk location of this config file - #[serde(skip)] - pub(crate) save_path: Option, - - pub host: Host, - - #[serde(default)] - pub http: Http, - - pub gateway: GatewayV1_1_31, - - #[serde(default)] - // currently not really used for anything useful - pub wireguard: WireguardV1_1_31, - - pub storage_paths: GatewayPathsV1_1_31, - - pub network_requester: NetworkRequesterV1_1_31, - - #[serde(default)] - pub logging: LoggingSettingsV1_1_31, - - #[serde(default)] - pub debug: DebugV1_1_31, -} - -impl ConfigV1_1_31 { - pub fn read_from_default_path>(id: P) -> io::Result { - read_config_from_toml_file(default_config_filepath(id)) - } -} - -impl From for ConfigV1_1_36 { - fn from(value: ConfigV1_1_31) -> Self { - Self { - save_path: value.save_path, - host: value.host, - http: value.http, - gateway: GatewayV1_1_36 { - version: value.gateway.version, - id: value.gateway.id, - only_coconut_credentials: value.gateway.only_coconut_credentials, - listening_address: value.gateway.listening_address, - mix_port: value.gateway.mix_port, - clients_port: value.gateway.clients_port, - clients_wss_port: value.gateway.clients_wss_port, - enabled_statistics: value.gateway.enabled_statistics, - statistics_service_url: value.gateway.statistics_service_url, - nym_api_urls: value.gateway.nym_api_urls, - nyxd_urls: value.gateway.nyxd_urls, - cosmos_mnemonic: value.gateway.cosmos_mnemonic, - }, - wireguard: WireguardV1_1_36 { - enabled: value.wireguard.enabled, - bind_address: value.wireguard.bind_address, - announced_port: value.wireguard.announced_port, - private_network_prefix: Default::default(), - storage_paths: WireguardPathsV1_1_36 { - // no fields (yet) - }, - }, - storage_paths: GatewayPathsV1_1_36 { - keys: KeysPathsV1_1_36 { - private_identity_key_file: value.storage_paths.keys.private_identity_key_file, - public_identity_key_file: value.storage_paths.keys.public_identity_key_file, - private_sphinx_key_file: value.storage_paths.keys.private_sphinx_key_file, - public_sphinx_key_file: value.storage_paths.keys.public_sphinx_key_file, - }, - clients_storage: value.storage_paths.clients_storage, - network_requester_config: value.storage_paths.network_requester_config, - // \/ ADDED - ip_packet_router_config: Default::default(), - // /\ ADDED - }, - network_requester: NetworkRequesterV1_1_36 { - enabled: value.network_requester.enabled, - }, - // \/ ADDED - ip_packet_router: Default::default(), - // /\ ADDED - logging: LoggingSettingsV1_1_36 { - // no fields (yet) - }, - debug: DebugV1_1_36 { - packet_forwarding_initial_backoff: value.debug.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.debug.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.debug.initial_connection_timeout, - maximum_connection_buffer_size: value.debug.maximum_connection_buffer_size, - presence_sending_delay: value.debug.presence_sending_delay, - stored_messages_filename_length: value.debug.stored_messages_filename_length, - message_retrieval_limit: value.debug.message_retrieval_limit, - use_legacy_framed_packet_version: value.debug.use_legacy_framed_packet_version, - }, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] -pub struct GatewayV1_1_31 { - /// Version of the gateway for which this configuration was created. - pub version: String, - - /// ID specifies the human readable ID of this particular gateway. - pub id: String, - - /// Indicates whether this gateway is accepting only coconut credentials for accessing the - /// the mixnet, or if it also accepts non-paying clients - #[serde(default)] - pub only_coconut_credentials: bool, - - /// Address to which this mixnode will bind to and will be listening for packets. - pub listening_address: IpAddr, - - /// Port used for listening for all mixnet traffic. - /// (default: 1789) - pub mix_port: u16, - - /// Port used for listening for all client-related traffic. - /// (default: 9000) - pub clients_port: u16, - - /// If applicable, announced port for listening for secure websocket client traffic. - /// (default: None) - #[serde(deserialize_with = "de_maybe_port")] - pub clients_wss_port: Option, - - /// Whether gateway collects and sends anonymized statistics - pub enabled_statistics: bool, - - /// Domain address of the statistics service - pub statistics_service_url: Url, - - /// Addresses to APIs from which the node gets the view of the network. - #[serde(alias = "validator_api_urls")] - pub nym_api_urls: Vec, - - /// Addresses to validators which the node uses to check for double spending of ERC20 tokens. - #[serde(alias = "validator_nymd_urls")] - pub nyxd_urls: Vec, - - /// Mnemonic of a cosmos wallet used in checking for double spending. - // #[deprecated(note = "move to storage")] - // TODO: I don't think this should be stored directly in the config... - pub cosmos_mnemonic: bip39::Mnemonic, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -#[serde(deny_unknown_fields)] -pub struct WireguardV1_1_31 { - /// Specifies whether the wireguard service is enabled on this node. - pub enabled: bool, - - /// Socket address this node will use for binding its wireguard interface. - /// default: `0.0.0.0:51820` - pub bind_address: SocketAddr, - - /// Port announced to external clients wishing to connect to the wireguard interface. - /// Useful in the instances where the node is behind a proxy. - pub announced_port: u16, - - /// Paths for wireguard keys, client registries, etc. - pub storage_paths: WireguardPathsV1_1_31, -} - -impl Default for WireguardV1_1_31 { - fn default() -> Self { - Self { - enabled: false, - bind_address: SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), WG_PORT), - announced_port: WG_PORT, - storage_paths: WireguardPathsV1_1_31 {}, - } - } -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct WireguardPathsV1_1_31 { - // pub keys: -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct GatewayPathsV1_1_31 { - pub keys: KeysPathsV1_1_31, - - /// Path to sqlite database containing all persistent data: messages for offline clients, - /// derived shared keys and available client bandwidths. - #[serde(alias = "persistent_storage")] - pub clients_storage: PathBuf, - - /// Path to the configuration of the embedded network requester. - #[serde(deserialize_with = "de_maybe_path")] - pub network_requester_config: Option, - // pub node_description: PathBuf, - - // pub cosmos_bip39_mnemonic: PathBuf, -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -pub struct KeysPathsV1_1_31 { - /// Path to file containing private identity key. - pub private_identity_key_file: PathBuf, - - /// Path to file containing public identity key. - pub public_identity_key_file: PathBuf, - - /// Path to file containing private sphinx key. - pub private_sphinx_key_file: PathBuf, - - /// Path to file containing public sphinx key. - pub public_sphinx_key_file: PathBuf, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct NetworkRequesterV1_1_31 { - /// Specifies whether network requester service is enabled in this process. - pub enabled: bool, -} - -#[allow(clippy::derivable_impls)] -impl Default for NetworkRequesterV1_1_31 { - fn default() -> Self { - Self { enabled: false } - } -} - -#[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct LoggingSettingsV1_1_31 { - // well, we need to implement something here at some point... -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct DebugV1_1_31 { - /// Initial value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_initial_backoff: Duration, - - /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_maximum_backoff: Duration, - - /// Timeout for establishing initial connection when trying to forward a sphinx packet. - #[serde(with = "humantime_serde")] - pub initial_connection_timeout: Duration, - - /// Maximum number of packets that can be stored waiting to get sent to a particular connection. - pub maximum_connection_buffer_size: usize, - - /// Delay between each subsequent presence data being sent. - #[serde(with = "humantime_serde")] - pub presence_sending_delay: Duration, - - /// Length of filenames for new client messages. - pub stored_messages_filename_length: u16, - - /// Number of messages from offline client that can be pulled at once from the storage. - pub message_retrieval_limit: i64, - - /// Specifies whether the mixnode should be using the legacy framing for the sphinx packets. - // it's set to true by default. The reason for that decision is to preserve compatibility with the - // existing nodes whilst everyone else is upgrading and getting the code for handling the new field. - // It shall be disabled in the subsequent releases. - pub use_legacy_framed_packet_version: bool, -} - -impl Default for DebugV1_1_31 { - fn default() -> Self { - Self { - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, - message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, - use_legacy_framed_packet_version: false, - } - } -} diff --git a/gateway/src/config/old_config_v1_1_36.rs b/gateway/src/config/old_config_v1_1_36.rs deleted file mode 100644 index 8087f8041d3..00000000000 --- a/gateway/src/config/old_config_v1_1_36.rs +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright 2024 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config::persistence::paths::GatewayPaths; -use nym_bin_common::logging::LoggingSettings; -use nym_config::{ - must_get_home, read_config_from_toml_file, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, NYM_DIR, -}; -use nym_network_defaults::WG_PORT; -use serde::{Deserialize, Deserializer, Serialize}; -use std::io; -use std::net::{IpAddr, Ipv4Addr, SocketAddr}; -use std::path::{Path, PathBuf}; -use std::time::Duration; -use url::Url; - -use super::persistence::paths::KeysPaths; -use super::{Config, Debug, Gateway, Host, Http, NetworkRequester}; - -const DEFAULT_GATEWAYS_DIR: &str = "gateways"; - -// 'DEBUG' -// where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; -const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; - -fn de_maybe_port<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let port = u16::deserialize(deserializer)?; - if port == 0 { - Ok(None) - } else { - Ok(Some(port)) - } -} - -fn de_maybe_path<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let path = PathBuf::deserialize(deserializer)?; - if path.as_os_str().is_empty() { - Ok(None) - } else { - Ok(Some(path)) - } -} - -/// Derive default path to gateway's config directory. -/// It should get resolved to `$HOME/.nym/gateways//config` -pub fn default_config_directory>(id: P) -> PathBuf { - must_get_home() - .join(NYM_DIR) - .join(DEFAULT_GATEWAYS_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to gateways's config file. -/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { - default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_36 { - // additional metadata holding on-disk location of this config file - #[serde(skip)] - pub(crate) save_path: Option, - - pub host: Host, - - #[serde(default)] - pub http: Http, - - pub gateway: GatewayV1_1_36, - - #[serde(default)] - // currently not really used for anything useful - pub wireguard: WireguardV1_1_36, - - pub storage_paths: GatewayPathsV1_1_36, - - pub network_requester: NetworkRequesterV1_1_36, - - #[serde(default)] - pub ip_packet_router: IpPacketRouterV1_1_36, - - #[serde(default)] - pub logging: LoggingSettingsV1_1_36, - - #[serde(default)] - pub debug: DebugV1_1_36, -} - -impl ConfigV1_1_36 { - pub fn read_from_default_path>(id: P) -> io::Result { - read_config_from_toml_file(default_config_filepath(id)) - } -} - -impl From for Config { - fn from(value: ConfigV1_1_36) -> Self { - Self { - save_path: value.save_path, - host: value.host, - http: value.http, - gateway: Gateway { - version: value.gateway.version, - id: value.gateway.id, - only_coconut_credentials: value.gateway.only_coconut_credentials, - listening_address: value.gateway.listening_address, - mix_port: value.gateway.mix_port, - clients_port: value.gateway.clients_port, - clients_wss_port: value.gateway.clients_wss_port, - nym_api_urls: value.gateway.nym_api_urls, - nyxd_urls: value.gateway.nyxd_urls, - cosmos_mnemonic: value.gateway.cosmos_mnemonic, - }, - storage_paths: GatewayPaths { - keys: KeysPaths { - private_identity_key_file: value.storage_paths.keys.private_identity_key_file, - public_identity_key_file: value.storage_paths.keys.public_identity_key_file, - private_sphinx_key_file: value.storage_paths.keys.private_sphinx_key_file, - public_sphinx_key_file: value.storage_paths.keys.public_sphinx_key_file, - }, - clients_storage: value.storage_paths.clients_storage, - network_requester_config: value.storage_paths.network_requester_config, - // \/ ADDED - ip_packet_router_config: Default::default(), - // /\ ADDED - }, - network_requester: NetworkRequester { - enabled: value.network_requester.enabled, - }, - // \/ ADDED - ip_packet_router: Default::default(), - // /\ ADDED - logging: LoggingSettings { - // no fields (yet) - }, - debug: Debug { - packet_forwarding_initial_backoff: value.debug.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.debug.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.debug.initial_connection_timeout, - maximum_connection_buffer_size: value.debug.maximum_connection_buffer_size, - presence_sending_delay: value.debug.presence_sending_delay, - stored_messages_filename_length: value.debug.stored_messages_filename_length, - message_retrieval_limit: value.debug.message_retrieval_limit, - use_legacy_framed_packet_version: value.debug.use_legacy_framed_packet_version, - ..Default::default() - }, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] -pub struct GatewayV1_1_36 { - /// Version of the gateway for which this configuration was created. - pub version: String, - - /// ID specifies the human readable ID of this particular gateway. - pub id: String, - - /// Indicates whether this gateway is accepting only coconut credentials for accessing the - /// the mixnet, or if it also accepts non-paying clients - #[serde(default)] - pub only_coconut_credentials: bool, - - /// Address to which this mixnode will bind to and will be listening for packets. - pub listening_address: IpAddr, - - /// Port used for listening for all mixnet traffic. - /// (default: 1789) - pub mix_port: u16, - - /// Port used for listening for all client-related traffic. - /// (default: 9000) - pub clients_port: u16, - - /// If applicable, announced port for listening for secure websocket client traffic. - /// (default: None) - #[serde(deserialize_with = "de_maybe_port")] - pub clients_wss_port: Option, - - /// Whether gateway collects and sends anonymized statistics - pub enabled_statistics: bool, - - /// Domain address of the statistics service - pub statistics_service_url: Url, - - /// Addresses to APIs from which the node gets the view of the network. - #[serde(alias = "validator_api_urls")] - pub nym_api_urls: Vec, - - /// Addresses to validators which the node uses to check for double spending of ERC20 tokens. - #[serde(alias = "validator_nymd_urls")] - pub nyxd_urls: Vec, - - /// Mnemonic of a cosmos wallet used in checking for double spending. - // #[deprecated(note = "move to storage")] - // TODO: I don't think this should be stored directly in the config... - pub cosmos_mnemonic: bip39::Mnemonic, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -#[serde(deny_unknown_fields)] -pub struct WireguardV1_1_36 { - /// Specifies whether the wireguard service is enabled on this node. - pub enabled: bool, - - /// Socket address this node will use for binding its wireguard interface. - /// default: `0.0.0.0:51820` - pub bind_address: SocketAddr, - - /// Port announced to external clients wishing to connect to the wireguard interface. - /// Useful in the instances where the node is behind a proxy. - pub announced_port: u16, - - /// The prefix denoting the maximum number of the clients that can be connected via Wireguard. - /// The maximum value for IPv4 is 32 and for IPv6 is 128 - pub private_network_prefix: u8, - - /// Paths for wireguard keys, client registries, etc. - pub storage_paths: WireguardPathsV1_1_36, -} - -impl Default for WireguardV1_1_36 { - fn default() -> Self { - Self { - enabled: false, - bind_address: SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), WG_PORT), - announced_port: WG_PORT, - storage_paths: WireguardPathsV1_1_36 {}, - private_network_prefix: 16, - } - } -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct WireguardPathsV1_1_36 { - // pub keys: -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct GatewayPathsV1_1_36 { - pub keys: KeysPathsV1_1_36, - - /// Path to sqlite database containing all persistent data: messages for offline clients, - /// derived shared keys and available client bandwidths. - #[serde(alias = "persistent_storage")] - pub clients_storage: PathBuf, - - /// Path to the configuration of the embedded network requester. - #[serde(deserialize_with = "de_maybe_path")] - pub network_requester_config: Option, - // pub node_description: PathBuf, - - // pub cosmos_bip39_mnemonic: PathBuf, - /// Path to the configuration of the embedded ip packet router. - #[serde(deserialize_with = "de_maybe_path")] - pub ip_packet_router_config: Option, -} - -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)] -pub struct KeysPathsV1_1_36 { - /// Path to file containing private identity key. - pub private_identity_key_file: PathBuf, - - /// Path to file containing public identity key. - pub public_identity_key_file: PathBuf, - - /// Path to file containing private sphinx key. - pub private_sphinx_key_file: PathBuf, - - /// Path to file containing public sphinx key. - pub public_sphinx_key_file: PathBuf, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct NetworkRequesterV1_1_36 { - /// Specifies whether network requester service is enabled in this process. - pub enabled: bool, -} - -#[allow(clippy::derivable_impls)] -impl Default for NetworkRequesterV1_1_36 { - fn default() -> Self { - Self { enabled: false } - } -} - -#[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct LoggingSettingsV1_1_36 { - // well, we need to implement something here at some point... -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct DebugV1_1_36 { - /// Initial value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_initial_backoff: Duration, - - /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_maximum_backoff: Duration, - - /// Timeout for establishing initial connection when trying to forward a sphinx packet. - #[serde(with = "humantime_serde")] - pub initial_connection_timeout: Duration, - - /// Maximum number of packets that can be stored waiting to get sent to a particular connection. - pub maximum_connection_buffer_size: usize, - - /// Delay between each subsequent presence data being sent. - #[serde(with = "humantime_serde")] - pub presence_sending_delay: Duration, - - /// Length of filenames for new client messages. - pub stored_messages_filename_length: u16, - - /// Number of messages from offline client that can be pulled at once from the storage. - pub message_retrieval_limit: i64, - - /// Specifies whether the mixnode should be using the legacy framing for the sphinx packets. - // it's set to true by default. The reason for that decision is to preserve compatibility with the - // existing nodes whilst everyone else is upgrading and getting the code for handling the new field. - // It shall be disabled in the subsequent releases. - pub use_legacy_framed_packet_version: bool, -} - -impl Default for DebugV1_1_36 { - fn default() -> Self { - Self { - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, - message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, - use_legacy_framed_packet_version: false, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct IpPacketRouterV1_1_36 { - /// Specifies whether ip packet router service is enabled in this process. - pub enabled: bool, -} - -#[allow(clippy::derivable_impls)] -impl Default for IpPacketRouterV1_1_36 { - fn default() -> Self { - Self { enabled: false } - } -} diff --git a/gateway/src/main.rs b/gateway/src/main.rs index 81c9d329d4b..3c5109817b7 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -27,6 +27,10 @@ struct Cli { #[clap(short, long)] pub(crate) config_env_file: Option, + /// Force run the binary bypassing the deprecation in favour of nym-node + #[clap(long, hide = true)] + pub(crate) force_run: bool, + /// Flag used for disabling the printed banner in tty. #[clap(long)] pub(crate) no_banner: bool, diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index 4891cd2798b..a5cdfcc6c71 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::Cli; +use anyhow::bail; use clap::CommandFactory; use clap::Subcommand; use colored::Colorize; @@ -23,7 +24,6 @@ mod init; mod node_details; mod run; mod sign; -mod upgrade_helpers; #[derive(Subcommand)] pub(crate) enum Commands { @@ -67,6 +67,12 @@ struct OverrideConfig { pub(crate) async fn execute(args: Cli) -> anyhow::Result<()> { let bin_name = "nym-mixnode"; + if !args.force_run { + let msg = "standalone mixnodes have been deprecated - please migrate to a `nym-node` via `nym-node migrate mixnode` command"; + error!("{msg}"); + bail!("{msg}") + } + warn!("standalone mixnodes have been deprecated - please consider migrating it to a `nym-node` via `nym-node migrate mixnode` command"); if std::io::stdout().is_terminal() { // if user is running it in terminal session, @@ -125,8 +131,6 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) { } fn try_load_current_config(id: &str) -> Result { - upgrade_helpers::try_upgrade_config(id)?; - Config::read_from_default_path(id).map_err(|err| { error!( "Failed to load config for {id}. Are you sure you have run `init` before? (Error was: {err})", diff --git a/mixnode/src/commands/upgrade_helpers.rs b/mixnode/src/commands/upgrade_helpers.rs deleted file mode 100644 index bf5e1a38820..00000000000 --- a/mixnode/src/commands/upgrade_helpers.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use log::info; -use nym_mixnode::config::old_config_v1_1_21::ConfigV1_1_21; -use nym_mixnode::config::old_config_v1_1_32::ConfigV1_1_32; -use nym_mixnode::config::{default_config_filepath, Config}; -use nym_mixnode::error::MixnodeError; - -fn try_upgrade_v1_1_21_config(id: &str) -> Result { - use nym_config::legacy_helpers::nym_config::MigrationNymConfig; - - // explicitly load it as v1.1.21 (which is incompatible with the current, i.e. 1.1.22+) - let Ok(old_config) = ConfigV1_1_21::load_from_file(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the mixnode is using <= v1.1.21 config template."); - info!("It is going to get updated to the current specification."); - - let updated_step1: ConfigV1_1_32 = old_config.into(); - - let updated: Config = updated_step1.into(); - updated - .save_to_default_location() - .map_err(|err| MixnodeError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -fn try_upgrade_v1_1_32_config(id: &str) -> Result { - // explicitly load it as v1.1.32 (which is incompatible with the current, i.e. 1.1.22+) - let Ok(old_config) = ConfigV1_1_32::read_from_default_path(id) else { - // if we failed to load it, there might have been nothing to upgrade - // or maybe it was an even older file. in either way. just ignore it and carry on with our day - return Ok(false); - }; - info!("It seems the mixnode is using <= v1.1.32 config template."); - info!("It is going to get updated to the current specification."); - - let updated: Config = old_config.into(); - updated - .save_to_default_location() - .map_err(|err| MixnodeError::ConfigSaveFailure { - path: default_config_filepath(id), - id: id.to_string(), - source: err, - })?; - - Ok(true) -} - -pub(crate) fn try_upgrade_config(id: &str) -> Result<(), MixnodeError> { - if try_upgrade_v1_1_21_config(id)? { - return Ok(()); - } - if try_upgrade_v1_1_32_config(id)? { - return Ok(()); - } - Ok(()) -} diff --git a/mixnode/src/config/mod.rs b/mixnode/src/config/mod.rs index 21a2e3949d5..2f964035440 100644 --- a/mixnode/src/config/mod.rs +++ b/mixnode/src/config/mod.rs @@ -22,8 +22,6 @@ use std::str::FromStr; use std::time::Duration; use url::Url; -pub mod old_config_v1_1_21; -pub mod old_config_v1_1_32; pub mod persistence; mod template; diff --git a/mixnode/src/config/old_config_v1_1_21.rs b/mixnode/src/config/old_config_v1_1_21.rs deleted file mode 100644 index b8f5252893f..00000000000 --- a/mixnode/src/config/old_config_v1_1_21.rs +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config::old_config_v1_1_32::{ - ConfigV1_1_32, DebugV1_1_32, MixNodeV1_1_32, VerlocV1_1_32, -}; -use crate::config::persistence::paths::{KeysPaths, MixNodePaths}; -use nym_bin_common::logging::LoggingSettings; -use nym_config::legacy_helpers::nym_config::MigrationNymConfig; -use nym_validator_client::nyxd; -use serde::{Deserialize, Deserializer, Serialize}; -use std::net::{IpAddr, SocketAddr}; -use std::path::PathBuf; -use std::str::FromStr; -use std::time::Duration; -use url::Url; - -const DEFAULT_MIX_LISTENING_PORT: u16 = 1789; -const DEFAULT_VERLOC_LISTENING_PORT: u16 = 1790; -const DEFAULT_HTTP_API_LISTENING_PORT: u16 = 8000; -const NYM_API: &str = "https://validator.nymtech.net/api/"; -const DESCRIPTION_FILE: &str = "description.toml"; - -// 'RTT MEASUREMENT' -const DEFAULT_PACKETS_PER_NODE: usize = 100; -const DEFAULT_CONNECTION_TIMEOUT: Duration = Duration::from_millis(5000); -const DEFAULT_PACKET_TIMEOUT: Duration = Duration::from_millis(1500); -const DEFAULT_DELAY_BETWEEN_PACKETS: Duration = Duration::from_millis(50); -const DEFAULT_BATCH_SIZE: usize = 50; -const DEFAULT_TESTING_INTERVAL: Duration = Duration::from_secs(60 * 60 * 12); -const DEFAULT_RETRY_TIMEOUT: Duration = Duration::from_secs(60 * 30); - -// 'DEBUG' -const DEFAULT_NODE_STATS_LOGGING_DELAY: Duration = Duration::from_millis(60_000); -const DEFAULT_NODE_STATS_UPDATING_DELAY: Duration = Duration::from_millis(30_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -pub(super) fn de_ipaddr_from_maybe_str_socks_addr<'de, D>( - deserializer: D, -) -> Result -where - D: Deserializer<'de>, -{ - let s = String::deserialize(deserializer)?; - if let Ok(socket_addr) = SocketAddr::from_str(&s) { - Ok(socket_addr.ip()) - } else { - IpAddr::from_str(&s).map_err(serde::de::Error::custom) - } -} - -fn bind_all_address() -> IpAddr { - "0.0.0.0".parse().unwrap() -} - -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_21 { - mixnode: MixNodeV1_1_21, - - #[serde(default)] - verloc: VerlocV1_1_21, - #[serde(default)] - logging: LoggingV1_1_21, - #[serde(default)] - debug: DebugV1_1_21, -} - -impl From for ConfigV1_1_32 { - fn from(value: ConfigV1_1_21) -> Self { - let node_description = - ConfigV1_1_21::default_config_directory(&value.mixnode.id).join(DESCRIPTION_FILE); - - ConfigV1_1_32 { - mixnode: MixNodeV1_1_32 { - version: value.mixnode.version, - id: value.mixnode.id, - listening_address: value.mixnode.listening_address, - mix_port: value.mixnode.mix_port, - verloc_port: value.mixnode.verloc_port, - http_api_port: value.mixnode.http_api_port, - nym_api_urls: value.mixnode.nym_api_urls, - }, - storage_paths: MixNodePaths { - keys: KeysPaths { - private_identity_key_file: value.mixnode.private_identity_key_file, - public_identity_key_file: value.mixnode.public_identity_key_file, - private_sphinx_key_file: value.mixnode.private_sphinx_key_file, - public_sphinx_key_file: value.mixnode.public_sphinx_key_file, - }, - node_description, - }, - verloc: value.verloc.into(), - logging: value.logging.into(), - debug: value.debug.into(), - } - } -} - -impl MigrationNymConfig for ConfigV1_1_21 { - fn default_root_directory() -> PathBuf { - dirs::home_dir() - .expect("Failed to evaluate $HOME value") - .join(".nym") - .join("mixnodes") - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -struct MixNodeV1_1_21 { - version: String, - id: String, - #[serde(deserialize_with = "de_ipaddr_from_maybe_str_socks_addr")] - listening_address: IpAddr, - announce_address: String, - mix_port: u16, - verloc_port: u16, - http_api_port: u16, - private_identity_key_file: PathBuf, - public_identity_key_file: PathBuf, - private_sphinx_key_file: PathBuf, - public_sphinx_key_file: PathBuf, - nym_api_urls: Vec, - nym_root_directory: PathBuf, - wallet_address: Option, -} - -impl Default for MixNodeV1_1_21 { - fn default() -> Self { - MixNodeV1_1_21 { - version: env!("CARGO_PKG_VERSION").to_string(), - id: "".to_string(), - listening_address: bind_all_address(), - announce_address: "127.0.0.1".to_string(), - mix_port: DEFAULT_MIX_LISTENING_PORT, - verloc_port: DEFAULT_VERLOC_LISTENING_PORT, - http_api_port: DEFAULT_HTTP_API_LISTENING_PORT, - private_identity_key_file: Default::default(), - public_identity_key_file: Default::default(), - private_sphinx_key_file: Default::default(), - public_sphinx_key_file: Default::default(), - nym_api_urls: vec![Url::from_str(NYM_API).expect("Invalid default API URL")], - nym_root_directory: ConfigV1_1_21::default_root_directory(), - wallet_address: None, - } - } -} - -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -struct LoggingV1_1_21 {} - -impl From for LoggingSettings { - fn from(_value: LoggingV1_1_21) -> Self { - LoggingSettings {} - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -struct VerlocV1_1_21 { - packets_per_node: usize, - connection_timeout: Duration, - packet_timeout: Duration, - delay_between_packets: Duration, - tested_nodes_batch_size: usize, - testing_interval: Duration, - retry_timeout: Duration, -} - -impl From for VerlocV1_1_32 { - fn from(value: VerlocV1_1_21) -> Self { - VerlocV1_1_32 { - packets_per_node: value.packets_per_node, - connection_timeout: value.connection_timeout, - packet_timeout: value.packet_timeout, - delay_between_packets: value.delay_between_packets, - tested_nodes_batch_size: value.tested_nodes_batch_size, - testing_interval: value.testing_interval, - retry_timeout: value.retry_timeout, - } - } -} - -impl Default for VerlocV1_1_21 { - fn default() -> Self { - VerlocV1_1_21 { - packets_per_node: DEFAULT_PACKETS_PER_NODE, - connection_timeout: DEFAULT_CONNECTION_TIMEOUT, - packet_timeout: DEFAULT_PACKET_TIMEOUT, - delay_between_packets: DEFAULT_DELAY_BETWEEN_PACKETS, - tested_nodes_batch_size: DEFAULT_BATCH_SIZE, - testing_interval: DEFAULT_TESTING_INTERVAL, - retry_timeout: DEFAULT_RETRY_TIMEOUT, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -struct DebugV1_1_21 { - #[serde(with = "humantime_serde")] - node_stats_logging_delay: Duration, - - #[serde(with = "humantime_serde")] - node_stats_updating_delay: Duration, - - #[serde(with = "humantime_serde")] - packet_forwarding_initial_backoff: Duration, - - #[serde(with = "humantime_serde")] - packet_forwarding_maximum_backoff: Duration, - - #[serde(with = "humantime_serde")] - initial_connection_timeout: Duration, - - maximum_connection_buffer_size: usize, - - use_legacy_framed_packet_version: bool, -} - -impl From for DebugV1_1_32 { - fn from(value: DebugV1_1_21) -> Self { - DebugV1_1_32 { - node_stats_logging_delay: value.node_stats_logging_delay, - node_stats_updating_delay: value.node_stats_updating_delay, - packet_forwarding_initial_backoff: value.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.initial_connection_timeout, - maximum_connection_buffer_size: value.maximum_connection_buffer_size, - use_legacy_framed_packet_version: value.use_legacy_framed_packet_version, - } - } -} - -impl Default for DebugV1_1_21 { - fn default() -> Self { - DebugV1_1_21 { - node_stats_logging_delay: DEFAULT_NODE_STATS_LOGGING_DELAY, - node_stats_updating_delay: DEFAULT_NODE_STATS_UPDATING_DELAY, - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - use_legacy_framed_packet_version: true, - } - } -} diff --git a/mixnode/src/config/old_config_v1_1_32.rs b/mixnode/src/config/old_config_v1_1_32.rs deleted file mode 100644 index 1c2f2340d5d..00000000000 --- a/mixnode/src/config/old_config_v1_1_32.rs +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::config; -use crate::config::persistence::paths::MixNodePaths; -use crate::config::{Config, Debug, MixNode, Verloc}; -use nym_bin_common::logging::LoggingSettings; -use nym_config::{ - must_get_home, read_config_from_toml_file, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, NYM_DIR, -}; -use serde::{Deserialize, Serialize}; -use std::io; -use std::net::{IpAddr, SocketAddr}; -use std::path::{Path, PathBuf}; -use std::time::Duration; -use url::Url; - -const DEFAULT_MIXNODES_DIR: &str = "mixnodes"; - -// 'RTT MEASUREMENT' -const DEFAULT_PACKETS_PER_NODE: usize = 100; -const DEFAULT_CONNECTION_TIMEOUT: Duration = Duration::from_millis(5000); -const DEFAULT_PACKET_TIMEOUT: Duration = Duration::from_millis(1500); -const DEFAULT_DELAY_BETWEEN_PACKETS: Duration = Duration::from_millis(50); -const DEFAULT_BATCH_SIZE: usize = 50; -const DEFAULT_TESTING_INTERVAL: Duration = Duration::from_secs(60 * 60 * 12); -const DEFAULT_RETRY_TIMEOUT: Duration = Duration::from_secs(60 * 30); - -// 'DEBUG' -const DEFAULT_NODE_STATS_LOGGING_DELAY: Duration = Duration::from_millis(60_000); -const DEFAULT_NODE_STATS_UPDATING_DELAY: Duration = Duration::from_millis(30_000); -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); -const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; - -/// Derive default path to mixnodes's config directory. -/// It should get resolved to `$HOME/.nym/mixnodes//config` -fn default_config_directory>(id: P) -> PathBuf { - must_get_home() - .join(NYM_DIR) - .join(DEFAULT_MIXNODES_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to mixnodes's config file. -/// It should get resolved to `$HOME/.nym/mixnodes//config/config.toml` -fn default_config_filepath>(id: P) -> PathBuf { - default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct ConfigV1_1_32 { - pub mixnode: MixNodeV1_1_32, - - // i hope this laziness is not going to backfire... - pub storage_paths: MixNodePaths, - - #[serde(default)] - pub verloc: VerlocV1_1_32, - - #[serde(default)] - pub logging: LoggingSettings, - - #[serde(default)] - pub debug: DebugV1_1_32, -} - -impl ConfigV1_1_32 { - pub fn read_from_default_path>(id: P) -> io::Result { - read_config_from_toml_file(default_config_filepath(id)) - } -} - -impl From for Config { - fn from(value: ConfigV1_1_32) -> Self { - Config { - // \/ ADDED - save_path: None, - // /\ ADDED - - // \/ ADDED - host: config::Host { - // this is a very bad default! - public_ips: vec![value.mixnode.listening_address], - hostname: None, - }, - // /\ ADDED - - // \/ ADDED - http: config::Http { - bind_address: SocketAddr::new( - value.mixnode.listening_address, - value.mixnode.http_api_port, - ), - landing_page_assets_path: None, - metrics_key: None, - }, - // /\ ADDED - mixnode: MixNode { - version: value.mixnode.version, - id: value.mixnode.id, - listening_address: value.mixnode.listening_address, - mix_port: value.mixnode.mix_port, - verloc_port: value.mixnode.verloc_port, - nym_api_urls: value.mixnode.nym_api_urls, - }, - storage_paths: value.storage_paths, - verloc: value.verloc.into(), - logging: value.logging, - debug: value.debug.into(), - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -pub struct MixNodeV1_1_32 { - /// Version of the mixnode for which this configuration was created. - pub version: String, - - /// ID specifies the human readable ID of this particular mixnode. - pub id: String, - - /// Address to which this mixnode will bind to and will be listening for packets. - pub listening_address: IpAddr, - - /// Port used for listening for all mixnet traffic. - /// (default: 1789) - pub mix_port: u16, - - /// Port used for listening for verloc traffic. - /// (default: 1790) - pub verloc_port: u16, - - /// Port used for listening for http requests. - /// (default: 8000) - pub http_api_port: u16, - - /// Addresses to nym APIs from which the node gets the view of the network. - pub nym_api_urls: Vec, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct VerlocV1_1_32 { - /// Specifies number of echo packets sent to each node during a measurement run. - pub packets_per_node: usize, - - /// Specifies maximum amount of time to wait for the connection to get established. - #[serde(with = "humantime_serde")] - pub connection_timeout: Duration, - - /// Specifies maximum amount of time to wait for the reply packet to arrive before abandoning the test. - #[serde(with = "humantime_serde")] - pub packet_timeout: Duration, - - /// Specifies delay between subsequent test packets being sent (after receiving a reply). - #[serde(with = "humantime_serde")] - pub delay_between_packets: Duration, - - /// Specifies number of nodes being tested at once. - pub tested_nodes_batch_size: usize, - - /// Specifies delay between subsequent test runs. - #[serde(with = "humantime_serde")] - pub testing_interval: Duration, - - /// Specifies delay between attempting to run the measurement again if the previous run failed - /// due to being unable to get the list of nodes. - #[serde(with = "humantime_serde")] - pub retry_timeout: Duration, -} - -impl From for Verloc { - fn from(value: VerlocV1_1_32) -> Self { - Verloc { - packets_per_node: value.packets_per_node, - connection_timeout: value.connection_timeout, - packet_timeout: value.packet_timeout, - delay_between_packets: value.delay_between_packets, - tested_nodes_batch_size: value.tested_nodes_batch_size, - testing_interval: value.testing_interval, - retry_timeout: value.retry_timeout, - } - } -} - -impl Default for VerlocV1_1_32 { - fn default() -> Self { - VerlocV1_1_32 { - packets_per_node: DEFAULT_PACKETS_PER_NODE, - connection_timeout: DEFAULT_CONNECTION_TIMEOUT, - packet_timeout: DEFAULT_PACKET_TIMEOUT, - delay_between_packets: DEFAULT_DELAY_BETWEEN_PACKETS, - tested_nodes_batch_size: DEFAULT_BATCH_SIZE, - testing_interval: DEFAULT_TESTING_INTERVAL, - retry_timeout: DEFAULT_RETRY_TIMEOUT, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default)] -pub struct DebugV1_1_32 { - /// Delay between each subsequent node statistics being logged to the console - #[serde(with = "humantime_serde")] - pub node_stats_logging_delay: Duration, - - /// Delay between each subsequent node statistics being updated - #[serde(with = "humantime_serde")] - pub node_stats_updating_delay: Duration, - - /// Initial value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_initial_backoff: Duration, - - /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when - /// forwarding sphinx packets. - #[serde(with = "humantime_serde")] - pub packet_forwarding_maximum_backoff: Duration, - - /// Timeout for establishing initial connection when trying to forward a sphinx packet. - #[serde(with = "humantime_serde")] - pub initial_connection_timeout: Duration, - - /// Maximum number of packets that can be stored waiting to get sent to a particular connection. - pub maximum_connection_buffer_size: usize, - - /// Specifies whether the mixnode should be using the legacy framing for the sphinx packets. - // it's set to true by default. The reason for that decision is to preserve compatibility with the - // existing nodes whilst everyone else is upgrading and getting the code for handling the new field. - // It shall be disabled in the subsequent releases. - pub use_legacy_framed_packet_version: bool, -} - -impl From for Debug { - fn from(value: DebugV1_1_32) -> Self { - Debug { - node_stats_logging_delay: value.node_stats_logging_delay, - node_stats_updating_delay: value.node_stats_updating_delay, - packet_forwarding_initial_backoff: value.packet_forwarding_initial_backoff, - packet_forwarding_maximum_backoff: value.packet_forwarding_maximum_backoff, - initial_connection_timeout: value.initial_connection_timeout, - maximum_connection_buffer_size: value.maximum_connection_buffer_size, - use_legacy_framed_packet_version: value.use_legacy_framed_packet_version, - } - } -} - -impl Default for DebugV1_1_32 { - fn default() -> Self { - DebugV1_1_32 { - node_stats_logging_delay: DEFAULT_NODE_STATS_LOGGING_DELAY, - node_stats_updating_delay: DEFAULT_NODE_STATS_UPDATING_DELAY, - packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, - packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, - initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, - maximum_connection_buffer_size: DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE, - use_legacy_framed_packet_version: false, - } - } -} diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index 05300729939..e7a577a80f1 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -23,6 +23,10 @@ struct Cli { #[clap(short, long)] pub(crate) config_env_file: Option, + /// Force run the binary bypassing the deprecation in favour of nym-node + #[clap(long, hide = true)] + pub(crate) force_run: bool, + /// Flag used for disabling the printed banner in tty. #[clap(long)] pub(crate) no_banner: bool, diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index 371a6343986..ff2ffcf12fa 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -507,7 +507,6 @@ struct NetworkDetails { stake_denom: DenomDetailsOwned, mixnet_contract_address: String, vesting_contract_address: String, - statistics_service_url: String, validators: Vec, } @@ -527,7 +526,6 @@ impl From for NetworkDetails { .contracts .vesting_contract_address .unwrap_or_default(), - statistics_service_url: "".to_string(), validators: details.endpoints, } }