Neuron Registration
RegistrationProcess for new neurons to join subnets via Proof-of-Work or TAO burn, obtaining a UID slot.
Neuron Registration Flow
Neuron Registration
- User submits register (PoW) or burned_register call
- Faucet call on testnet
Click items to navigate to their reference pages.
The Big Picture
Registration is the gateway to participating in a subnet. Every miner and validator must register to get a UID slot. Two methods exist: solving a hash puzzle (PoW) or burning TAO. When all slots are full, new registrations prune the worst-performing neuron. Costs adjust dynamically based on demand.
Why This Matters
Registration cost is the barrier to entry for each subnet. High costs indicate competitive subnets. Understanding the cost dynamics helps you choose between PoW and burn, and time your registration.
Example Scenario
Subnet 1 has 256 UID slots, all full. Current burn: 0.5 TAO. Current PoW difficulty: 4M. At average consumer hardware (~1MH/s), PoW registration takes ~4 seconds. If 20 registrations happen in the last interval (target: 10), next interval's burn doubles to 1.0 TAO and difficulty doubles to 8M.
Common Questions
- PoW or burn — which is cheaper?
- It depends on your hardware cost vs. TAO price. Generally, burn is simpler and more predictable. PoW is favored when burn costs are high relative to electricity costs.
- What happens when I register on a full subnet?
- The neuron with the lowest pruning score (essentially the worst performer) is evicted and your hotkey takes its UID slot. Their stake is not affected — just the UID.
Use Cases
- Estimating registration costs before deploying
- Choosing between PoW and burn registration
- Monitoring subnet registration demand
- Building auto-registration tools
Neurons must register to participate in a subnet. Registration assigns a UID (0 to MaxAllowedUids-1) to the neuron's hotkey. Two methods exist: Proof-of-Work registration (solving a hash puzzle) and burned registration (paying a TAO cost).
When all UID slots are full, new registrations replace the lowest-performing existing neuron (pruning). PoW difficulty and burn costs adjust dynamically based on registration demand.
Triggers
- User submits register (PoW) or burned_register call
- Faucet call on testnet
Inputs (5)
| Item | Type | Role |
|---|---|---|
| register SubtensorModule | call | PoW-based registration |
| burned_register SubtensorModule | call | Burn-based registration |
| MaxAllowedUids SubtensorModule | storage | Maximum neuron slots per subnet |
| Difficulty SubtensorModule | storage | Current PoW difficulty |
| Burn SubtensorModule | storage | Current burn cost for registration |
Outputs (4)
| Item | Type | Role |
|---|---|---|
| NeuronRegistered SubtensorModule | event | Emitted on successful registration |
| Uids SubtensorModule | storage | Hotkey → UID mapping |
| Keys SubtensorModule | storage | UID → hotkey mapping |
| IsNetworkMember SubtensorModule | storage | Whether hotkey is registered on subnet |
Source Files
pallets/subtensor/src/subnets/registration.rs pallets/subtensor/src/coinbase/block_step.rs Formulas
PoW Difficulty Adjustment
Difficulty adjusts based on how many registrations occurred in the last interval relative to the target. Applied only when the 6-case conditional logic selects PoW adjustment (see Adjustment Cases below).
updated = current_difficulty * (actual + target) / (2 * target) alpha = AdjustmentAlpha / u64::MAX new_difficulty = alpha * current_difficulty + (1 - alpha) * updated clamped to [min_difficulty, max_difficulty]
TypeScript: computeDifficultyAdjustment() in yuma-formulas.ts
Burn Cost Dynamics
Burn cost adjusts similarly to difficulty — rising when registrations exceed the target and falling when below. Applied only when the 6-case conditional logic selects burn adjustment.
updated = current_burn * (actual + target) / (2 * target) alpha = AdjustmentAlpha / u64::MAX new_burn = alpha * current_burn + (1 - alpha) * updated clamped to [min_burn, max_burn]
TypeScript: computeBurnCost() in yuma-formulas.ts
Adjustment Cases
Every adjustment_interval blocks, a 6-case conditional determines which parameter gets adjusted based on PoW vs burn registration counts.
pow_regs = PoW registrations in last interval burn_regs = burn registrations in last interval // Case 1: Both above target → increase both difficulty and burn // Case 2: PoW above, burn below → increase difficulty, decrease burn // Case 3: PoW below, burn above → decrease difficulty, increase burn // Case 4: Both below target → decrease both // Case 5: No PoW regs → decrease difficulty only // Case 6: No burn regs → decrease burn only
Registration Cost Estimator
Registration Cost Estimator
Estimate how PoW difficulty and burn cost adjust based on registration demand
Proof of Work
CheaperBurn Registration
How it works: Both difficulty and burn cost adjust based on registration demand. When registrations exceed the target, costs increase (up to 2x). When below target, costs decrease (down to 0.5x). This creates an equilibrium around the target rate.
Try: Slide "Recent Registrations" above and below the target to see how costs adjust. Notice that both PoW and Burn scale by the same ratio, keeping them roughly balanced.