state update test passing

This commit is contained in:
jmwample
2025-03-03 13:02:12 -07:00
parent 0e544da06f
commit 692cd32ac2
12 changed files with 45 additions and 38 deletions
@@ -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;
@@ -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;
@@ -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<NymApiPiecewiseProvider>,
inner: NymTopologyProvider<NymApiPiecewiseProvider>,
}
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<NymTopologyProvider<NymApiPiecewiseProvider>> for NymApiTopologyProvider {
fn as_ref(&self) -> &NymTopologyProvider<NymApiPiecewiseProvider> {
&self.inner
}
fn as_ref(&self) -> &NymTopologyProvider<NymApiPiecewiseProvider> {
&self.inner
}
}
#[derive(Clone)]
+2 -1
View File
@@ -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")]
@@ -110,10 +110,6 @@ impl RewardedSet {
}
None
}
pub fn all_ids(&self) -> Vec<NodeId> {
Vec::new()
}
}
#[cw_serde]
+4 -11
View File
@@ -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<NodeId, RoutingNode>,
}
impl NymTopology {
pub fn new_empty(rewarded_set: impl Into<CachedEpochRewardedSet>) -> Self {
NymTopology {
@@ -554,8 +550,7 @@ impl NymTopology {
}
pub fn all_nodes(&self) -> impl Iterator<Item = &RoutingNode> {
self.node_details
.values()
self.node_details.values()
}
pub fn all_node_ids(&self) -> impl Iterator<Item = &NodeId> {
@@ -563,11 +558,9 @@ impl NymTopology {
}
pub fn gateways(&self) -> impl Iterator<Item = &RoutingNode> {
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)
)
})
}
}
+1 -1
View File
@@ -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};
+1 -1
View File
@@ -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]
+1
View File
@@ -0,0 +1 @@
+7 -9
View File
@@ -162,7 +162,6 @@ impl<M: PiecewiseTopologyProvider> NymTopologyProviderInner<M> {
}
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<M: PiecewiseTopologyProvider> NymTopologyProviderInner<M> {
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::<u32>::from_iter(newly_assigned_node_ids);
let new_id_set = cached_topology.rewarded_set.all_ids();
let known_id_set = HashSet::<u32>::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]);
+18
View File
@@ -119,4 +119,22 @@ impl CachedEpochRewardedSet {
mixnodes.extend(&self.layer3);
mixnodes
}
pub fn all_ids(&self) -> HashSet<NodeId> {
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
}
}
+3 -1
View File
@@ -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!