Skip to content

Commit

Permalink
Merge pull request #1060 from opentensor/devnet-ready
Browse files Browse the repository at this point in the history
bring in CR3 hotfix
  • Loading branch information
unconst authored Dec 4, 2024
2 parents 275bb51 + 7f5bd9d commit 55e754b
Show file tree
Hide file tree
Showing 16 changed files with 464 additions and 163 deletions.
5 changes: 3 additions & 2 deletions pallets/subtensor/src/coinbase/root.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,8 +301,9 @@ impl<T: Config> Pallet<T> {

/// Checks if registrations are allowed for a given subnet.
///
/// This function retrieves the subnet hyperparameters for the specified subnet and checks the `registration_allowed` flag.
/// If the subnet doesn't exist or doesn't have hyperparameters defined, it returns `false`.
/// This function retrieves the subnet hyperparameters for the specified subnet and checks the
/// `registration_allowed` flag. If the subnet doesn't exist or doesn't have hyperparameters
/// defined, it returns `false`.
///
/// # Arguments
///
Expand Down
31 changes: 15 additions & 16 deletions pallets/subtensor/src/coinbase/run_coinbase.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,30 @@ pub struct WeightsTlockPayload {
impl<T: Config> Pallet<T> {
/// The `coinbase` function performs a four-part emission distribution process involving
/// subnets, epochs, hotkeys, and nominators.
///
/// It is divided into several steps, each handling a specific part of the distribution:
///
/// Step 1: Compute the block-wise emission for each subnet.
/// This involves calculating how much (TAO) should be emitted into each subnet using the
/// root epoch function.
/// This involves calculating how much (TAO) should be emitted into each subnet using the root
/// epoch function.
///
/// Step 2: Accumulate the subnet block emission.
/// After calculating the block-wise emission, these values are accumulated to keep track
/// of how much each subnet should emit before the next distribution phase. This accumulation
/// is a running total that gets updated each block.
/// After calculating the block-wise emission, these values are accumulated to keep track of how
/// much each subnet should emit before the next distribution phase. This accumulation is a
/// running total that gets updated each block.
///
/// Step 3: Distribute the accumulated emissions through epochs.
/// Subnets periodically distribute their accumulated emissions to hotkeys (active validators/miners)
/// in the network on a `tempo` --- the time between epochs. This step runs Yuma consensus to
/// determine how emissions are split among hotkeys based on their contributions and roles.
/// The accumulation of hotkey emissions is done through the `accumulate_hotkey_emission` function.
/// The function splits the rewards for a hotkey amongst itself and its `parents`. The parents are
/// the hotkeys that are delegating their stake to the hotkey.
/// Subnets periodically distribute their accumulated emissions to hotkeys (active
/// validators/miners) in the network on a `tempo` --- the time between epochs. This step runs
/// Yuma consensus to determine how emissions are split among hotkeys based on their
/// contributions and roles. The accumulation of hotkey emissions is done through the
/// `accumulate_hotkey_emission` function. The function splits the rewards for a hotkey amongst
/// itself and its `parents`. The parents are the hotkeys that are delegating their stake to the
/// hotkey.
///
/// Step 4: Further distribute emissions from hotkeys to nominators.
/// Finally, the emissions received by hotkeys are further distributed to their nominators,
/// who are stakeholders that support the hotkeys.
/// Finally, the emissions received by hotkeys are further distributed to their nominators, who
/// are stakeholders that support the hotkeys.
pub fn run_coinbase() {
// --- 0. Get current block.
let current_block: u64 = Self::get_current_block_as_u64();
Expand Down Expand Up @@ -327,9 +329,6 @@ impl<T: Config> Pallet<T> {
);
continue;
};

// If we reached here, we sucessfully set weights!
return Ok(());
}

Ok(())
Expand Down
4 changes: 2 additions & 2 deletions pallets/subtensor/src/epoch/math.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ pub fn check_vec_max_limited(vec: &[u16], max_limit: u16) -> bool {
let mut vec_fixed: Vec<I32F32> = vec.iter().map(|e: &u16| I32F32::from_num(*e)).collect();
inplace_normalize(&mut vec_fixed);
let max_value: Option<&I32F32> = vec_fixed.iter().max();
max_value.map_or(true, |v| *v <= max_limit_fixed)
max_value.is_none_or(|v| *v <= max_limit_fixed)
}

#[allow(dead_code)]
Expand Down Expand Up @@ -1229,7 +1229,7 @@ pub fn mat_ema_alpha_vec(
alpha: &[I32F32],
) -> Vec<Vec<I32F32>> {
// Check if the new matrix is empty or its first row is empty.
if new.is_empty() || new.first().map_or(true, |row| row.is_empty()) {
if new.is_empty() || new.first().is_none_or(|row| row.is_empty()) {
return vec![vec![]; 1];
}

Expand Down
12 changes: 0 additions & 12 deletions pallets/subtensor/src/epoch/run_epoch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -803,18 +803,6 @@ impl<T: Config> Pallet<T> {
I32F32::from_num(Self::get_kappa(netuid)).saturating_div(I32F32::from_num(u16::MAX))
}

pub fn get_normalized_stake(netuid: u16) -> Vec<I32F32> {
let n = Self::get_subnetwork_n(netuid);
let mut stake_64: Vec<I64F64> = (0..n)
.map(|neuron_uid| {
I64F64::from_num(Self::get_stake_for_uid_and_subnetwork(netuid, neuron_uid))
})
.collect();
inplace_normalize_64(&mut stake_64);
let stake: Vec<I32F32> = vec_fixed64_to_fixed32(stake_64);
stake
}

pub fn get_block_at_registration(netuid: u16) -> Vec<u64> {
let n = Self::get_subnetwork_n(netuid);
let block_at_registration: Vec<u64> = (0..n)
Expand Down
2 changes: 1 addition & 1 deletion pallets/subtensor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ mod tests;
// apparently this is stabilized since rust 1.36
extern crate alloc;

pub const MAX_CRV3_COMMIT_SIZE_BYTES: u32 = 2048;
pub const MAX_CRV3_COMMIT_SIZE_BYTES: u32 = 5000;

#[deny(missing_docs)]
#[import_section(errors::errors)]
Expand Down
55 changes: 22 additions & 33 deletions pallets/subtensor/src/macros/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,42 @@ mod errors {
HotKeyAccountNotExists,
/// The hotkey is not registered in any subnet.
HotKeyNotRegisteredInNetwork,
/// Request to stake, unstake or subscribe is made by a coldkey that is not associated with the hotkey account.
/// Request to stake, unstake or subscribe is made by a coldkey that is not associated with
/// the hotkey account.
NonAssociatedColdKey,
/// The hotkey is not a delegate and the signer is not the owner of the hotkey.
HotKeyNotDelegateAndSignerNotOwnHotKey,
/// Stake amount to withdraw is zero.
StakeToWithdrawIsZero,
/// The caller is requesting removing more stake than there exists in the staking account. See: "[remove_stake()]".
/// The caller is requesting removing more stake than there exists in the staking account.
/// See: "[remove_stake()]".
NotEnoughStakeToWithdraw,
/// The caller is requesting to set weights but the caller has less than minimum stake required to set weights (less than WeightsMinStake).
/// The caller is requesting to set weights but the caller has less than minimum stake
/// required to set weights (less than WeightsMinStake).
NotEnoughStakeToSetWeights,
/// The caller is requesting adding more stake than there exists in the coldkey account. See: "[add_stake()]"
/// The caller is requesting adding more stake than there exists in the coldkey account.
/// See: "[add_stake()]"
NotEnoughBalanceToStake,
/// The caller is trying to add stake, but for some reason the requested amount could not be withdrawn from the coldkey account.
/// The caller is trying to add stake, but for some reason the requested amount could not be
/// withdrawn from the coldkey account.
BalanceWithdrawalError,
/// Unsuccessfully withdraw, balance could be zero (can not make account exist) after withdrawal.
/// Unsuccessfully withdraw, balance could be zero (can not make account exist) after
/// withdrawal.
ZeroBalanceAfterWithdrawn,
/// The caller is attempting to set non-self weights without being a permitted validator.
NeuronNoValidatorPermit,
/// The caller is attempting to set the weight keys and values but these vectors have different size.
/// The caller is attempting to set the weight keys and values but these vectors have
/// different size.
WeightVecNotEqualSize,
/// The caller is attempting to set weights with duplicate UIDs in the weight matrix.
DuplicateUids,
/// The caller is attempting to set weight to at least one UID that does not exist in the metagraph.
/// The caller is attempting to set weight to at least one UID that does not exist in the
/// metagraph.
UidVecContainInvalidOne,
/// The dispatch is attempting to set weights on chain with fewer elements than are allowed.
WeightVecLengthIsLow,
/// Number of registrations in this block exceeds the allowed number (i.e., exceeds the subnet hyperparameter "max_regs_per_block").
/// Number of registrations in this block exceeds the allowed number (i.e., exceeds the
/// subnet hyperparameter "max_regs_per_block").
TooManyRegistrationsThisBlock,
/// The caller is requesting registering a neuron which already exists in the active set.
HotKeyAlreadyRegisteredInSubNet,
Expand All @@ -60,7 +69,8 @@ mod errors {
InvalidDifficulty,
/// The supplied PoW hash seal does not match the supplied work.
InvalidSeal,
/// The dispatch is attempting to set weights on chain with weight value exceeding the MaxWeightLimit (max_weight_limit subnet hyperparameter).
/// The dispatch is attempting to set weights on chain with weight value exceeding the
/// MaxWeightLimit (max_weight_limit subnet hyperparameter).
MaxWeightExceeded,
/// The hotkey is attempting to become a delegate when the hotkey is already a delegate.
HotKeyAlreadyDelegate,
Expand Down Expand Up @@ -114,7 +124,8 @@ mod errors {
DelegateTakeTooLow,
/// Delegate take is too high.
DelegateTakeTooHigh,
/// No commit found for the provided hotkey+netuid combination when attempting to reveal the weights.
/// No commit found for the provided hotkey+netuid combination when attempting to reveal the
/// weights.
NoWeightsCommitFound,
/// Committed hash does not equal the hashed reveal data.
InvalidRevealCommitHashNotMatch,
Expand All @@ -132,28 +143,10 @@ mod errors {
AlphaLowOutOfRange,
/// The coldkey has already been swapped
ColdKeyAlreadyAssociated,
/// The coldkey swap transaction rate limit exceeded
ColdKeySwapTxRateLimitExceeded,
/// The new coldkey is the same as the old coldkey
NewColdKeyIsSameWithOld,
/// The coldkey does not exist
NotExistColdkey,
/// The coldkey balance is not enough to pay for the swap
NotEnoughBalanceToPaySwapColdKey,
/// No balance to transfer
NoBalanceToTransfer,
/// Same coldkey
SameColdkey,
/// The coldkey is in arbitration
ColdkeyIsInArbitration,
/// The new coldkey is already registered for the drain
DuplicateColdkey,
/// Error thrown on a coldkey swap.
ColdkeySwapError,
/// Insufficient Balance to Schedule coldkey swap
InsufficientBalanceToPerformColdkeySwap,
/// The maximum number of coldkey destinations has been reached
MaxColdkeyDestinationsReached,
/// Attempting to set an invalid child for a hotkey on a network.
InvalidChild,
/// Duplicate child when setting children.
Expand All @@ -164,16 +157,12 @@ mod errors {
TooManyChildren,
/// Default transaction rate limit exceeded.
TxRateLimitExceeded,
/// Swap coldkey only callable by root.
SwapColdkeyOnlyCallableByRoot,
/// Swap already scheduled.
SwapAlreadyScheduled,
/// failed to swap coldkey
FailedToSchedule,
/// New coldkey is hotkey
NewColdKeyIsHotkey,
/// New coldkey is in arbitration
NewColdkeyIsInArbitration,
/// Childkey take is invalid.
InvalidChildkeyTake,
/// Childkey take rate limit exceeded.
Expand Down
14 changes: 0 additions & 14 deletions pallets/subtensor/src/rpc_info/delegate_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,20 +156,6 @@ impl<T: Config> Pallet<T> {
total_delegated
}

// Helper function to get total delegated stake for a hotkey
pub fn get_total_hotkey_delegated_stake(hotkey: &T::AccountId) -> u64 {
let mut total_delegated = 0u64;

// Iterate through all delegators for this hotkey
for (delegator, stake) in Stake::<T>::iter_prefix(hotkey) {
if delegator != Self::get_coldkey_for_hotkey(hotkey) {
total_delegated = total_delegated.saturating_add(stake);
}
}

total_delegated
}

// Helper function to get the coldkey associated with a hotkey
pub fn get_coldkey_for_hotkey(hotkey: &T::AccountId) -> T::AccountId {
Owner::<T>::get(hotkey)
Expand Down
9 changes: 1 addition & 8 deletions pallets/subtensor/src/staking/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use frame_support::{
storage::IterableStorageDoubleMap,
traits::{
tokens::{
fungible::{Balanced as _, Inspect as _, Mutate as _},
fungible::{Balanced as _, Inspect as _},
Fortitude, Precision, Preservation,
},
Imbalance,
Expand Down Expand Up @@ -341,13 +341,6 @@ impl<T: Config> Pallet<T> {
let _ = T::Currency::deposit(coldkey, amount, Precision::BestEffort);
}

pub fn set_balance_on_coldkey_account(
coldkey: &T::AccountId,
amount: <<T as Config>::Currency as fungible::Inspect<<T as system::Config>::AccountId>>::Balance,
) {
T::Currency::set_balance(coldkey, amount);
}

pub fn can_remove_balance_from_coldkey_account(
coldkey: &T::AccountId,
amount: <<T as Config>::Currency as fungible::Inspect<<T as system::Config>::AccountId>>::Balance,
Expand Down
8 changes: 0 additions & 8 deletions pallets/subtensor/src/subnets/serving.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,6 @@ impl<T: Config> Pallet<T> {
rate_limit == 0 || last_serve == 0 || current_block.saturating_sub(last_serve) >= rate_limit
}

pub fn has_axon_info(netuid: u16, hotkey: &T::AccountId) -> bool {
Axons::<T>::contains_key(netuid, hotkey)
}

pub fn has_prometheus_info(netuid: u16, hotkey: &T::AccountId) -> bool {
Prometheus::<T>::contains_key(netuid, hotkey)
}

pub fn get_axon_info(netuid: u16, hotkey: &T::AccountId) -> AxonInfoOf {
if let Some(axons) = Axons::<T>::get(netuid, hotkey) {
axons
Expand Down
7 changes: 0 additions & 7 deletions pallets/subtensor/src/subnets/uids.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use super::*;
use frame_support::storage::IterableStorageDoubleMap;
use frame_support::storage::IterableStorageMap;
use sp_std::vec;

impl<T: Config> Pallet<T> {
Expand Down Expand Up @@ -127,12 +126,6 @@ impl<T: Config> Pallet<T> {
}
}

/// Return the total number of subnetworks available on the chain.
///
pub fn get_number_of_subnets() -> u16 {
<SubnetworkN<T> as IterableStorageMap<u16, u16>>::iter().count() as u16
}

/// Return a list of all networks a hotkey is registered on.
///
pub fn get_registered_networks_for_hotkey(hotkey: &T::AccountId) -> Vec<u16> {
Expand Down
Loading

0 comments on commit 55e754b

Please sign in to comment.