Documentation / Bittensor concepts / Protocol Changes
Null consensus (spec 474)
Subnet owners can switch their subnet from Yuma to Null: the top-stake validator sets miner pay and every staker earns dividends by stake.
Last reviewed 2026-10-06
The short version
Null is a second epoch mode, alongside Yuma. A subnet owner or root can switch a subnet to it. On a Null subnet:
- The validator with the most stake sets all miner pay. Only that UID's weights count.
- Dividends follow stake. Every staked UID earns its stake share, active or not.
- No bonds, consensus or clipping. Weights are used exactly as sent.
- The emission split is unchanged. The owner cut comes first, then miners and validators split the rest.
Yuma stays the default on every existing and new subnet. The root subnet cannot use Null.
Yuma vs Null
| Yuma | Null | |
|---|---|---|
| Who sets miner pay | All permitted validators, stake-weighted | Only the UID with the most stake |
| Validator permits | Up to max_allowed_validators | Exactly one, the top-stake UID |
| Validator dividends | By bonds | By stake. Inactive stakers still earn |
| Bonds, consensus, clipping | Yes | None |
| Weights | Normalised and clipped | Raw u16 values, used as stored |
| Max UIDs per subnet | 256 ÷ mechanisms | 2,500 ÷ mechanisms |
How miner pay is set
| Rule | Detail |
|---|---|
| Who | The registered UID with the most stake. One winner per epoch |
| Tie | The lowest UID wins |
| Inactive | Still counts. Inactivity does not remove stake |
| Owner | No special treatment. The owner only wins with the most stake |
| Empty or all-zero weights | Miner pay is split equally across every registered UID |
| No staked UID on the subnet | The validator half goes to miners |
This is a single point of control by design: whoever holds the most stake on a Null subnet decides every miner's share.
For subnet owners
bash
btcli hparams set --netuid 123 --name epoch_consensus --value Null
btcli hparams set --netuid 123 --name max_allowed_uids --value 2500
btcli hparams trim-null --netuid 123 --switch-to-yuma| Item | Rule |
|---|---|
| Who can switch | Subnet owner or root (sudo_set_epoch_consensus), within the normal owner rate limit and admin window |
| Root subnet | Cannot use Null |
| Capacity on Null | Up to 2,500 ÷ mechanisms. Switching does not raise max_allowed_uids; the owner sets it |
| Back to Yuma | Registered UIDs must fit 256 ÷ mechanisms, so trim first |
| Trimming | At most 64 UIDs per batch (sudo_trim_null_uids_batch) |
| Pending commits | Must clear before any mode change |
| Validator limit | Set to 1 on entering Null. The previous value is saved and restored on return to Yuma |
Registration: burn, proof of work or both
Burn and proof-of-work registration are separate switches, both settable by the subnet owner or root:
| Switch | Default |
|---|---|
registration_allowed (burn) | On |
network_pow_registration_allowed (PoW) | Off |
The chain rejects turning off the last enabled route, so to move from PoW back to burn, turn burn on first. This works on both Null and Yuma subnets. Root stays burn-only.
bash
btcli hparams set --netuid 123 --name network_pow_registration_allowed --value true
btcli hparams set --netuid 123 --name registration_allowed --value false
btcli subnets register --netuid 123 --pow --yesPoW difficulty moves with demand, the same way the burn price does:
| Item | Rule |
|---|---|
| After a PoW registration | Difficulty × burn_increase_mult (default 1.26) |
| Every block | Decays toward its floor using burn_half_life (default 360 blocks) |
| Burn price | Moves only on burn registrations. PoW does not touch it |
| PoW switched off | Difficulty keeps decaying, so turning PoW back on does not reset it |
Commit reveal on Null
Commit reveal works on Null subnets with a larger payload: up to 32 KiB per commit, against 5,000 bytes on Yuma. Each Null subnet's commit queue is capped at 64 KiB and 64 commits per epoch, shared across mechanisms.
Also in spec 474
A child hotkey can have at most 100 parents per subnet.
Known limits
The PR's own cost notes (.maintain/null-4k-cost.md) measured one Null epoch at 4,096 UIDs at a charged weight of 4.9 to 7.0 seconds, above the 4-second block limit. Capacity was set to 2,500 UIDs instead.