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
This commit is contained in:
Jędrzej Stuczyński
2024-12-13 09:09:56 +00:00
committed by GitHub
parent c26d4f24fc
commit b813044360
8 changed files with 38 additions and 30 deletions
@@ -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,
@@ -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 {
+9 -23
View File
@@ -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<R: Rng>(
rng: &mut R,
nym_apis: &[Url],
user_agent: Option<UserAgent>,
minimum_performance: u8,
) -> Result<Vec<gateway::LegacyNode>, ClientCoreError> {
let nym_api = nym_apis
.choose(rng)
@@ -95,41 +96,26 @@ pub async fn current_gateways<R: Rng>(
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::<Vec<gateway::LegacyNode>>();
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<R: Rng>(
rng: &mut R,
nym_apis: &[Url],
) -> Result<Vec<mix::LegacyNode>, 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::<Vec<mix::LegacyNode>>();
Ok(valid_mixnodes)
}
#[cfg(not(target_arch = "wasm32"))]
async fn connect(endpoint: &str) -> Result<WsConn, ClientCoreError> {
match tokio::time::timeout(CONN_TIMEOUT, connect_async(endpoint)).await {
+2 -1
View File
@@ -121,9 +121,10 @@ pub async fn setup_gateway_from_api(
force_tls: bool,
chosen_gateway: Option<IdentityKey>,
nym_apis: &[Url],
minimum_performance: u8,
) -> Result<InitialisationResult, WasmCoreError> {
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
}
+1 -1
View File
@@ -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");
+10 -1
View File
@@ -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,
+1
View File
@@ -165,6 +165,7 @@ impl NymClientBuilder {
self.force_tls,
user_chosen,
&nym_api_endpoints,
self.config.base.debug.topology.minimum_gateway_performance,
)
.await?
};
+1
View File
@@ -102,6 +102,7 @@ impl MixFetchClientBuilder {
self.force_tls,
user_chosen,
&nym_api_endpoints,
self.config.base.debug.topology.minimum_gateway_performance,
)
.await?;