Skip to main content
SUBMIT A PRSUBMIT AN ISSUElast edit: Jun 06, 2025

Validating in Bittensor

All mining and validating in Bittensor occur within a subnet. Each subnet independently produces the digital commodities that are its purpose, each subnet creator defining a different incentive mechanism for validators to use in judging miners' work. The validator's work is to apply this incentive mechanism to miners, using it to score their performance, and then to submit these weights to the Bittensor blockchain. It is validators scores of miners' performance that determines the proportion of the subnet's emissions allocated to each miner, according to the Yuma Consensus algorithm. See Emissions.

Browse the subnets and explore links to their code repositories on TAO.app' subnets listings.

Typical compute requirements

Each subnet may have distinct hardware requirements, but this minimum requirements template for subnet creators may give an idea of minimum memory, bandwidth and storage requirements for a typical subnet node.

Validating is not supported on Windows.

How it works

Each subnet on the Bittensor blockchain supports a maximum of 256 active nodes, with each node assigned a unique UID slot. Out of these, only the top 64 nodes by emissions are eligible to serve as validators by default. A subnet with 64 validators means that all 64 top-ranked nodes meet the necessary criteria and choose to participate as validators.

To qualify as a validator, a node must have a validator permit. This permit is only granted to nodes within the top 64 and allows them to submit miner evaluations using btcli weights commit or the SDK's set_weights function.

Dynamic Validator Threshold

The number of validators isn't hardcoded. The subnet governor has the authority to increase or decrease the maximum number of validators. Any change to this limit directly affects the number of nodes that can be issued a validator permit and, thus, act as validators.

Requirements for validation

To have a validator permit in a given subnet, you must meet the following requirements:

  • Your hotkey must be registered, granting you a UID on the subnet

  • You must have a stake-weight on the subnet of least 1000, including stake delegated to your hotkey from other wallets' coldkeys. A validator's stake weight in a subnet equals their alpha stake plus their TAO stake times the tao_weight parameter (current value: 0.18):

    Validator stake weight=α+0.18×τ \text{Validator stake weight} = \alpha + 0.18 \times \tau
  • You must be one of the top 64 nodes in the subnet, ranked by emissions.

Hotkey Association & Staking (subnet 0, the root subnet, only)

Root Subnet (Subnet 0) only

Skip this step if you are not registering a validator on the root subnet (subnet 0)

btcli wallet associate-hotkey --wallet.name  <wallet name> --hotkey <your hotkey>

Add stake to your validator before registering:

# Stake funds to your hotkey account within the subnet.
btcli stake add --wallet.name <wallet name> --wallet.hotkey <your validating hotkey>

Validator registration

To participate as a validator, you must first register a hotkey with the subnet in order to receive a UID on that subnet.

By default, a subnet can have a maximum of 64 active subnet validator UIDs. Upon registration, your hotkey, which is part of your wallet, becomes the holder of the UID slot.

To register:

btcli subnet register --netuid <desired netuid> --wallet.name  <wallet name> --hotkey <your hotkey>

Validator deregistration

Validators, like miners, can be deregistered if their emissions are low. However, validator deregistration involves additional steps compared to miner deregistration. This is because an active validator must be among the top 64 nodes in the subnet and, therefore, cannot be instantly "pruned" by a newly registered node.

When a validator falls below the top 64 nodes by emissions, or has less than the required 1000 total stake weight, it loses its validation permit, but is not therefore automatically deregistered. If a validator loses its validation permit and has no means to gain emissions, it will eventually become the node with the lowest emission, making it eligible for deregistration.

info

Deregistration only occurs on subnets where all 256 UID slots are occupied. If a new registration occurs in a subnet with available UID slots, the registered neuron occupies one of the available UID slots.

Each tempo, the 'neuron' (miner or validator node) with the lowest 'pruning score' (based solely on emissions), and that is no longer within its immunity period, risks being replaced by a newly registered neuron, who takes over that UID.

Deregistration is based on emissions

The subnet does not distinguish between miners and validators for the purpose of deregistration. The chain only looks at emissions (represented as 'pruning score'). Whenever a new registration occurs in the subnet, the neuron with the lowest emissions will get deregistered.

Immunity period

Every subnet has an immunity_period hyperparameter expressed in a number of blocks. A neuron's immunity_period starts when the miner or validator registers into the subnet. For more information, see immunity_period.

A subnet neuron (miner or validator) at a UID (in that subnet) has immunity_period blocks to improve its performance. When immunity_period expires, that miner or validator can be deregistered if it has the lowest performance in the subnet and a new registration arrives.

