From 5861f95a22ac9889029e8d566b86455b8814f5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 16 Jan 2025 11:12:05 +0000 Subject: [PATCH 1/2] filter out dual-role gateways during selection --- common/client-core/src/cli_helpers/client_add_gateway.rs | 2 +- common/client-core/src/cli_helpers/client_init.rs | 2 +- common/client-core/src/init/helpers.rs | 5 ++++- common/wasm/client-core/src/helpers.rs | 6 +++--- sdk/rust/nym-sdk/src/mixnet/client.rs | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/common/client-core/src/cli_helpers/client_add_gateway.rs b/common/client-core/src/cli_helpers/client_add_gateway.rs index dd1064f1353..0205169521c 100644 --- a/common/client-core/src/cli_helpers/client_add_gateway.rs +++ b/common/client-core/src/cli_helpers/client_add_gateway.rs @@ -115,7 +115,7 @@ where hardcoded_topology.entry_capable_nodes().cloned().collect() } else { let mut rng = rand::thread_rng(); - crate::init::helpers::current_gateways( + crate::init::helpers::gateways_for_init( &mut rng, &core.client.nym_api_urls, user_agent, diff --git a/common/client-core/src/cli_helpers/client_init.rs b/common/client-core/src/cli_helpers/client_init.rs index 0599f3a20e2..95ee336765c 100644 --- a/common/client-core/src/cli_helpers/client_init.rs +++ b/common/client-core/src/cli_helpers/client_init.rs @@ -170,7 +170,7 @@ where hardcoded_topology.entry_capable_nodes().cloned().collect() } else { let mut rng = rand::thread_rng(); - crate::init::helpers::current_gateways( + crate::init::helpers::gateways_for_init( &mut rng, &core.client.nym_api_urls, user_agent, diff --git a/common/client-core/src/init/helpers.rs b/common/client-core/src/init/helpers.rs index ea0103b0e60..0e9dd38eb48 100644 --- a/common/client-core/src/init/helpers.rs +++ b/common/client-core/src/init/helpers.rs @@ -86,7 +86,7 @@ impl<'a, G: ConnectableGateway> GatewayWithLatency<'a, G> { } } -pub async fn current_gateways( +pub async fn gateways_for_init( rng: &mut R, nym_apis: &[Url], user_agent: Option, @@ -108,8 +108,11 @@ pub async fn current_gateways( log::trace!("Gateways: {:#?}", gateways); + // filter out gateways below minimum performance and ones that could operate as a mixnode + // (we don't want instability) let valid_gateways = gateways .iter() + .filter(|g| !g.supported_roles.mixnode) .filter(|g| g.performance.round_to_integer() >= minimum_performance) .filter_map(|gateway| gateway.try_into().ok()) .collect::>(); diff --git a/common/wasm/client-core/src/helpers.rs b/common/wasm/client-core/src/helpers.rs index ba14c5fae88..9e9078be04d 100644 --- a/common/wasm/client-core/src/helpers.rs +++ b/common/wasm/client-core/src/helpers.rs @@ -10,7 +10,7 @@ use nym_client_core::client::base_client::storage::GatewaysDetailsStore; use nym_client_core::client::replies::reply_storage::browser_backend; use nym_client_core::config; use nym_client_core::error::ClientCoreError; -use nym_client_core::init::helpers::current_gateways; +use nym_client_core::init::helpers::gateways_for_init; use nym_client_core::init::types::GatewaySelectionSpecification; use nym_client_core::init::{ self, setup_gateway, @@ -134,7 +134,7 @@ pub async fn setup_gateway_from_api( minimum_performance: u8, ) -> Result { let mut rng = thread_rng(); - let gateways = current_gateways(&mut rng, nym_apis, None, minimum_performance).await?; + let gateways = gateways_for_init(&mut rng, nym_apis, None, minimum_performance).await?; setup_gateway_wasm(client_store, force_tls, chosen_gateway, gateways).await } @@ -144,7 +144,7 @@ pub async fn current_gateways_wasm( minimum_performance: u8, ) -> Result, ClientCoreError> { let mut rng = thread_rng(); - current_gateways(&mut rng, nym_apis, user_agent, minimum_performance).await + gateways_for_init(&mut rng, nym_apis, user_agent, minimum_performance).await } pub async fn setup_from_topology( diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index b5eff8eba3a..4c10ec3d768 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -25,7 +25,7 @@ use nym_client_core::client::{ }; use nym_client_core::config::{DebugConfig, StatsReporting}; use nym_client_core::error::ClientCoreError; -use nym_client_core::init::helpers::current_gateways; +use nym_client_core::init::helpers::gateways_for_init; use nym_client_core::init::setup_gateway; use nym_client_core::init::types::{GatewaySelectionSpecification, GatewaySetup}; use nym_client_core::ForgetMe; @@ -513,7 +513,7 @@ where let user_agent = self.user_agent.clone(); let mut rng = OsRng; - let available_gateways = current_gateways( + let available_gateways = gateways_for_init( &mut rng, &nym_api_endpoints, user_agent, From 9437da6b5322e13bd668a259a7145b16fff29f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 16 Jan 2025 11:31:17 +0000 Subject: [PATCH 2/2] changed behaviour of egress node validitiy --- common/client-core/config-types/src/lib.rs | 1 - .../mixnet-contract/src/nym_node.rs | 4 ++++ common/topology/src/lib.rs | 19 ++++++++----------- common/wasm/client-core/src/config/mod.rs | 1 - .../wasm/client-core/src/config/override.rs | 1 - 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/common/client-core/config-types/src/lib.rs b/common/client-core/config-types/src/lib.rs index 2031c5c34e8..ae9d5c06599 100644 --- a/common/client-core/config-types/src/lib.rs +++ b/common/client-core/config-types/src/lib.rs @@ -553,7 +553,6 @@ pub struct Topology { /// Specifies whether this client should attempt to retrieve all available network nodes /// as opposed to just active mixnodes/gateways. - /// Useless without `ignore_epoch_roles = true` pub use_extended_topology: bool, /// Specifies whether this client should ignore the current epoch role of the target egress node diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/nym_node.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/nym_node.rs index 4087489cc36..85e28c7d757 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/nym_node.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/nym_node.rs @@ -113,6 +113,10 @@ impl Role { pub fn is_standby(&self) -> bool { matches!(self, Role::Standby) } + + pub fn is_mixnode(&self) -> bool { + matches!(self, Role::Layer1 | Role::Layer2 | Role::Layer3) + } } impl Display for Role { diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index c71ada3c2dc..1077d1ffe55 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -401,20 +401,17 @@ impl NymTopology { }); }; - // a 'valid' egress is one assigned to either entry role (i.e. entry for another client) - // or exit role (as a service provider) + // a 'valid' egress is one that is currently **not** acting as a mixnode if !ignore_epoch_roles { - let Some(role) = self.rewarded_set.role(node.node_id) else { - return Err(NymTopologyError::InvalidEgressRole { - node_identity: Box::new(node_identity), - }); - }; - if !matches!(role, Role::EntryGateway | Role::ExitGateway) { - return Err(NymTopologyError::InvalidEgressRole { - node_identity: Box::new(node_identity), - }); + if let Some(role) = self.rewarded_set.role(node.node_id) { + if role.is_mixnode() { + return Err(NymTopologyError::InvalidEgressRole { + node_identity: Box::new(node_identity), + }); + } } } + Ok(node) } diff --git a/common/wasm/client-core/src/config/mod.rs b/common/wasm/client-core/src/config/mod.rs index aab813f5daf..5c20f832d3e 100644 --- a/common/wasm/client-core/src/config/mod.rs +++ b/common/wasm/client-core/src/config/mod.rs @@ -390,7 +390,6 @@ pub struct TopologyWasm { /// Specifies whether this client should attempt to retrieve all available network nodes /// as opposed to just active mixnodes/gateways. - /// Useless without `ignore_epoch_roles = true` pub use_extended_topology: bool, /// Specifies whether this client should ignore the current epoch role of the target egress node diff --git a/common/wasm/client-core/src/config/override.rs b/common/wasm/client-core/src/config/override.rs index f85ad9d241c..a1a10769fad 100644 --- a/common/wasm/client-core/src/config/override.rs +++ b/common/wasm/client-core/src/config/override.rs @@ -274,7 +274,6 @@ pub struct TopologyWasmOverride { /// Specifies whether this client should attempt to retrieve all available network nodes /// as opposed to just active mixnodes/gateways. - /// Useless without `ignore_epoch_roles = true` #[tsify(optional)] pub use_extended_topology: Option,