Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

respect chk for set weights min stake filter #935

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions pallets/subtensor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1299,7 +1299,7 @@ pub mod pallet {
/// Returns the transaction priority for setting weights.
pub fn get_priority_set_weights(hotkey: &T::AccountId, netuid: u16) -> u64 {
if let Ok(uid) = Self::get_uid_for_net_and_hotkey(netuid, hotkey) {
let _stake = Self::get_total_stake_for_hotkey(hotkey);
let _stake = Self::get_stake_for_hotkey_on_subnet(hotkey, netuid);
let current_block_number: u64 = Self::get_current_block_as_u64();
let default_priority: u64 =
current_block_number.saturating_sub(Self::get_last_update_for_uid(netuid, uid));
Expand All @@ -1309,9 +1309,9 @@ pub mod pallet {
}

/// Is the caller allowed to set weights
pub fn check_weights_min_stake(hotkey: &T::AccountId) -> bool {
pub fn check_weights_min_stake(hotkey: &T::AccountId, netuid: u16) -> bool {
// Blacklist weights transactions for low stake peers.
Self::get_total_stake_for_hotkey(hotkey) >= Self::get_weights_min_stake()
Self::get_stake_for_hotkey_on_subnet(hotkey, netuid) >= Self::get_weights_min_stake()
}

/// Helper function to check if register is allowed
Expand Down Expand Up @@ -1404,8 +1404,8 @@ where
Pallet::<T>::get_priority_set_weights(who, netuid)
}

pub fn check_weights_min_stake(who: &T::AccountId) -> bool {
Pallet::<T>::check_weights_min_stake(who)
pub fn check_weights_min_stake(who: &T::AccountId, netuid: u16) -> bool {
Pallet::<T>::check_weights_min_stake(who, netuid)
}
}

Expand Down Expand Up @@ -1443,7 +1443,7 @@ where
) -> TransactionValidity {
match call.is_sub_type() {
Some(Call::commit_weights { netuid, .. }) => {
if Self::check_weights_min_stake(who) {
if Self::check_weights_min_stake(who, *netuid) {
let priority: u64 = Self::get_priority_set_weights(who, *netuid);
Ok(ValidTransaction {
priority,
Expand All @@ -1455,7 +1455,7 @@ where
}
}
Some(Call::reveal_weights { netuid, .. }) => {
if Self::check_weights_min_stake(who) {
if Self::check_weights_min_stake(who, *netuid) {
let priority: u64 = Self::get_priority_set_weights(who, *netuid);
Ok(ValidTransaction {
priority,
Expand All @@ -1467,7 +1467,7 @@ where
}
}
Some(Call::batch_reveal_weights { netuid, .. }) => {
if Self::check_weights_min_stake(who) {
if Self::check_weights_min_stake(who, *netuid) {
let priority: u64 = Self::get_priority_set_weights(who, *netuid);
Ok(ValidTransaction {
priority,
Expand All @@ -1479,7 +1479,7 @@ where
}
}
Some(Call::set_weights { netuid, .. }) => {
if Self::check_weights_min_stake(who) {
if Self::check_weights_min_stake(who, *netuid) {
let priority: u64 = Self::get_priority_set_weights(who, *netuid);
Ok(ValidTransaction {
priority,
Expand All @@ -1491,7 +1491,7 @@ where
}
}
Some(Call::set_root_weights { netuid, hotkey, .. }) => {
if Self::check_weights_min_stake(hotkey) {
if Self::check_weights_min_stake(hotkey, *netuid) {
let priority: u64 = Self::get_priority_set_weights(hotkey, *netuid);
Ok(ValidTransaction {
priority,
Expand Down
2 changes: 1 addition & 1 deletion pallets/subtensor/src/subnets/uids.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ impl<T: Config> Pallet<T> {
///
pub fn get_stake_for_uid_and_subnetwork(netuid: u16, neuron_uid: u16) -> u64 {
if let Ok(hotkey) = Self::get_hotkey_for_net_and_uid(netuid, neuron_uid) {
Self::get_total_stake_for_hotkey(&hotkey)
Self::get_stake_for_hotkey_on_subnet(&hotkey, netuid)
} else {
0
}
Expand Down
4 changes: 2 additions & 2 deletions pallets/subtensor/src/subnets/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -525,9 +525,9 @@ impl<T: Config> Pallet<T> {
Error::<T>::HotKeyNotRegisteredInSubNet
);

// --- 6. Check to see if the hotkey has enought stake to set weights.
// --- 6. Check to see if the hotkey has enough stake to set weights.
ensure!(
Self::get_total_stake_for_hotkey(&hotkey) >= Self::get_weights_min_stake(),
Self::check_weights_min_stake(&hotkey, netuid),
Error::<T>::NotEnoughStakeToSetWeights
);

Expand Down
191 changes: 191 additions & 0 deletions pallets/subtensor/tests/children.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3237,3 +3237,194 @@ fn test_rank_trust_incentive_calculation_with_parent_child() {

});
}

// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --test children -- test_childkey_set_weights_single_parent --exact --nocapture
#[test]
fn test_childkey_set_weights_single_parent() {
new_test_ext(1).execute_with(|| {
let netuid: u16 = 1;
add_network(netuid, 1, 0);

// Define hotkeys
let parent: U256 = U256::from(1);
let child: U256 = U256::from(2);
let weight_setter: U256 = U256::from(3);

// Define coldkeys with more readable names
let coldkey_parent: U256 = U256::from(100);
let coldkey_child: U256 = U256::from(101);
let coldkey_weight_setter: U256 = U256::from(102);

let stake_to_give_child = 109_999;

// Register parent with minimal stake and child with high stake
SubtensorModule::add_balance_to_coldkey_account(&coldkey_parent, 1);
SubtensorModule::add_balance_to_coldkey_account(&coldkey_child, stake_to_give_child + 10);
SubtensorModule::add_balance_to_coldkey_account(&coldkey_weight_setter, 1_000_000);

// Add neurons for parent, child and weight_setter
register_ok_neuron(netuid, parent, coldkey_parent, 1);
register_ok_neuron(netuid, child, coldkey_child, 1);
register_ok_neuron(netuid, weight_setter, coldkey_weight_setter, 1);

SubtensorModule::increase_stake_on_coldkey_hotkey_account(
&coldkey_parent,
&parent,
stake_to_give_child,
);
SubtensorModule::increase_stake_on_coldkey_hotkey_account(
&coldkey_weight_setter,
&weight_setter,
1_000_000,
);

SubtensorModule::set_weights_set_rate_limit(netuid, 0);

// Set parent-child relationship
assert_ok!(SubtensorModule::do_set_children(
RuntimeOrigin::signed(coldkey_parent),
parent,
netuid,
vec![(u64::MAX, child)]
));
step_block(7200 + 1);
// Set weights on the child using the weight_setter account
let origin = RuntimeOrigin::signed(weight_setter);
let uids: Vec<u16> = vec![1]; // Only set weight for the child (UID 1)
let values: Vec<u16> = vec![u16::MAX]; // Use maximum value for u16
let version_key = SubtensorModule::get_weights_version_key(netuid);
assert_ok!(SubtensorModule::set_weights(
origin,
netuid,
uids.clone(),
values.clone(),
version_key
));

// Set the min stake very high
SubtensorModule::set_weights_min_stake(stake_to_give_child * 5);

// Check the child has less stake than required
assert!(
SubtensorModule::get_stake_for_hotkey_on_subnet(&child, netuid)
< SubtensorModule::get_weights_min_stake()
);

// Check the child cannot set weights
assert_noop!(
SubtensorModule::set_weights(
RuntimeOrigin::signed(child),
netuid,
uids.clone(),
values.clone(),
version_key
),
Error::<Test>::NotEnoughStakeToSetWeights
);

assert!(!SubtensorModule::check_weights_min_stake(&child, netuid));

// Set a minimum stake to set weights
SubtensorModule::set_weights_min_stake(stake_to_give_child - 5);

// Check if the stake for the child is above
assert!(
SubtensorModule::get_stake_for_hotkey_on_subnet(&child, netuid)
>= SubtensorModule::get_weights_min_stake()
);

// Check the child can set weights
assert_ok!(SubtensorModule::set_weights(
RuntimeOrigin::signed(child),
netuid,
uids,
values,
version_key
));

assert!(SubtensorModule::check_weights_min_stake(&child, netuid));
});
}

// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --test children -- test_set_weights_no_parent --exact --nocapture
#[test]
fn test_set_weights_no_parent() {
// Verify that a regular key without a parent delegation is effected by the minimum stake requirements
new_test_ext(1).execute_with(|| {
let netuid: u16 = 1;
add_network(netuid, 1, 0);

let hotkey: U256 = U256::from(2);
let spare_hk: U256 = U256::from(3);

let coldkey: U256 = U256::from(101);
let spare_ck = U256::from(102);

let stake_to_give_child = 109_999;

SubtensorModule::add_balance_to_coldkey_account(&coldkey, stake_to_give_child + 10);

// Is registered
register_ok_neuron(netuid, hotkey, coldkey, 1);
// Register a spare key
register_ok_neuron(netuid, spare_hk, spare_ck, 1);

SubtensorModule::increase_stake_on_coldkey_hotkey_account(
&coldkey,
&hotkey,
stake_to_give_child,
);

SubtensorModule::set_weights_set_rate_limit(netuid, 0);

// Has stake and no parent
step_block(7200 + 1);

let uids: Vec<u16> = vec![1]; // Set weights on the other hotkey
let values: Vec<u16> = vec![u16::MAX]; // Use maximum value for u16
let version_key = SubtensorModule::get_weights_version_key(netuid);

// Set the min stake very high
SubtensorModule::set_weights_min_stake(stake_to_give_child * 5);

// Check the key has less stake than required
assert!(
SubtensorModule::get_stake_for_hotkey_on_subnet(&hotkey, netuid)
< SubtensorModule::get_weights_min_stake()
);

// Check the hotkey cannot set weights
assert_noop!(
SubtensorModule::set_weights(
RuntimeOrigin::signed(hotkey),
netuid,
uids.clone(),
values.clone(),
version_key
),
Error::<Test>::NotEnoughStakeToSetWeights
);

assert!(!SubtensorModule::check_weights_min_stake(&hotkey, netuid));

// Set a minimum stake to set weights
SubtensorModule::set_weights_min_stake(stake_to_give_child - 5);

// Check if the stake for the hotkey is above
assert!(
SubtensorModule::get_stake_for_hotkey_on_subnet(&hotkey, netuid)
>= SubtensorModule::get_weights_min_stake()
);

// Check the hotkey can set weights
assert_ok!(SubtensorModule::set_weights(
RuntimeOrigin::signed(hotkey),
netuid,
uids,
values,
version_key
));

assert!(SubtensorModule::check_weights_min_stake(&hotkey, netuid));
});
}
6 changes: 3 additions & 3 deletions pallets/subtensor/tests/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,11 +481,11 @@ fn test_set_weights_min_stake_failed() {

// Check the signed extension function.
assert_eq!(SubtensorModule::get_weights_min_stake(), 20_000_000_000_000);
assert!(!SubtensorModule::check_weights_min_stake(&hotkey));
assert!(!SubtensorModule::check_weights_min_stake(&hotkey, netuid));
SubtensorModule::increase_stake_on_hotkey_account(&hotkey, 19_000_000_000_000);
assert!(!SubtensorModule::check_weights_min_stake(&hotkey));
assert!(!SubtensorModule::check_weights_min_stake(&hotkey, netuid));
SubtensorModule::increase_stake_on_hotkey_account(&hotkey, 20_000_000_000_000);
assert!(SubtensorModule::check_weights_min_stake(&hotkey));
assert!(SubtensorModule::check_weights_min_stake(&hotkey, netuid));

// Check that it fails at the pallet level.
SubtensorModule::set_weights_min_stake(100_000_000_000_000);
Expand Down
Loading