Special cases
  • In the unlikely event that all neurons are still immune, the one with the lowest "pruning score" will be deregistered by the next incoming registration.

  • In cases where two or more nodes have the lowest "pruning score", the older node gets deregistered first.

  • The subnet owner's hotkey has permanent immunity from deregistration.

Acquiring stake

A validator's consensus weight and emissions depend on their hotkey's stake weight. You can stake your own TAO to your validator hotkey, or advertise your hotkey to others and seek stake. Any wallet's coldkey can stake to any hotkey, subsequently receiving emissions from that stake.

Delegation

Add stake

# Stake funds to your hotkey account within the subnet.
btcli stake add --wallet.name <wallet name> --wallet.hotkey <your validating hotkey>

Calculate TAO required

The amount of TAO needed to acquire a validator permit depends on how the other largest 64 wallets distribute TAO across themselves. You can calculate the minimum using bt.metagraph:

import bittensor as bt
subnet = bt.metagraph(1)
top_64_stake = sorted(subnet.S)[-64:]
print (f'Current requirement for validator permits based on the top 64 stake stands at {min(top_64_stake)} tao')

Check the permit status

Replace the string values for the name (<my_coldkey>) and hotkey (<my_validator_hotkey>) with your own.
This information can be obtained from the metagraph using your UID.

import bittensor as bt
subnet = bt.metagraph(1)
wallet = bt.wallet( name = 'my_coldkey', hotkey = 'my_validator_hotkey' )
my_uid = subnet.hotkeys.index( wallet.hotkey.ss58_address )
print(f'Validator permit: {subnet.validator_permit(my_uid)}')

Inspecting UIDs

After you obtain a UID slot, you can view the status of your registered wallet by running:

btcli wallet overview --netuid

After providing your wallet name at the prompt, you will see output like:

ParameterValueDescription
COLDKEYmy_coldkeyThe name of the coldkey associated with your slot.
HOTKEYmy_first_hotkeyThe name of the hotkey associated with your slot.
UID5The index of the uid out of available uids.
ACTIVETrueWhether or not the uid is considered active.
STAKE(τ)71.296The amount of stake in this wallet.
RANK0.0629This miner's absolute ranking according to validators on the network.
TRUST0.2629This miner's trust as a proportion of validators on the network.
CONSENSUS0.89This validator's aggregate consensus score.
INCENTIVE0.029This miner's incentive, TAO emission, is attained via mining.
DIVIDENDS0.001This validator's dividends, TAO emission, are attained via validating.
EMISSION29_340_153This miner's total emission in RAO (10^(-9) TAO) per block.
VTRUST0.96936This validator's trust score as a validator.
VPERMIT*Whether this miner is considered active for validating on this subnetwork.
UPDATED43Blocks since this miner set weights on the chain.
AXON131.186.56.85:8091The entrypoint advertised by this miner on the bittensor blockchain.
HOTKEY_SS585F4tQyWr...The ss58-encoded address of the miner's hotkey.

Meaning of ACTIVE

In the above table, the ACTIVE row applies only to UIDs that are subnet validators. It shows whether the UID is actively setting weights within the activity_cutoff window. If the UID has not set weights on the blockchain for the activity_cutoff duration, then the Yuma Consensus will consider this subnet validator offline, i.e., turned off (False).

Checking the registration status

Use any of the Python code fragments below:

  • Using Python interpreter: Type "python" or "python3" on your macOS or Linux terminal, then copy/paste one of these snippets.
  • Using a Python file: Copy a code snippet into, for example, check_reg.py, then run python3 check_reg.py.

With SS58 hotkey

import bittensor as bt
# Replace below with your SS58 hotkey
hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2"
network = "finney"
sub = bt.subtensor(network)
print(f"Registration status for hotkey {hotkey} is: {sub.is_hotkey_registered(hotkey)}")

With SS58 hotkey and netuid

import bittensor as bt
# Replace below with your SS58 hotkey
hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2"
network = "finney"
netuid = 1 # subnet uid
sub = bt.subtensor(network)
mg = sub.metagraph(netuid)
if hotkey not in mg.hotkeys:
print(f"Hotkey {hotkey} deregistered")
else:
print(f"Hotkey {hotkey} is registered")

With UID and SS58 hotkey

import bittensor as bt
# Replace below with your SS58 hotkey
hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2"
network = "finney"
netuid = 1 # subnet uid
sub = bt.subtensor(network)
mg = sub.metagraph(netuid)
uid = 2 # Your UID
registered = mg.hotkeys[uid] == hotkey
if not registered:
print(f"Miner at uid {uid} not registered")
else:
print(f"Miner at uid {uid} registered")