diff --git a/common/client-core/src/client/base_client/mod.rs b/common/client-core/src/client/base_client/mod.rs index a202964295..25d061c850 100644 --- a/common/client-core/src/client/base_client/mod.rs +++ b/common/client-core/src/client/base_client/mod.rs @@ -54,7 +54,7 @@ use nym_statistics_common::clients::ClientStatsSender; use nym_statistics_common::generate_client_stats_id; use nym_task::connections::{ConnectionCommandReceiver, ConnectionCommandSender, LaneQueueLengths}; use nym_task::{TaskClient, TaskHandle}; -use nym_topology::providers::{TopologyProvider, HardcodedTopologyProvider}; +use nym_topology::providers::{HardcodedTopologyProvider, TopologyProvider}; use nym_validator_client::{nyxd::contract_traits::DkgQueryClient, UserAgent}; use rand::rngs::OsRng; use std::fmt::Debug; 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 90cca60a35..b2f0a39578 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 @@ -3,7 +3,7 @@ use async_trait::async_trait; use log::{debug, error, warn}; -use nym_topology::{TopologyProvider, NymTopology}; +use nym_topology::{NymTopology, TopologyProvider}; use nym_validator_client::UserAgent; use rand::prelude::SliceRandom; use rand::thread_rng; diff --git a/common/client-core/src/client/topology_control/smart_api_provider.rs b/common/client-core/src/client/topology_control/smart_api_provider.rs index 8463def5d8..db0fc85076 100644 --- a/common/client-core/src/client/topology_control/smart_api_provider.rs +++ b/common/client-core/src/client/topology_control/smart_api_provider.rs @@ -9,7 +9,7 @@ use async_trait::async_trait; use log::{debug, error, warn}; use nym_topology::{ - providers::piecewise::{Config, PiecewiseTopologyProvider, NymTopologyProvider}, + providers::piecewise::{Config, NymTopologyProvider, PiecewiseTopologyProvider}, EpochRewardedSet, NymTopology, RoutingNode, }; use nym_validator_client::UserAgent; @@ -22,7 +22,7 @@ use std::collections::HashMap; /// fetch changes and node details. #[derive(Clone)] pub struct NymApiTopologyProvider { - inner: NymTopologyProvider, + inner: NymTopologyProvider, } impl NymApiTopologyProvider { @@ -36,16 +36,14 @@ impl NymApiTopologyProvider { let manager = NymApiPiecewiseProvider::new(nym_api_urls, Some(user_agent)); let inner = NymTopologyProvider::new(manager, config, initial_topology); - Self { - inner, - } + Self { inner } } } impl AsRef> for NymApiTopologyProvider { - fn as_ref(&self) -> &NymTopologyProvider { - &self.inner - } + fn as_ref(&self) -> &NymTopologyProvider { + &self.inner + } } #[derive(Clone)] diff --git a/common/client-core/src/lib.rs b/common/client-core/src/lib.rs index a378e52520..dec66cfb80 100644 --- a/common/client-core/src/lib.rs +++ b/common/client-core/src/lib.rs @@ -14,7 +14,8 @@ pub mod error; pub mod init; pub use nym_topology::{ - providers::HardcodedTopologyProvider, NymRouteProvider, NymTopology, NymTopologyError, TopologyProvider, + providers::HardcodedTopologyProvider, NymRouteProvider, NymTopology, NymTopologyError, + TopologyProvider, }; #[cfg(target_arch = "wasm32")] diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/types.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/types.rs index 14bcf94fa0..b3c4e5b2be 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/types.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/types.rs @@ -110,10 +110,6 @@ impl RewardedSet { } None } - - pub fn all_ids(&self) -> Vec { - Vec::new() - } } #[cw_serde] diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 22a237074f..b9249cd2ed 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -25,11 +25,9 @@ pub mod error; pub mod node; pub mod rewarded_set; - #[cfg(feature = "wasm-serde-types")] pub mod wasm_helpers; - #[cfg(feature = "providers")] pub mod providers; #[cfg(feature = "providers")] @@ -181,7 +179,6 @@ impl NymRouteProvider { } } - #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct NymTopology { // for the purposes of future VRF, everyone will need the same view of the network, regardless of performance filtering @@ -194,7 +191,6 @@ pub struct NymTopology { node_details: HashMap, } - impl NymTopology { pub fn new_empty(rewarded_set: impl Into) -> Self { NymTopology { @@ -554,8 +550,7 @@ impl NymTopology { } pub fn all_nodes(&self) -> impl Iterator { - self.node_details - .values() + self.node_details.values() } pub fn all_node_ids(&self) -> impl Iterator { @@ -563,11 +558,9 @@ impl NymTopology { } pub fn gateways(&self) -> impl Iterator { - self.node_details - .values() - .filter(|n| - self.rewarded_set.entry_gateways.contains(&n.node_id) + self.node_details.values().filter(|n| { + self.rewarded_set.entry_gateways.contains(&n.node_id) || self.rewarded_set.exit_gateways.contains(&n.node_id) - ) + }) } } diff --git a/common/topology/src/node.rs b/common/topology/src/node.rs index 8c710c6573..abd1a08d6b 100644 --- a/common/topology/src/node.rs +++ b/common/topology/src/node.rs @@ -4,8 +4,8 @@ use nym_api_requests::models::DeclaredRoles; use nym_api_requests::nym_nodes::SkimmedNode; use nym_crypto::asymmetric::{ed25519, x25519}; -use nym_mixnet_contract_common::NodeId; use nym_mixnet_contract_common::reward_params::Performance; +use nym_mixnet_contract_common::NodeId; use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; use nym_sphinx_types::Node as SphinxNode; use serde::{Deserialize, Serialize}; diff --git a/common/topology/src/providers/mod.rs b/common/topology/src/providers/mod.rs index 16df53aa5d..fc506c60db 100644 --- a/common/topology/src/providers/mod.rs +++ b/common/topology/src/providers/mod.rs @@ -4,8 +4,8 @@ use crate::NymTopology; pub use async_trait::async_trait; -pub mod piecewise; pub mod nyxd; +pub mod piecewise; #[cfg(not(target_arch = "wasm32"))] #[async_trait] diff --git a/common/topology/src/providers/nyxd.rs b/common/topology/src/providers/nyxd.rs index e69de29bb2..8b13789179 100644 --- a/common/topology/src/providers/nyxd.rs +++ b/common/topology/src/providers/nyxd.rs @@ -0,0 +1 @@ + diff --git a/common/topology/src/providers/piecewise.rs b/common/topology/src/providers/piecewise.rs index df2bada93c..2c5ec70df6 100644 --- a/common/topology/src/providers/piecewise.rs +++ b/common/topology/src/providers/piecewise.rs @@ -162,7 +162,6 @@ impl NymTopologyProviderInner { } let layer_assignments = response.unwrap(); - // Check if we already know about the epoch if cached_topology.rewarded_set.epoch_id == layer_assignments.epoch_id { debug!("pulled layer assignments, epoch already known"); @@ -170,9 +169,10 @@ impl NymTopologyProviderInner { return; } + cached_topology.rewarded_set = layer_assignments.into(); + // get the set of node IDs - let newly_assigned_node_ids = layer_assignments.assignment.all_ids(); - let new_id_set = HashSet::::from_iter(newly_assigned_node_ids); + let new_id_set = cached_topology.rewarded_set.all_ids(); let known_id_set = HashSet::::from_iter(cached_topology.all_node_ids().copied()); let unknown_node_ids: Vec<_> = new_id_set.difference(&known_id_set).copied().collect(); @@ -242,13 +242,11 @@ pub trait PiecewiseTopologyProvider: Send { #[cfg(test)] mod test { - use std::net::SocketAddr; - - use nym_mixnet_contract_common::Percent; - use nym_crypto::asymmetric::identity::PublicKey as IdentityPubkey; - use nym_crypto::asymmetric::encryption::PublicKey as SphinxPubkey; use super::*; use crate::SupportedRoles; + use nym_crypto::asymmetric::encryption::PublicKey as SphinxPubkey; + use nym_crypto::asymmetric::identity::PublicKey as IdentityPubkey; + use nym_mixnet_contract_common::Percent; #[derive(Clone)] struct PassthroughPiecewiseTopologyProvider { @@ -296,7 +294,7 @@ mod test { assert!(topo.is_some()); let topo = topo.unwrap(); assert!(topo.is_empty()); - + // create a change in the manager to make sure it is propogated to the provider cache on update topo_mgr.topo.rewarded_set.epoch_id += 1; topo_mgr.topo.rewarded_set.entry_gateways = HashSet::from([123]); diff --git a/common/topology/src/rewarded_set.rs b/common/topology/src/rewarded_set.rs index 22f50e9b65..73c57b9cac 100644 --- a/common/topology/src/rewarded_set.rs +++ b/common/topology/src/rewarded_set.rs @@ -119,4 +119,22 @@ impl CachedEpochRewardedSet { mixnodes.extend(&self.layer3); mixnodes } + + pub fn all_ids(&self) -> HashSet { + let mut mixnodes = HashSet::with_capacity( + self.entry_gateways.len() + + self.exit_gateways.len() + + self.layer1.len() + + self.layer2.len() + + self.layer3.len() + + self.standby.len(), + ); + mixnodes.extend(&self.entry_gateways); + mixnodes.extend(&self.exit_gateways); + mixnodes.extend(&self.layer1); + mixnodes.extend(&self.layer2); + mixnodes.extend(&self.layer3); + mixnodes.extend(&self.standby); + mixnodes + } } diff --git a/common/wasm/client-core/src/lib.rs b/common/wasm/client-core/src/lib.rs index 8569dd7ad9..09fbcc1442 100644 --- a/common/wasm/client-core/src/lib.rs +++ b/common/wasm/client-core/src/lib.rs @@ -28,7 +28,9 @@ pub use nym_sphinx::{ }; pub use nym_statistics_common::clients::ClientStatsSender; pub use nym_task; -pub use nym_topology::{HardcodedTopologyProvider, MixLayer, NymTopology, TopologyProvider}; +pub use nym_topology::{ + providers::HardcodedTopologyProvider, MixLayer, NymTopology, TopologyProvider, +}; pub use nym_validator_client::nym_api::Client as ApiClient; pub use nym_validator_client::{DirectSigningReqwestRpcNyxdClient, QueryReqwestRpcNyxdClient}; // TODO: that's a very nasty import path. it should come from contracts instead!