From b8130443601195fb582d00a5d1794dae45bad816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Fri, 13 Dec 2024 09:09:56 +0000 Subject: [PATCH] bugfix: make sure to apply gateway score filtering when choosing initial node (#5256) * bugfix: make sure to apply gateway score filtering when choosing initial node * mixfetch build fix --- .../src/cli_helpers/client_add_gateway.rs | 9 ++++-- .../src/cli_helpers/client_init.rs | 9 ++++-- common/client-core/src/init/helpers.rs | 32 ++++++------------- common/wasm/client-core/src/helpers.rs | 3 +- sdk/lib/socks5-listener/src/lib.rs | 2 +- sdk/rust/nym-sdk/src/mixnet/client.rs | 11 ++++++- wasm/client/src/client.rs | 1 + wasm/mix-fetch/src/client.rs | 1 + 8 files changed, 38 insertions(+), 30 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 022db8b9c3..56b1c3ad8e 100644 --- a/common/client-core/src/cli_helpers/client_add_gateway.rs +++ b/common/client-core/src/cli_helpers/client_add_gateway.rs @@ -115,8 +115,13 @@ where hardcoded_topology.get_gateways() } else { let mut rng = rand::thread_rng(); - crate::init::helpers::current_gateways(&mut rng, &core.client.nym_api_urls, user_agent) - .await? + crate::init::helpers::current_gateways( + &mut rng, + &core.client.nym_api_urls, + user_agent, + core.debug.topology.minimum_gateway_performance, + ) + .await? }; // since we're registering with a brand new gateway, diff --git a/common/client-core/src/cli_helpers/client_init.rs b/common/client-core/src/cli_helpers/client_init.rs index 0e3f3bf234..060c1192da 100644 --- a/common/client-core/src/cli_helpers/client_init.rs +++ b/common/client-core/src/cli_helpers/client_init.rs @@ -170,8 +170,13 @@ where hardcoded_topology.get_gateways() } else { let mut rng = rand::thread_rng(); - crate::init::helpers::current_gateways(&mut rng, &core.client.nym_api_urls, user_agent) - .await? + crate::init::helpers::current_gateways( + &mut rng, + &core.client.nym_api_urls, + user_agent, + core.debug.topology.minimum_gateway_performance, + ) + .await? }; let gateway_setup = GatewaySetup::New { diff --git a/common/client-core/src/init/helpers.rs b/common/client-core/src/init/helpers.rs index 60c692df9f..68b3b8d457 100644 --- a/common/client-core/src/init/helpers.rs +++ b/common/client-core/src/init/helpers.rs @@ -7,7 +7,7 @@ use futures::{SinkExt, StreamExt}; use log::{debug, info, trace, warn}; use nym_crypto::asymmetric::identity; use nym_gateway_client::GatewayClient; -use nym_topology::{gateway, mix}; +use nym_topology::gateway; use nym_validator_client::client::IdentityKeyRef; use nym_validator_client::UserAgent; use rand::{seq::SliceRandom, Rng}; @@ -82,6 +82,7 @@ pub async fn current_gateways( rng: &mut R, nym_apis: &[Url], user_agent: Option, + minimum_performance: u8, ) -> Result, ClientCoreError> { let nym_api = nym_apis .choose(rng) @@ -95,41 +96,26 @@ pub async fn current_gateways( log::debug!("Fetching list of gateways from: {nym_api}"); let gateways = client.get_all_basic_entry_assigned_nodes().await?; - log::debug!("Found {} gateways", gateways.len()); + info!("nym api reports {} gateways", gateways.len()); + log::trace!("Gateways: {:#?}", gateways); let valid_gateways = gateways .iter() + .filter(|g| g.performance.round_to_integer() >= minimum_performance) .filter_map(|gateway| gateway.try_into().ok()) .collect::>(); log::debug!("After checking validity: {}", valid_gateways.len()); log::trace!("Valid gateways: {:#?}", valid_gateways); - log::info!("nym-api reports {} valid gateways", valid_gateways.len()); + log::info!( + "and {} after validity and performance filtering", + valid_gateways.len() + ); Ok(valid_gateways) } -pub async fn current_mixnodes( - rng: &mut R, - nym_apis: &[Url], -) -> Result, ClientCoreError> { - let nym_api = nym_apis - .choose(rng) - .ok_or(ClientCoreError::ListOfNymApisIsEmpty)?; - let client = nym_validator_client::client::NymApiClient::new(nym_api.clone()); - - log::trace!("Fetching list of mixnodes from: {nym_api}"); - - let mixnodes = client.get_all_basic_active_mixing_assigned_nodes().await?; - let valid_mixnodes = mixnodes - .iter() - .filter_map(|mixnode| mixnode.try_into().ok()) - .collect::>(); - - Ok(valid_mixnodes) -} - #[cfg(not(target_arch = "wasm32"))] async fn connect(endpoint: &str) -> Result { match tokio::time::timeout(CONN_TIMEOUT, connect_async(endpoint)).await { diff --git a/common/wasm/client-core/src/helpers.rs b/common/wasm/client-core/src/helpers.rs index eee064e2cc..04d6960377 100644 --- a/common/wasm/client-core/src/helpers.rs +++ b/common/wasm/client-core/src/helpers.rs @@ -121,9 +121,10 @@ pub async fn setup_gateway_from_api( force_tls: bool, chosen_gateway: Option, nym_apis: &[Url], + minimum_performance: u8, ) -> Result { let mut rng = thread_rng(); - let gateways = current_gateways(&mut rng, nym_apis, None).await?; + let gateways = current_gateways(&mut rng, nym_apis, None, minimum_performance).await?; setup_gateway_wasm(client_store, force_tls, chosen_gateway, &gateways).await } diff --git a/sdk/lib/socks5-listener/src/lib.rs b/sdk/lib/socks5-listener/src/lib.rs index bc5350718c..3019402182 100644 --- a/sdk/lib/socks5-listener/src/lib.rs +++ b/sdk/lib/socks5-listener/src/lib.rs @@ -275,7 +275,7 @@ where specification: GatewaySelectionSpecification::UniformRemote { must_use_tls: false, }, - available_gateways: current_gateways(&mut rng, &nym_apis, None).await?, + available_gateways: current_gateways(&mut rng, &nym_apis, None, 50).await?, }); eprintln!("starting the socks5 client"); diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 54885b24eb..118885a650 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -457,7 +457,16 @@ where let user_agent = self.user_agent.clone(); let mut rng = OsRng; - let available_gateways = current_gateways(&mut rng, &nym_api_endpoints, user_agent).await?; + let available_gateways = current_gateways( + &mut rng, + &nym_api_endpoints, + user_agent, + self.config + .debug_config + .topology + .minimum_gateway_performance, + ) + .await?; Ok(GatewaySetup::New { specification: selection_spec, diff --git a/wasm/client/src/client.rs b/wasm/client/src/client.rs index 645fda613c..4bb9f2c2f2 100644 --- a/wasm/client/src/client.rs +++ b/wasm/client/src/client.rs @@ -165,6 +165,7 @@ impl NymClientBuilder { self.force_tls, user_chosen, &nym_api_endpoints, + self.config.base.debug.topology.minimum_gateway_performance, ) .await? }; diff --git a/wasm/mix-fetch/src/client.rs b/wasm/mix-fetch/src/client.rs index 9e4bff5e32..e905d01aad 100644 --- a/wasm/mix-fetch/src/client.rs +++ b/wasm/mix-fetch/src/client.rs @@ -102,6 +102,7 @@ impl MixFetchClientBuilder { self.force_tls, user_chosen, &nym_api_endpoints, + self.config.base.debug.topology.minimum_gateway_performance, ) .await?;