diff --git a/nym-api/src/epoch_operations/rewarded_set_assignment.rs b/nym-api/src/epoch_operations/rewarded_set_assignment.rs index 40c1124b05..d513579ef2 100644 --- a/nym-api/src/epoch_operations/rewarded_set_assignment.rs +++ b/nym-api/src/epoch_operations/rewarded_set_assignment.rs @@ -6,7 +6,9 @@ use crate::epoch_operations::helpers::stake_to_f64; use crate::EpochAdvancer; use cosmwasm_std::Decimal; use nym_mixnet_contract_common::reward_params::{Performance, RewardedSetParams}; -use nym_mixnet_contract_common::{EpochState, NodeId, NymNodeDetails, RewardedSet}; +use nym_mixnet_contract_common::{ + EpochState, NodeId, NymNodeDetails, RewardedSet, RewardingParams, +}; use rand::prelude::SliceRandom; use rand::rngs::OsRng; use std::collections::HashSet; @@ -25,14 +27,14 @@ enum AvailableRole { } #[derive(Debug, Clone)] -struct NodeWithStakeAndPerformance { +struct NodeWithSaturationAndPerformance { node_id: NodeId, available_roles: Vec, - total_stake: Decimal, + saturation: Decimal, performance: Performance, } -impl NodeWithStakeAndPerformance { +impl NodeWithSaturationAndPerformance { fn to_selection_weight(&self) -> f64 { let scaled_performance = match self.performance.checked_pow(20) { Ok(perf) => perf, @@ -42,7 +44,7 @@ impl NodeWithStakeAndPerformance { } }; - let scaled_stake = self.total_stake * scaled_performance; + let scaled_stake = self.saturation * scaled_performance; stake_to_f64(scaled_stake) } @@ -62,7 +64,7 @@ impl NodeWithStakeAndPerformance { impl EpochAdvancer { fn determine_rewarded_set( &self, - nodes: Vec, + nodes: Vec, spec: RewardedSetParams, ) -> Result { if nodes.is_empty() { @@ -204,7 +206,8 @@ impl EpochAdvancer { async fn attach_performance_to_eligible_nodes( &self, nym_nodes: &[NymNodeDetails], - ) -> Vec { + reward_params: &RewardingParams, + ) -> Vec { let mut with_performance = Vec::new(); // SAFETY: the cache MUST HAVE been initialised before now @@ -218,7 +221,7 @@ impl EpochAdvancer { for nym_node in nym_nodes { let node_id = nym_node.node_id(); - let total_stake = nym_node.total_stake(); + let saturation = nym_node.rewarding_details.bond_saturation(reward_params); let Some(self_described) = described_cache.get_description(&node_id) else { continue; @@ -230,7 +233,7 @@ impl EpochAdvancer { }; let performance = annotation.detailed_performance.to_rewarding_performance(); - debug!("nym-node {node_id}: stake: {total_stake}, performance: {performance}"); + debug!("nym-node {node_id}: saturation: {saturation}, performance: {performance}"); let mut available_roles = Vec::new(); if self_described.declared_role.mixnode { @@ -248,10 +251,10 @@ impl EpochAdvancer { continue; } - with_performance.push(NodeWithStakeAndPerformance { + with_performance.push(NodeWithSaturationAndPerformance { node_id: nym_node.node_id(), available_roles, - total_stake, + saturation, performance, }) } @@ -273,13 +276,8 @@ impl EpochAdvancer { } info!("attempting to assign the rewarded set for the upcoming epoch..."); - let nodes_with_performance = - self.attach_performance_to_eligible_nodes(nym_nodes).await; - if let Err(err) = self - ._update_rewarded_set_and_advance_epoch(nodes_with_performance) - .await - { + if let Err(err) = self._update_rewarded_set_and_advance_epoch(nym_nodes).await { error!("FAILED to assign the rewarded set... - {err}"); Err(err) } else { @@ -300,15 +298,19 @@ impl EpochAdvancer { async fn _update_rewarded_set_and_advance_epoch( &self, - all_nodes: Vec, + nym_nodes: &[NymNodeDetails], ) -> Result<(), RewardingError> { // we grab rewarding parameters here as they might have gotten updated when performing epoch actions let rewarding_parameters = self.nyxd_client.get_current_rewarding_parameters().await?; debug!("Rewarding parameters: {rewarding_parameters:?}"); + let nodes_with_performance = self + .attach_performance_to_eligible_nodes(nym_nodes, &rewarding_parameters) + .await; + let new_rewarded_set = - self.determine_rewarded_set(all_nodes, rewarding_parameters.rewarded_set)?; + self.determine_rewarded_set(nodes_with_performance, rewarding_parameters.rewarded_set)?; debug!("New rewarded set: {:?}", new_rewarded_set); diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 802ced4e1e..3efcb8f461 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -1326,6 +1326,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -2458,6 +2464,19 @@ dependencies = [ "x11", ] +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.58.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2849,57 +2868,59 @@ checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "hickory-proto" -version = "0.24.4" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287" dependencies = [ + "async-recursion", "async-trait", "bytes", "cfg-if", + "critical-section", "data-encoding", "enum-as-inner", "futures-channel", "futures-io", "futures-util", - "h2 0.3.26", - "http 0.2.12", + "h2 0.4.8", + "http 1.3.1", "idna", "ipnet", "once_cell", - "rand 0.8.5", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "thiserror 1.0.69", + "rand 0.9.0", + "ring", + "rustls 0.23.25", + "thiserror 2.0.12", "tinyvec", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.26.2", "tracing", "url", - "webpki-roots 0.25.4", + "webpki-roots", ] [[package]] name = "hickory-resolver" -version = "0.24.4" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331" dependencies = [ "cfg-if", "futures-util", "hickory-proto", "ipconfig", - "lru-cache", + "moka", "once_cell", "parking_lot", - "rand 0.8.5", + "rand 0.9.0", "resolv-conf", - "rustls 0.21.12", + "rustls 0.23.25", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.12", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.26.2", "tracing", - "webpki-roots 0.25.4", + "webpki-roots", ] [[package]] @@ -3102,7 +3123,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower-service", - "webpki-roots 0.26.8", + "webpki-roots", ] [[package]] @@ -3641,12 +3662,6 @@ dependencies = [ "redox_syscall", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3685,12 +3700,16 @@ dependencies = [ ] [[package]] -name = "lru-cache" -version = "0.1.2" +name = "loom" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "linked-hash-map", + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", ] [[package]] @@ -3713,6 +3732,15 @@ dependencies = [ "tendril", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -3773,6 +3801,25 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "moka" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", +] + [[package]] name = "muda" version = "0.16.1" @@ -3876,6 +3923,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -4647,6 +4704,10 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "opaque-debug" @@ -4750,6 +4811,12 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "p256" version = "0.13.2" @@ -5193,6 +5260,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + [[package]] name = "powerfmt" version = "0.2.0" @@ -5620,8 +5693,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -5632,9 +5714,15 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -5730,7 +5818,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.8", + "webpki-roots", "windows-registry", ] @@ -5872,6 +5960,7 @@ version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ + "log", "once_cell", "ring", "rustls-pki-types", @@ -5997,6 +6086,12 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -6308,6 +6403,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shared_child" version = "1.0.1" @@ -6666,6 +6770,12 @@ dependencies = [ "version-compare", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tao" version = "0.32.8" @@ -7235,6 +7345,16 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.9.1" @@ -7497,6 +7617,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -7757,6 +7907,12 @@ dependencies = [ "serde", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vcpkg" version = "0.2.15" @@ -8082,12 +8238,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "webpki-roots" version = "0.26.8" @@ -8108,7 +8258,7 @@ dependencies = [ "windows 0.60.0", "windows-core 0.60.1", "windows-implement 0.59.0", - "windows-interface", + "windows-interface 0.59.1", ] [[package]] @@ -8201,6 +8351,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.60.0" @@ -8232,6 +8392,19 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.60.1" @@ -8239,9 +8412,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" dependencies = [ "windows-implement 0.59.0", - "windows-interface", + "windows-interface 0.59.1", "windows-link", - "windows-result", + "windows-result 0.3.2", "windows-strings 0.3.1", ] @@ -8252,9 +8425,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ "windows-implement 0.60.0", - "windows-interface", + "windows-interface 0.59.1", "windows-link", - "windows-result", + "windows-result 0.3.2", "windows-strings 0.4.0", ] @@ -8268,6 +8441,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-implement" version = "0.59.0" @@ -8290,6 +8474,17 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-interface" version = "0.59.1" @@ -8323,11 +8518,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result", + "windows-result 0.3.2", "windows-strings 0.3.1", "windows-targets 0.53.0", ] +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.2" @@ -8337,6 +8541,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.3.1"