Skip to content

Commit 8642872

Browse files
reset neuron data on registration
1 parent 9b05314 commit 8642872

File tree

2 files changed

+82
-7
lines changed

2 files changed

+82
-7
lines changed

pallets/subtensor/src/subnets/uids.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ impl<T: Config> Pallet<T> {
88
SubnetworkN::<T>::get(netuid)
99
}
1010

11+
/// Sets value for the element at the given position if it exists.
12+
pub fn set_element_at<N>(vec: &mut [N], position: usize, value: N) {
13+
if let Some(element) = vec.get_mut(position) {
14+
*element = value;
15+
}
16+
}
17+
18+
/// Resets the trust, emission, consensus, incentive, dividends of the neuron to default
19+
pub fn clear_neuron(netuid: u16, neuron_uid: u16) {
20+
let neuron_index: usize = neuron_uid.into();
21+
Emission::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
22+
Trust::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
23+
Consensus::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
24+
Incentive::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
25+
Dividends::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
26+
}
27+
1128
/// Replace the neuron under this uid.
1229
pub fn replace_neuron(
1330
netuid: u16,
@@ -40,6 +57,12 @@ impl<T: Config> Pallet<T> {
4057

4158
// 4. Clear neuron certificates
4259
NeuronCertificates::<T>::remove(netuid, old_hotkey.clone());
60+
61+
// 5. Reset new neuron's values.
62+
Self::clear_neuron(netuid, uid_to_replace);
63+
64+
// 5a. reset axon info for the new uid.
65+
Axons::<T>::remove(netuid, old_hotkey);
4366
}
4467

4568
/// Appends the uid to the network.

pallets/subtensor/src/tests/uids.rs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,55 @@ fn test_replace_neuron() {
5050
// Get UID
5151
let neuron_uid = SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id);
5252
assert_ok!(neuron_uid);
53+
let neuron_uid = neuron_uid.unwrap();
54+
55+
// set non-default values
56+
Trust::<Test>::mutate(netuid, |v| {
57+
SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16)
58+
});
59+
Emission::<Test>::mutate(netuid, |v| {
60+
SubtensorModule::set_element_at(v, neuron_uid as usize, 5u64)
61+
});
62+
Consensus::<Test>::mutate(netuid, |v| {
63+
SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16)
64+
});
65+
Incentive::<Test>::mutate(netuid, |v| {
66+
SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16)
67+
});
68+
Dividends::<Test>::mutate(netuid, |v| {
69+
SubtensorModule::set_element_at(v, neuron_uid as usize, 5u16)
70+
});
71+
72+
// serve axon mock address
73+
let ip: u128 = 1676056785;
74+
let port: u16 = 9999;
75+
let ip_type: u8 = 4;
76+
assert!(SubtensorModule::serve_axon(
77+
<<Test as Config>::RuntimeOrigin>::signed(hotkey_account_id),
78+
netuid,
79+
0,
80+
ip,
81+
port,
82+
ip_type,
83+
0,
84+
0,
85+
0
86+
)
87+
.is_ok());
5388

5489
// Set a neuron certificate for it
5590
NeuronCertificates::<Test>::insert(netuid, hotkey_account_id, certificate);
5691

5792
// Replace the neuron.
58-
SubtensorModule::replace_neuron(
59-
netuid,
60-
neuron_uid.unwrap(),
61-
&new_hotkey_account_id,
62-
block_number,
63-
);
93+
SubtensorModule::replace_neuron(netuid, neuron_uid, &new_hotkey_account_id, block_number);
6494

6595
// Check old hotkey is not registered on any network.
6696
assert!(SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id).is_err());
6797
assert!(!SubtensorModule::is_hotkey_registered_on_any_network(
6898
&hotkey_account_id
6999
));
70100

71-
let curr_hotkey = SubtensorModule::get_hotkey_for_net_and_uid(netuid, neuron_uid.unwrap());
101+
let curr_hotkey = SubtensorModule::get_hotkey_for_net_and_uid(netuid, neuron_uid);
72102
assert_ok!(curr_hotkey);
73103
assert_ne!(curr_hotkey.unwrap(), hotkey_account_id);
74104

@@ -84,6 +114,28 @@ fn test_replace_neuron() {
84114
// Check neuron certificate was reset
85115
let certificate = NeuronCertificates::<Test>::get(netuid, hotkey_account_id);
86116
assert_eq!(certificate, None);
117+
118+
// Check trust, emission, consensus, incentive, dividends have been reset to 0.
119+
assert_eq!(SubtensorModule::get_trust_for_uid(netuid, neuron_uid), 0);
120+
assert_eq!(SubtensorModule::get_emission_for_uid(netuid, neuron_uid), 0);
121+
assert_eq!(
122+
SubtensorModule::get_consensus_for_uid(netuid, neuron_uid),
123+
0
124+
);
125+
assert_eq!(
126+
SubtensorModule::get_incentive_for_uid(netuid, neuron_uid),
127+
0
128+
);
129+
assert_eq!(
130+
SubtensorModule::get_dividends_for_uid(netuid, neuron_uid),
131+
0
132+
);
133+
134+
// Check axon info is reset.
135+
let axon_info = SubtensorModule::get_axon_info(netuid, &curr_hotkey.unwrap());
136+
assert_eq!(axon_info.ip, 0);
137+
assert_eq!(axon_info.port, 0);
138+
assert_eq!(axon_info.ip_type, 0);
87139
});
88140
}
89141

0 commit comments

Comments
 (0)