From d4a2be8a9e0bd8b59ad911b4d4bb75fba1a1a5b2 Mon Sep 17 00:00:00 2001 From: Simon Wicky Date: Tue, 30 Jan 2024 09:48:32 +0100 Subject: [PATCH] augment topology with described nodes --- .../topology_control/nym_api_provider.rs | 12 ++++++++- common/topology/src/lib.rs | 25 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/common/client-core/src/client/topology_control/nym_api_provider.rs b/common/client-core/src/client/topology_control/nym_api_provider.rs index 824294793b..90fc23cc8c 100644 --- a/common/client-core/src/client/topology_control/nym_api_provider.rs +++ b/common/client-core/src/client/topology_control/nym_api_provider.rs @@ -77,13 +77,23 @@ impl NymApiTopologyProvider { Ok(gateways) => gateways, }; + let nodes_described = match self.validator_client.get_cached_described_nodes().await { + Err(err) => { + error!("failed to get described nodes - {err}"); + return None; + } + Ok(epoch) => epoch, + }; + let topology = nym_topology_from_detailed(mixnodes, gateways) + .with_described_nodes(nodes_described.clone()) .filter_system_version(&self.client_version); if let Err(err) = self.check_layer_distribution(&topology) { warn!("The current filtered active topology has extremely skewed layer distribution. It cannot be used: {err}"); self.use_next_nym_api(); - None + let empty_topology = NymTopology::empty().with_described_nodes(nodes_described); + Some(empty_topology) } else { Some(topology) } diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 039e30eb94..36543b7243 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -19,7 +19,7 @@ use std::str::FromStr; #[cfg(feature = "serializable")] use ::serde::{Deserialize, Deserializer, Serialize, Serializer}; -use nym_api_requests::models::DescribedGateway; +use nym_api_requests::models::{DescribedGateway, DescribedNymNode}; pub mod error; pub mod filter; @@ -115,11 +115,29 @@ pub type MixLayer = u8; pub struct NymTopology { mixes: BTreeMap>, gateways: Vec, + described_nodes: Vec, } impl NymTopology { pub fn new(mixes: BTreeMap>, gateways: Vec) -> Self { - NymTopology { mixes, gateways } + NymTopology { + mixes: mixes.clone(), + gateways: gateways.clone(), + described_nodes: Vec::new(), + } + } + + pub fn empty() -> Self { + NymTopology { + mixes: BTreeMap::new(), + gateways: Vec::new(), + described_nodes: Vec::new(), + } + } + + pub fn with_described_nodes(mut self, described_nodes: Vec) -> Self { + self.described_nodes = described_nodes; + self } pub fn new_unordered(unordered_mixes: Vec, gateways: Vec) -> Self { @@ -130,7 +148,7 @@ impl NymTopology { layer_entry.push(node) } - NymTopology { mixes, gateways } + NymTopology::new(mixes, gateways) } #[cfg(feature = "serializable")] @@ -379,6 +397,7 @@ impl NymTopology { NymTopology { mixes: self.mixes.filter_by_version(expected_mix_version), gateways: self.gateways.clone(), + described_nodes: self.described_nodes.clone(), } } }