Hyperparameters

min_difficulty

Lower bound for the PoW registration difficulty controller; u64::MAX pins difficulty at maximum, disabling PoW registration.

View as Markdown

min_difficulty is the floor under difficulty, the proof-of-work target for PoW neuron registration. However cheap registrations get, the difficulty controller never lets the PoW price fall below this value. Setting it to u64::MAX pins difficulty at maximum, which effectively disables PoW registration outright. Miners care because it fixes the minimum compute cost of a PoW slot; root/governance sets it.

How it works

Storage is MinDifficulty in pallets/subtensor/src/lib.rs, read and written by get_min_difficulty / set_min_difficulty (pallets/subtensor/src/utils/misc.rs). In the classic controller, difficulty was rescaled each adjustment interval by how far registrations ran over or under target, then clamped to the [min_difficulty, max_difficulty] band — so with quiet demand, difficulty decayed until it sat on this floor.

The chain-wide migration migrate_set_min_difficulty (pallets/subtensor/src/migrations/migrate_set_min_difficulty.rs) set the floor to 10,000,000 on every subnet, matching the runtime default (SubtensorInitialMinDifficulty in runtime/src/lib.rs).

Note that on the current runtime PoW registration is deprecated: the register extrinsic routes to burned registration and no controller adjusts difficulty between intervals, so this floor is dormant. The playground below opens on a quiet-demand scenario where difficulty decays until it sits on the bold floor line — drag the floor to its top stop (or use the button) to see the u64::MAX disabled state:

PoW difficulty controller

This scenario starts with quiet demand (0 registrations vs a target of 2), so the controller decays difficulty every interval — until it lands on the bold min_difficulty floor and sits there. The floor is the one price the controller could never undercut. Drag the floor to its top stop (or use the button) for the u64::MAX disabled state.

Difficulty after 48 intervals

1.0e7

pinned at floor

Odds a single nonce passes

≈ 1 in 1.0e7

hash_meets_difficulty → expect ~1.0e7 hashes per registration

Registration pressure

0 regs vs target 2

under target: difficulty decays down

1.0e7
1.0e16
0
2
the sentinel state: a floor of u64::MAX pins difficulty at maximum.

Reading and setting

btcli sudo get --netuid N --name min_difficulty

Root/governance only: sudo_set_min_difficulty in the AdminUtils pallet requires the root origin and takes a raw u64. It is not settable by the subnet owner via btcli sudo set.

difficulty · max_difficulty · network_pow_registration_allowed · target_regs_per_interval · adjustment_interval · min_burn