From 44ce566b9a333bf1e293e9f8175f525f242edb3e Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Tue, 25 Jun 2024 09:31:55 +0100 Subject: [PATCH 1/5] reset neuron data on registration --- pallets/subtensor/src/uids.rs | 26 ++++++++++++++ pallets/subtensor/tests/uids.rs | 64 +++++++++++++++++++++++++++++---- 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/pallets/subtensor/src/uids.rs b/pallets/subtensor/src/uids.rs index 4ae2c24de..a3970cb10 100644 --- a/pallets/subtensor/src/uids.rs +++ b/pallets/subtensor/src/uids.rs @@ -9,6 +9,22 @@ impl Pallet { SubnetworkN::::get(netuid) } + pub fn set_emission_for_uid(netuid: u16, neuron_uid: u16, emission: u64) { + Emission::::mutate(netuid, |v| v[neuron_uid as usize] = emission); + } + pub fn set_trust_for_uid(netuid: u16, neuron_uid: u16, trust: u16) { + Trust::::mutate(netuid, |v| v[neuron_uid as usize] = trust); + } + pub fn set_consensus_for_uid(netuid: u16, neuron_uid: u16, consensus: u16) { + Consensus::::mutate(netuid, |v| v[neuron_uid as usize] = consensus); + } + pub fn set_incentive_for_uid(netuid: u16, neuron_uid: u16, incentive: u16) { + Incentive::::mutate(netuid, |v| v[neuron_uid as usize] = incentive); + } + pub fn set_dividends_for_uid(netuid: u16, neuron_uid: u16, dividends: u16) { + Dividends::::mutate(netuid, |v| v[neuron_uid as usize] = dividends); + } + /// Replace the neuron under this uid. pub fn replace_neuron( netuid: u16, @@ -45,6 +61,16 @@ impl Pallet { Uids::::insert(netuid, new_hotkey.clone(), uid_to_replace); // Make uid - hotkey association. BlockAtRegistration::::insert(netuid, uid_to_replace, block_number); // Fill block at registration. IsNetworkMember::::insert(new_hotkey.clone(), netuid, true); // Fill network is member. + + // 4. Reset trust, emission, consensus, incentive, dividends and axon_info for the new uid. + Self::set_trust_for_uid(netuid, uid_to_replace, 0); + Self::set_emission_for_uid(netuid, uid_to_replace, 0); + Self::set_consensus_for_uid(netuid, uid_to_replace, 0); + Self::set_incentive_for_uid(netuid, uid_to_replace, 0); + Self::set_dividends_for_uid(netuid, uid_to_replace, 0); + + // 4a. reset axon info for the new uid. + Axons::::remove(netuid, old_hotkey); } /// Appends the uid to the network. diff --git a/pallets/subtensor/tests/uids.rs b/pallets/subtensor/tests/uids.rs index b8a969943..34526a103 100644 --- a/pallets/subtensor/tests/uids.rs +++ b/pallets/subtensor/tests/uids.rs @@ -48,14 +48,37 @@ fn test_replace_neuron() { // Get UID let neuron_uid = SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id); assert_ok!(neuron_uid); + let neuron_uid = neuron_uid.unwrap(); + + // set non-default values + SubtensorModule::set_trust_for_uid(netuid, neuron_uid, 5u16); + SubtensorModule::set_emission_for_uid(netuid, neuron_uid, 5u64); + SubtensorModule::set_consensus_for_uid(netuid, neuron_uid, 5u16); + SubtensorModule::set_incentive_for_uid(netuid, neuron_uid, 5u16); + SubtensorModule::set_dividends_for_uid(netuid, neuron_uid, 5u16); + + // serve axon mock address + let ip: u128 = 1676056785; + let port: u16 = 9999; + let ip_type: u8 = 4; + let hotkey = SubtensorModule::get_hotkey_for_net_and_uid(netuid, neuron_uid).unwrap(); + assert!(SubtensorModule::serve_axon( + <::RuntimeOrigin>::signed(hotkey_account_id), + netuid, + 0, + ip, + port, + ip_type, + 0, + 0, + 0 + ) + .is_ok()); // Replace the neuron. - SubtensorModule::replace_neuron( - netuid, - neuron_uid.unwrap(), - &new_hotkey_account_id, - block_number, - ); + SubtensorModule::replace_neuron(netuid, neuron_uid, &new_hotkey_account_id, block_number); + + assert!(!SubtensorModule::has_axon_info(netuid, &hotkey)); // Check old hotkey is not registered on any network. assert!(SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id).is_err()); @@ -63,7 +86,7 @@ fn test_replace_neuron() { &hotkey_account_id )); - let curr_hotkey = SubtensorModule::get_hotkey_for_net_and_uid(netuid, neuron_uid.unwrap()); + let curr_hotkey = SubtensorModule::get_hotkey_for_net_and_uid(netuid, neuron_uid); assert_ok!(curr_hotkey); assert_ne!(curr_hotkey.unwrap(), hotkey_account_id); @@ -75,6 +98,33 @@ fn test_replace_neuron() { &new_hotkey_account_id )); assert_eq!(curr_hotkey.unwrap(), new_hotkey_account_id); + + // Check trust, emission, consensus, incentive, dividends have been reset to 0. + assert_eq!(SubtensorModule::get_trust_for_uid(netuid, neuron_uid), 0); + assert_eq!(SubtensorModule::get_emission_for_uid(netuid, neuron_uid), 0); + assert_eq!( + SubtensorModule::get_consensus_for_uid(netuid, neuron_uid), + 0 + ); + assert_eq!( + SubtensorModule::get_incentive_for_uid(netuid, neuron_uid), + 0 + ); + assert_eq!( + SubtensorModule::get_dividends_for_uid(netuid, neuron_uid), + 0 + ); + + assert!(!SubtensorModule::has_axon_info( + netuid, + &new_hotkey_account_id + )); + + // Check axon info is reset. + let axon_info = SubtensorModule::get_axon_info(netuid, &curr_hotkey.unwrap()); + assert_eq!(axon_info.ip, 0); + assert_eq!(axon_info.port, 0); + assert_eq!(axon_info.ip_type, 0); }); } From eb0da5ca520fe11d17a938dcd68ba2a5363b40ea Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Tue, 25 Jun 2024 14:46:48 +0100 Subject: [PATCH 2/5] mutate directly --- pallets/subtensor/src/lib.rs | 11 +++++------ pallets/subtensor/src/uids.rs | 26 +++++--------------------- pallets/subtensor/tests/uids.rs | 11 ++++++----- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index b590781f5..351bc39bf 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1001,19 +1001,18 @@ pub mod pallet { pub(super) type Rank = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> trust - pub(super) type Trust = - StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; + pub type Trust = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> consensus - pub(super) type Consensus = + pub type Consensus = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> incentive - pub(super) type Incentive = + pub type Incentive = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> dividends - pub(super) type Dividends = + pub type Dividends = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU16Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> emission - pub(super) type Emission = + pub type Emission = StorageMap<_, Identity, u16, Vec, ValueQuery, EmptyU64Vec>; #[pallet::storage] // --- DMAP ( netuid ) --> last_update pub(super) type LastUpdate = diff --git a/pallets/subtensor/src/uids.rs b/pallets/subtensor/src/uids.rs index a3970cb10..36b17f9de 100644 --- a/pallets/subtensor/src/uids.rs +++ b/pallets/subtensor/src/uids.rs @@ -9,22 +9,6 @@ impl Pallet { SubnetworkN::::get(netuid) } - pub fn set_emission_for_uid(netuid: u16, neuron_uid: u16, emission: u64) { - Emission::::mutate(netuid, |v| v[neuron_uid as usize] = emission); - } - pub fn set_trust_for_uid(netuid: u16, neuron_uid: u16, trust: u16) { - Trust::::mutate(netuid, |v| v[neuron_uid as usize] = trust); - } - pub fn set_consensus_for_uid(netuid: u16, neuron_uid: u16, consensus: u16) { - Consensus::::mutate(netuid, |v| v[neuron_uid as usize] = consensus); - } - pub fn set_incentive_for_uid(netuid: u16, neuron_uid: u16, incentive: u16) { - Incentive::::mutate(netuid, |v| v[neuron_uid as usize] = incentive); - } - pub fn set_dividends_for_uid(netuid: u16, neuron_uid: u16, dividends: u16) { - Dividends::::mutate(netuid, |v| v[neuron_uid as usize] = dividends); - } - /// Replace the neuron under this uid. pub fn replace_neuron( netuid: u16, @@ -63,11 +47,11 @@ impl Pallet { IsNetworkMember::::insert(new_hotkey.clone(), netuid, true); // Fill network is member. // 4. Reset trust, emission, consensus, incentive, dividends and axon_info for the new uid. - Self::set_trust_for_uid(netuid, uid_to_replace, 0); - Self::set_emission_for_uid(netuid, uid_to_replace, 0); - Self::set_consensus_for_uid(netuid, uid_to_replace, 0); - Self::set_incentive_for_uid(netuid, uid_to_replace, 0); - Self::set_dividends_for_uid(netuid, uid_to_replace, 0); + Emission::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); + Trust::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); + Consensus::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); + Incentive::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); + Dividends::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); // 4a. reset axon info for the new uid. Axons::::remove(netuid, old_hotkey); diff --git a/pallets/subtensor/tests/uids.rs b/pallets/subtensor/tests/uids.rs index 34526a103..b0049216c 100644 --- a/pallets/subtensor/tests/uids.rs +++ b/pallets/subtensor/tests/uids.rs @@ -1,6 +1,7 @@ use crate::mock::*; use frame_support::assert_ok; use frame_system::Config; +use pallet_subtensor::*; use sp_core::U256; mod mock; @@ -51,11 +52,11 @@ fn test_replace_neuron() { let neuron_uid = neuron_uid.unwrap(); // set non-default values - SubtensorModule::set_trust_for_uid(netuid, neuron_uid, 5u16); - SubtensorModule::set_emission_for_uid(netuid, neuron_uid, 5u64); - SubtensorModule::set_consensus_for_uid(netuid, neuron_uid, 5u16); - SubtensorModule::set_incentive_for_uid(netuid, neuron_uid, 5u16); - SubtensorModule::set_dividends_for_uid(netuid, neuron_uid, 5u16); + Trust::::mutate(netuid, |v| v[neuron_uid as usize] = 5u16); + Emission::::mutate(netuid, |v| v[neuron_uid as usize] = 5u64); + Consensus::::mutate(netuid, |v| v[neuron_uid as usize] = 5u16); + Incentive::::mutate(netuid, |v| v[neuron_uid as usize] = 5u16); + Dividends::::mutate(netuid, |v| v[neuron_uid as usize] = 5u16); // serve axon mock address let ip: u128 = 1676056785; From 4f99ee5907d15de2f7312a3e66d7b68e7dae718a Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Tue, 25 Jun 2024 15:43:05 +0100 Subject: [PATCH 3/5] clear_neuron function --- pallets/subtensor/src/uids.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pallets/subtensor/src/uids.rs b/pallets/subtensor/src/uids.rs index 36b17f9de..5f96c36c2 100644 --- a/pallets/subtensor/src/uids.rs +++ b/pallets/subtensor/src/uids.rs @@ -9,6 +9,15 @@ impl Pallet { SubnetworkN::::get(netuid) } + /// Resets the trust, emission, consensus, incentive, dividends of the neuron to default + pub fn clear_neuron(netuid: u16, neuron_uid: u16) { + Emission::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + Trust::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + Consensus::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + Incentive::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + Dividends::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + } + /// Replace the neuron under this uid. pub fn replace_neuron( netuid: u16, @@ -46,12 +55,8 @@ impl Pallet { BlockAtRegistration::::insert(netuid, uid_to_replace, block_number); // Fill block at registration. IsNetworkMember::::insert(new_hotkey.clone(), netuid, true); // Fill network is member. - // 4. Reset trust, emission, consensus, incentive, dividends and axon_info for the new uid. - Emission::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); - Trust::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); - Consensus::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); - Incentive::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); - Dividends::::mutate(netuid, |v| v[uid_to_replace as usize] = 0); + // 4. Reset new neuron's values. + Self::clear_neuron(netuid, uid_to_replace); // 4a. reset axon info for the new uid. Axons::::remove(netuid, old_hotkey); From 51fc1718cb6eaf1462d49879eb942f4b5d620fc2 Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Fri, 28 Jun 2024 14:55:33 +0100 Subject: [PATCH 4/5] add bounds check --- pallets/subtensor/src/uids.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pallets/subtensor/src/uids.rs b/pallets/subtensor/src/uids.rs index 5f96c36c2..9c865a4ad 100644 --- a/pallets/subtensor/src/uids.rs +++ b/pallets/subtensor/src/uids.rs @@ -9,13 +9,24 @@ impl Pallet { SubnetworkN::::get(netuid) } + fn clear_element_at(position: u16) -> impl Fn(&mut Vec) + where + N: From, + { + move |vec: &mut Vec| { + if vec.len() > position as usize { + vec[position as usize] = N::from(0); + }; + } + } + /// Resets the trust, emission, consensus, incentive, dividends of the neuron to default pub fn clear_neuron(netuid: u16, neuron_uid: u16) { - Emission::::mutate(netuid, |v| v[neuron_uid as usize] = 0); - Trust::::mutate(netuid, |v| v[neuron_uid as usize] = 0); - Consensus::::mutate(netuid, |v| v[neuron_uid as usize] = 0); - Incentive::::mutate(netuid, |v| v[neuron_uid as usize] = 0); - Dividends::::mutate(netuid, |v| v[neuron_uid as usize] = 0); + Emission::::mutate(netuid, Self::clear_element_at(neuron_uid)); + Trust::::mutate(netuid, Self::clear_element_at(neuron_uid)); + Consensus::::mutate(netuid, Self::clear_element_at(neuron_uid)); + Incentive::::mutate(netuid, Self::clear_element_at(neuron_uid)); + Dividends::::mutate(netuid, Self::clear_element_at(neuron_uid)); } /// Replace the neuron under this uid. From 0468b01fce835cd6500eb066bebd6d036d03b92a Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Tue, 2 Jul 2024 14:23:20 +0100 Subject: [PATCH 5/5] add doc comment --- pallets/subtensor/src/uids.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/subtensor/src/uids.rs b/pallets/subtensor/src/uids.rs index 9c865a4ad..8632ad4d3 100644 --- a/pallets/subtensor/src/uids.rs +++ b/pallets/subtensor/src/uids.rs @@ -9,6 +9,8 @@ impl Pallet { SubnetworkN::::get(netuid) } + /// Returns a callback that sets the element at the given position to zero, doing nothing if the + /// position is out of bounds fn clear_element_at(position: u16) -> impl Fn(&mut Vec) where N: From,