diff --git a/pallets/subtensor/src/macros/hooks.rs b/pallets/subtensor/src/macros/hooks.rs index 7b2d1c5ea3..90ca36104c 100644 --- a/pallets/subtensor/src/macros/hooks.rs +++ b/pallets/subtensor/src/macros/hooks.rs @@ -91,7 +91,9 @@ mod hooks { // Set subtoken enabled for all existed subnets .saturating_add(migrations::migrate_set_subtoken_enabled::migrate_set_subtoken_enabled::()) // Remove all entries in TotalHotkeyColdkeyStakesThisInterval - .saturating_add(migrations::migrate_remove_total_hotkey_coldkey_stakes_this_interval::migrate_remove_total_hotkey_coldkey_stakes_this_interval::()); + .saturating_add(migrations::migrate_remove_total_hotkey_coldkey_stakes_this_interval::migrate_remove_total_hotkey_coldkey_stakes_this_interval::()) + // Remove unused root values from yuma maps + .saturating_add(migrations::migrate_remove_unused_root_values::migrate_remove_unused_root_values::()); weight } diff --git a/pallets/subtensor/src/migrations/migrate_remove_unused_root_values.rs b/pallets/subtensor/src/migrations/migrate_remove_unused_root_values.rs new file mode 100644 index 0000000000..56b0b0d77e --- /dev/null +++ b/pallets/subtensor/src/migrations/migrate_remove_unused_root_values.rs @@ -0,0 +1,47 @@ +use super::*; +use crate::HasMigrationRun; +use frame_support::{traits::Get, weights::Weight}; +use scale_info::prelude::string::String; + +pub fn migrate_remove_unused_root_values() -> Weight { + let migration_name = b"migrate_remove_unused_root_values".to_vec(); + let mut weight = T::DbWeight::get().reads(1); + + if HasMigrationRun::::get(&migration_name) { + log::info!( + "Migration '{:?}' has already run. Skipping.", + migration_name + ); + return weight; + } + + log::info!( + "Running migration '{}'", + String::from_utf8_lossy(&migration_name) + ); + + let netuid = 0; + + Incentive::::remove(netuid); + Dividends::::remove(netuid); + Rank::::remove(netuid); + Trust::::remove(netuid); + ValidatorTrust::::remove(netuid); + ValidatorPermit::::remove(netuid); + Consensus::::remove(netuid); + StakeWeight::::remove(netuid); + Active::::remove(netuid); + Emission::::remove(netuid); + PruningScores::::remove(netuid); + + // Mark Migration as Completed + HasMigrationRun::::insert(&migration_name, true); + weight = weight.saturating_add(T::DbWeight::get().writes(12)); + + log::info!( + "Migration '{:?}' completed successfully.", + String::from_utf8_lossy(&migration_name) + ); + + weight +} diff --git a/pallets/subtensor/src/migrations/mod.rs b/pallets/subtensor/src/migrations/mod.rs index 39f9cd428a..6a0a798e9f 100644 --- a/pallets/subtensor/src/migrations/mod.rs +++ b/pallets/subtensor/src/migrations/mod.rs @@ -12,6 +12,7 @@ pub mod migrate_rao; pub mod migrate_remove_stake_map; pub mod migrate_remove_total_hotkey_coldkey_stakes_this_interval; pub mod migrate_remove_unused_maps_and_values; +pub mod migrate_remove_unused_root_values; pub mod migrate_remove_zero_total_hotkey_alpha; pub mod migrate_set_first_emission_block_number; pub mod migrate_set_min_burn; diff --git a/pallets/subtensor/src/tests/migration.rs b/pallets/subtensor/src/tests/migration.rs index 048217277a..a59046772c 100644 --- a/pallets/subtensor/src/tests/migration.rs +++ b/pallets/subtensor/src/tests/migration.rs @@ -617,3 +617,57 @@ fn test_migrate_remove_total_hotkey_coldkey_stakes_this_interval() { assert!(!weight.is_zero(),"Migration weight should be non-zero."); }); } + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::migration::test_migrate_remove_unused_root_values --exact --show-output +#[test] +fn test_migrate_remove_unused_root_values() { + new_test_ext(1).execute_with(|| { + const MIGRATION_NAME: &str = "migrate_remove_unused_root_values"; + + // Some test data + let test_u16 = vec![u16::MAX; 64]; + let test_u64 = vec![1_000_000_u64; 64]; + let test_bool = vec![true; 64]; + + // Set up entries to be deleted. + let netuid = 0; + Incentive::::insert(netuid, test_u16.clone()); + Dividends::::insert(netuid, test_u16.clone()); + Rank::::insert(netuid, test_u16.clone()); + Trust::::insert(netuid, test_u16.clone()); + ValidatorTrust::::insert(netuid, test_u16.clone()); + ValidatorPermit::::insert(netuid, test_bool.clone()); + Consensus::::insert(netuid, test_u16.clone()); + StakeWeight::::insert(netuid, test_u16.clone()); + Active::::insert(netuid, test_bool.clone()); + Emission::::insert(netuid, test_u64.clone()); + PruningScores::::insert(netuid, test_u16.clone()); + + assert!( + !HasMigrationRun::::get(MIGRATION_NAME.as_bytes().to_vec()), + "Migration should not have run yet." + ); + + // Run migration + let weight = crate::migrations::migrate_remove_unused_root_values::migrate_remove_unused_root_values::(); + + // Verify storage is cleared + assert_eq!(Incentive::::get(netuid).len(), 0); + assert_eq!(Dividends::::get(netuid).len(), 0); + assert_eq!(Rank::::get(netuid).len(), 0); + assert_eq!(Trust::::get(netuid).len(), 0); + assert_eq!(ValidatorTrust::::get(netuid).len(), 0); + assert_eq!(ValidatorPermit::::get(netuid).len(), 0); + assert_eq!(Consensus::::get(netuid).len(), 0); + assert_eq!(StakeWeight::::get(netuid).len(), 0); + assert_eq!(Active::::get(netuid).len(), 0); + assert_eq!(Emission::::get(netuid).len(), 0); + assert_eq!(PruningScores::::get(netuid).len(), 0); + + assert!( + HasMigrationRun::::get(MIGRATION_NAME.as_bytes().to_vec()), + "Migration should be marked as run." + ); + assert!(!weight.is_zero(),"Migration weight should be non-zero."); + }); +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 94f7aadceb..130c8ba90d 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -207,7 +207,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 262, + spec_version: 263, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1,