From 864287295dff411feb1da1d846e0e8080a5f4cfd Mon Sep 17 00:00:00 2001 From: Andreea Popescu Date: Fri, 15 Nov 2024 13:53:56 +0000 Subject: [PATCH] reset neuron data on registration --- pallets/subtensor/src/subnets/uids.rs | 23 ++++++++++ pallets/subtensor/src/tests/uids.rs | 66 ++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/pallets/subtensor/src/subnets/uids.rs b/pallets/subtensor/src/subnets/uids.rs index afdbc0371e..6b1fa5c6bf 100644 --- a/pallets/subtensor/src/subnets/uids.rs +++ b/pallets/subtensor/src/subnets/uids.rs @@ -8,6 +8,23 @@ impl Pallet { SubnetworkN::::get(netuid) } + /// Sets value for the element at the given position if it exists. + pub fn set_element_at(vec: &mut [N], position: usize, value: N) { + if let Some(element) = vec.get_mut(position) { + *element = value; + } + } + + /// Resets the trust, emission, consensus, incentive, dividends of the neuron to default + pub fn clear_neuron(netuid: u16, neuron_uid: u16) { + let neuron_index: usize = neuron_uid.into(); + Emission::::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0)); + Trust::::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0)); + Consensus::::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0)); + Incentive::::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0)); + Dividends::::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0)); + } + /// Replace the neuron under this uid. pub fn replace_neuron( netuid: u16, @@ -40,6 +57,12 @@ impl Pallet { // 4. Clear neuron certificates NeuronCertificates::::remove(netuid, old_hotkey.clone()); + + // 5. Reset new neuron's values. + Self::clear_neuron(netuid, uid_to_replace); + + // 5a. reset axon info for the new uid. + Axons::::remove(netuid, old_hotkey); } /// Appends the uid to the network. diff --git a/pallets/subtensor/src/tests/uids.rs b/pallets/subtensor/src/tests/uids.rs index 9fdeca0416..b45a156a98 100644 --- a/pallets/subtensor/src/tests/uids.rs +++ b/pallets/subtensor/src/tests/uids.rs @@ -50,17 +50,47 @@ 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 + Trust::::mutate(netuid, |v| { + SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16) + }); + Emission::::mutate(netuid, |v| { + SubtensorModule::set_element_at(v, neuron_uid as usize, 5u64) + }); + Consensus::::mutate(netuid, |v| { + SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16) + }); + Incentive::::mutate(netuid, |v| { + SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16) + }); + Dividends::::mutate(netuid, |v| { + SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16) + }); + + // serve axon mock address + let ip: u128 = 1676056785; + let port: u16 = 9999; + let ip_type: u8 = 4; + assert!(SubtensorModule::serve_axon( + <::RuntimeOrigin>::signed(hotkey_account_id), + netuid, + 0, + ip, + port, + ip_type, + 0, + 0, + 0 + ) + .is_ok()); // Set a neuron certificate for it NeuronCertificates::::insert(netuid, hotkey_account_id, certificate); // 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); // Check old hotkey is not registered on any network. assert!(SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id).is_err()); @@ -68,7 +98,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); @@ -84,6 +114,28 @@ fn test_replace_neuron() { // Check neuron certificate was reset let certificate = NeuronCertificates::::get(netuid, hotkey_account_id); assert_eq!(certificate, None); + + // 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 + ); + + // 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); }); }