diff --git a/pallets/subtensor/src/benchmarks.rs b/pallets/subtensor/src/benchmarks.rs index 8d35cd291..a7dd29fbb 100644 --- a/pallets/subtensor/src/benchmarks.rs +++ b/pallets/subtensor/src/benchmarks.rs @@ -388,6 +388,7 @@ reveal_weights { let version_key: u64 = 0; let uids: Vec = vec![0]; let weight_values: Vec = vec![10]; + let salt: Vec = vec![8]; let hotkey: T::AccountId = account("hot", 0, 1); let coldkey: T::AccountId = account("cold", 1, 2); @@ -421,9 +422,10 @@ reveal_weights { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); let _ = Subtensor::::commit_weights(::RuntimeOrigin::from(RawOrigin::Signed(hotkey.clone())), netuid, commit_hash); - }: reveal_weights(RawOrigin::Signed(hotkey.clone()), netuid, uids, weight_values, version_key) + }: reveal_weights(RawOrigin::Signed(hotkey.clone()), netuid, uids, weight_values, salt, version_key) } diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index a4dfcdbec..c8af548af 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1414,6 +1414,9 @@ pub mod pallet { /// * `values` (`Vec`): /// - The values of the weights being revealed. /// + /// * `salt` (`Vec`): + /// - The random salt to protect from brute-force guessing attack in case of small weight changes bit-wise. + /// /// * `version_key` (`u64`): /// - The network version key. /// @@ -1436,9 +1439,10 @@ pub mod pallet { netuid: u16, uids: Vec, values: Vec, + salt: Vec, version_key: u64, ) -> DispatchResult { - Self::do_reveal_weights(origin, netuid, uids, values, version_key) + Self::do_reveal_weights(origin, netuid, uids, values, salt, version_key) } /// # Args: diff --git a/pallets/subtensor/src/weights.rs b/pallets/subtensor/src/weights.rs index c7e31efd9..c21fe6bbd 100644 --- a/pallets/subtensor/src/weights.rs +++ b/pallets/subtensor/src/weights.rs @@ -60,6 +60,9 @@ impl Pallet { /// * `values` (`Vec`): /// - The values of the weights being revealed. /// + /// * `salt` (`Vec`): + /// - The values of the weights being revealed. + /// /// * `version_key` (`u64`): /// - The network version key. /// @@ -78,6 +81,7 @@ impl Pallet { netuid: u16, uids: Vec, values: Vec, + salt: Vec, version_key: u64, ) -> DispatchResult { let who = ensure_signed(origin.clone())?; @@ -103,6 +107,7 @@ impl Pallet { netuid, uids.clone(), values.clone(), + salt.clone(), version_key, )); ensure!(provided_hash == *commit_hash, Error::::InvalidReveal); diff --git a/pallets/subtensor/tests/weights.rs b/pallets/subtensor/tests/weights.rs index 57fc897d6..c4085c5d7 100644 --- a/pallets/subtensor/tests/weights.rs +++ b/pallets/subtensor/tests/weights.rs @@ -44,11 +44,12 @@ fn test_commit_weights_dispatch_info_ok() { let dests = vec![1, 1]; let weights = vec![1, 1]; let netuid: u16 = 1; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); let commit_hash: H256 = - BlakeTwo256::hash_of(&(hotkey, netuid, dests, weights, version_key)); + BlakeTwo256::hash_of(&(hotkey, netuid, dests, weights, salt, version_key)); let call = RuntimeCall::SubtensorModule(SubtensorCall::commit_weights { netuid, @@ -67,12 +68,14 @@ fn test_reveal_weights_dispatch_info_ok() { let dests = vec![1, 1]; let weights = vec![1, 1]; let netuid: u16 = 1; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let call = RuntimeCall::SubtensorModule(SubtensorCall::reveal_weights { netuid, uids: dests, values: weights, + salt, version_key, }); let dispatch_info = call.get_dispatch_info(); @@ -89,11 +92,12 @@ fn test_set_weights_is_root_error() { let uids = vec![0]; let weights = vec![1]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey = U256::from(1); assert_err!( - commit_reveal_set_weights(hotkey, root_netuid, uids, weights, version_key), + commit_reveal_set_weights(hotkey, root_netuid, uids, weights, salt, version_key), Error::::IsRoot ); }); @@ -116,9 +120,16 @@ fn test_weights_err_no_validator_permit() { let weights_keys: Vec = vec![1, 2]; let weight_values: Vec = vec![1, 2]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; - let result = - commit_reveal_set_weights(hotkey_account_id, netuid, weights_keys, weight_values, 0); + let result = commit_reveal_set_weights( + hotkey_account_id, + netuid, + weights_keys, + weight_values, + salt.clone(), + 0, + ); assert_eq!(result, Err(Error::::NoValidatorPermit.into())); let weights_keys: Vec = vec![1, 2]; @@ -127,8 +138,14 @@ fn test_weights_err_no_validator_permit() { SubtensorModule::get_uid_for_net_and_hotkey(netuid, &hotkey_account_id) .expect("Not registered."); SubtensorModule::set_validator_permit_for_uid(netuid, neuron_uid, true); - let result = - commit_reveal_set_weights(hotkey_account_id, netuid, weights_keys, weight_values, 0); + let result = commit_reveal_set_weights( + hotkey_account_id, + netuid, + weights_keys, + weight_values, + salt, + 0, + ); assert_ok!(result); }); } @@ -144,6 +161,7 @@ fn test_set_weights_min_stake_failed() { let version_key: u64 = 0; let hotkey = U256::from(0); let coldkey = U256::from(0); + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, 0, 0); register_ok_neuron(netuid, hotkey, coldkey, 2143124); SubtensorModule::set_weights_min_stake(20_000_000_000_000); @@ -159,7 +177,14 @@ fn test_set_weights_min_stake_failed() { // Check that it fails at the pallet level. SubtensorModule::set_weights_min_stake(100_000_000_000_000); assert_eq!( - commit_reveal_set_weights(hotkey, netuid, dests.clone(), weights.clone(), version_key), + commit_reveal_set_weights( + hotkey, + netuid, + dests.clone(), + weights.clone(), + salt.clone(), + version_key + ), Err(Error::::NotEnoughStakeToSetWeights.into()) ); // Now passes @@ -169,6 +194,7 @@ fn test_set_weights_min_stake_failed() { netuid, dests.clone(), weights.clone(), + salt.clone(), version_key )); }); @@ -182,6 +208,7 @@ fn test_weights_version_key() { let coldkey = U256::from(66); let netuid0: u16 = 1; let netuid1: u16 = 2; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid0, 0, 0); add_network(netuid1, 0, 0); register_ok_neuron(netuid0, hotkey, coldkey, 2143124); @@ -194,6 +221,7 @@ fn test_weights_version_key() { netuid0, weights_keys.clone(), weight_values.clone(), + salt.clone(), 0 )); assert_ok!(commit_reveal_set_weights( @@ -201,6 +229,7 @@ fn test_weights_version_key() { netuid1, weights_keys.clone(), weight_values.clone(), + salt.clone(), 0 )); @@ -216,6 +245,7 @@ fn test_weights_version_key() { netuid0, weights_keys.clone(), weight_values.clone(), + salt.clone(), key0 )); assert_ok!(commit_reveal_set_weights( @@ -223,6 +253,7 @@ fn test_weights_version_key() { netuid1, weights_keys.clone(), weight_values.clone(), + salt.clone(), key1 )); @@ -232,6 +263,7 @@ fn test_weights_version_key() { netuid0, weights_keys.clone(), weight_values.clone(), + salt.clone(), key1 )); @@ -243,6 +275,7 @@ fn test_weights_version_key() { netuid1, weights_keys.clone(), weight_values.clone(), + salt.clone(), key0 ), Err(Error::::IncorrectNetworkVersionKey.into()) @@ -312,6 +345,7 @@ fn test_weights_err_weights_vec_not_equal_size() { let hotkey_account_id = U256::from(55); let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); register_ok_neuron(1, hotkey_account_id, U256::from(66), 0); let neuron_uid: u16 = @@ -325,6 +359,7 @@ fn test_weights_err_weights_vec_not_equal_size() { 1, weights_keys.clone(), weight_values.clone(), + salt.clone(), 0, ); assert_eq!(result, Err(Error::::WeightVecNotEqualSize.into())); @@ -338,6 +373,7 @@ fn test_weights_err_has_duplicate_ids() { let hotkey_account_id = U256::from(666); let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); SubtensorModule::set_max_allowed_uids(netuid, 100); // Allow many registrations per block. @@ -374,6 +410,7 @@ fn test_weights_err_has_duplicate_ids() { netuid, weights_keys.clone(), weight_values.clone(), + salt.clone(), 0, ); assert_eq!(result, Err(Error::::DuplicateUids.into())); @@ -388,6 +425,7 @@ fn test_weights_err_max_weight_limit() { // Add network. let netuid: u16 = 1; let tempo: u16 = 100; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); // Set params. @@ -448,13 +486,20 @@ fn test_weights_err_max_weight_limit() { // Non self-weight fails. let uids: Vec = vec![1, 2, 3, 4]; let values: Vec = vec![u16::MAX / 4, u16::MAX / 4, u16::MAX / 54, u16::MAX / 4]; - let result = commit_reveal_set_weights(U256::from(0), 1, uids, values, 0); + let result = commit_reveal_set_weights(U256::from(0), 1, uids, values, salt.clone(), 0); assert_eq!(result, Err(Error::::MaxWeightExceeded.into())); // Self-weight is a success. let uids: Vec = vec![0]; // Self. let values: Vec = vec![u16::MAX]; // normalizes to u32::MAX - assert_ok!(commit_reveal_set_weights(U256::from(0), 1, uids, values, 0)); + assert_ok!(commit_reveal_set_weights( + U256::from(0), + 1, + uids, + values, + salt.clone(), + 0 + )); }); } @@ -475,6 +520,7 @@ fn test_set_weights_err_not_active() { new_test_ext(0).execute_with(|| { let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); // Register one neuron. Should have uid 0 @@ -485,7 +531,8 @@ fn test_set_weights_err_not_active() { let weights_keys: Vec = vec![0]; // Uid 0 is valid. let weight_values: Vec = vec![1]; // This hotkey is NOT registered. - let result = commit_reveal_set_weights(U256::from(1), 1, weights_keys, weight_values, 0); + let result = + commit_reveal_set_weights(U256::from(1), 1, weights_keys, weight_values, salt, 0); assert_eq!(result, Err(Error::::NotRegistered.into())); }); } @@ -497,6 +544,7 @@ fn test_set_weights_err_invalid_uid() { let hotkey_account_id = U256::from(55); let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); register_ok_neuron(1, hotkey_account_id, U256::from(66), 0); let neuron_uid: u16 = @@ -505,7 +553,8 @@ fn test_set_weights_err_invalid_uid() { SubtensorModule::set_validator_permit_for_uid(netuid, neuron_uid, true); let weight_keys: Vec = vec![9999]; // Does not exist let weight_values: Vec = vec![88]; // random value - let result = commit_reveal_set_weights(hotkey_account_id, 1, weight_keys, weight_values, 0); + let result = + commit_reveal_set_weights(hotkey_account_id, 1, weight_keys, weight_values, salt, 0); assert_eq!(result, Err(Error::::InvalidUid.into())); }); } @@ -516,6 +565,7 @@ fn test_set_weight_not_enough_values() { new_test_ext(0).execute_with(|| { let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let account_id = U256::from(1); add_network(netuid, tempo, 0); @@ -531,7 +581,8 @@ fn test_set_weight_not_enough_values() { // Should fail because we are only setting a single value and its not the self weight. let weight_keys: Vec = vec![1]; // not weight. let weight_values: Vec = vec![88]; // random value. - let result = commit_reveal_set_weights(account_id, 1, weight_keys, weight_values, 0); + let result = + commit_reveal_set_weights(account_id, 1, weight_keys, weight_values, salt.clone(), 0); assert_eq!(result, Err(Error::::NotSettingEnoughWeights.into())); // Shouldnt fail because we setting a single value but it is the self weight. @@ -542,6 +593,7 @@ fn test_set_weight_not_enough_values() { 1, weight_keys, weight_values, + salt.clone(), 0 )); @@ -554,6 +606,7 @@ fn test_set_weight_not_enough_values() { 1, weight_keys, weight_values, + salt, 0 )); }); @@ -565,6 +618,7 @@ fn test_set_weight_too_many_uids() { new_test_ext(0).execute_with(|| { let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); register_ok_neuron(1, U256::from(1), U256::from(2), 100_000); @@ -579,7 +633,14 @@ fn test_set_weight_too_many_uids() { // Should fail because we are setting more weights than there are neurons. let weight_keys: Vec = vec![0, 1, 2, 3, 4]; // more uids than neurons in subnet. let weight_values: Vec = vec![88, 102, 303, 1212, 11]; // random value. - let result = commit_reveal_set_weights(U256::from(1), 1, weight_keys, weight_values, 0); + let result = commit_reveal_set_weights( + U256::from(1), + 1, + weight_keys, + weight_values, + salt.clone(), + 0, + ); assert_eq!(result, Err(Error::::TooManyUids.into())); // Shouldnt fail because we are setting less weights than there are neurons. @@ -590,6 +651,7 @@ fn test_set_weight_too_many_uids() { 1, weight_keys, weight_values, + salt, 0 )); }); @@ -601,6 +663,7 @@ fn test_set_weights_sum_larger_than_u16_max() { new_test_ext(0).execute_with(|| { let netuid: u16 = 1; let tempo: u16 = 13; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; add_network(netuid, tempo, 0); register_ok_neuron(1, U256::from(1), U256::from(2), 100_000); @@ -618,7 +681,8 @@ fn test_set_weights_sum_larger_than_u16_max() { // sum of weights is larger than u16 max. assert!(weight_values.iter().map(|x| *x as u64).sum::() > (u16::MAX as u64)); - let result = commit_reveal_set_weights(U256::from(1), 1, weight_keys, weight_values, 0); + let result = + commit_reveal_set_weights(U256::from(1), 1, weight_keys, weight_values, salt, 0); assert_ok!(result); // Get max-upscaled unnormalized weights. @@ -998,6 +1062,7 @@ fn test_commit_reveal_weights_ok() { let netuid: u16 = 1; let uids: Vec = vec![0, 1]; let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); @@ -1006,6 +1071,7 @@ fn test_commit_reveal_weights_ok() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1032,6 +1098,7 @@ fn test_commit_reveal_weights_ok() { netuid, uids, weight_values, + salt, version_key, )); }); @@ -1043,6 +1110,7 @@ fn test_commit_reveal_interval() { let netuid: u16 = 1; let uids: Vec = vec![0, 1]; let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); @@ -1051,6 +1119,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1080,6 +1149,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::InvalidRevealTempo @@ -1095,6 +1165,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::InvalidRevealTempo @@ -1105,6 +1176,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); assert_ok!(SubtensorModule::commit_weights( @@ -1118,6 +1190,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::InvalidRevealTempo @@ -1128,6 +1201,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1144,6 +1218,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::InvalidRevealTempo @@ -1161,6 +1236,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key + 1, )); assert_ok!(SubtensorModule::commit_weights( @@ -1175,6 +1251,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::InvalidReveal @@ -1184,6 +1261,7 @@ fn test_commit_reveal_interval() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key + 1, )); }); @@ -1195,6 +1273,7 @@ fn test_commit_reveal_hash() { let netuid: u16 = 1; let uids: Vec = vec![0, 1]; let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); @@ -1213,6 +1292,7 @@ fn test_commit_reveal_hash() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1230,6 +1310,7 @@ fn test_commit_reveal_hash() { netuid, vec![0, 2], weight_values.clone(), + salt.clone(), version_key ), Error::::InvalidReveal @@ -1240,6 +1321,7 @@ fn test_commit_reveal_hash() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), 7, ), Error::::InvalidReveal @@ -1250,6 +1332,7 @@ fn test_commit_reveal_hash() { netuid, uids.clone(), vec![10, 9], + salt.clone(), version_key, ), Error::::InvalidReveal @@ -1260,6 +1343,7 @@ fn test_commit_reveal_hash() { netuid, vec![0, 1, 2], vec![10, 10, 33], + salt.clone(), 9, ), Error::::InvalidReveal @@ -1270,6 +1354,7 @@ fn test_commit_reveal_hash() { netuid, uids, weight_values, + salt.clone(), version_key, )); }); @@ -1281,6 +1366,7 @@ fn test_commit_reveal_disabled_or_enabled() { let netuid: u16 = 1; let uids: Vec = vec![0, 1]; let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); @@ -1289,6 +1375,7 @@ fn test_commit_reveal_disabled_or_enabled() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1315,6 +1402,7 @@ fn test_commit_reveal_disabled_or_enabled() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::CommitRevealDisabled @@ -1336,6 +1424,7 @@ fn test_commit_reveal_disabled_or_enabled() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, ), Error::::CommitRevealDisabled @@ -1357,6 +1446,7 @@ fn test_commit_reveal_disabled_or_enabled() { netuid, uids, weight_values, + salt.clone(), version_key, )); }); @@ -1368,6 +1458,7 @@ fn test_toggle_commit_reveal_weights_and_set_weights() { let netuid: u16 = 1; let uids: Vec = vec![0, 1]; let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; let version_key: u64 = 0; let hotkey: U256 = U256::from(1); @@ -1376,6 +1467,7 @@ fn test_toggle_commit_reveal_weights_and_set_weights() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1418,6 +1510,7 @@ fn test_toggle_commit_reveal_weights_and_set_weights() { netuid, uids.clone(), weight_values.clone(), + salt.clone(), version_key, )); @@ -1438,19 +1531,78 @@ fn test_toggle_commit_reveal_weights_and_set_weights() { }); } +#[test] +fn test_commit_reveal_bad_salt_fail() { + new_test_ext(1).execute_with(|| { + let netuid: u16 = 1; + let uids: Vec = vec![0, 1]; + let weight_values: Vec = vec![10, 10]; + let salt: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8]; + let bad_salt: Vec = vec![0, 2, 3, 4, 5, 6, 7, 8]; + let version_key: u64 = 0; + let hotkey: U256 = U256::from(1); + + let commit_hash: H256 = BlakeTwo256::hash_of(&( + hotkey, + netuid, + uids.clone(), + weight_values.clone(), + salt.clone(), + version_key, + )); + + add_network(netuid, 0, 0); + register_ok_neuron(netuid, U256::from(3), U256::from(4), 300000); + register_ok_neuron(netuid, U256::from(1), U256::from(2), 100000); + SubtensorModule::set_weights_set_rate_limit(netuid, 5); + SubtensorModule::set_validator_permit_for_uid(netuid, 0, true); + SubtensorModule::set_validator_permit_for_uid(netuid, 1, true); + + SubtensorModule::set_commit_reveal_weights_interval(netuid, 5); + SubtensorModule::set_commit_reveal_weights_enabled(netuid, true); + + assert_ok!(SubtensorModule::commit_weights( + RuntimeOrigin::signed(hotkey), + netuid, + commit_hash + )); + + step_block(5); + + assert_err!( + SubtensorModule::reveal_weights( + RuntimeOrigin::signed(hotkey), + netuid, + uids.clone(), + weight_values.clone(), + bad_salt.clone(), + version_key, + ), + Error::::InvalidReveal + ); + }); +} + fn commit_reveal_set_weights( hotkey: U256, netuid: u16, uids: Vec, weights: Vec, + salt: Vec, version_key: u64, ) -> DispatchResult { SubtensorModule::set_commit_reveal_weights_interval(netuid, 5); SubtensorModule::set_weights_set_rate_limit(netuid, 5); SubtensorModule::set_commit_reveal_weights_enabled(netuid, true); - let commit_hash: H256 = - BlakeTwo256::hash_of(&(hotkey, netuid, uids.clone(), weights.clone(), version_key)); + let commit_hash: H256 = BlakeTwo256::hash_of(&( + hotkey, + netuid, + uids.clone(), + weights.clone(), + salt.clone(), + version_key, + )); SubtensorModule::commit_weights(RuntimeOrigin::signed(hotkey), netuid, commit_hash)?; @@ -1461,6 +1613,7 @@ fn commit_reveal_set_weights( netuid, uids, weights, + salt, version_key, )?;