Stop burning miner emissions: normalize distributed rewards to 100%#590
Merged
Conversation
…zation stretch to 100% Subnet emission scales with price x (1 - miner_burn), so routing the penalty shortfall to the recycle UID was costing the subnet emissions. The reward formula is unchanged (eligible x pool x crown_share x capacity x fill_ratio); the shortfall is simply left undistributed and set_weights' existing L1 normalization stretches the distributed mass to 100% of emissions. Penalties keep their full relative bite. - calculate_miner_rewards: no recycle top-up; trace logs the undistributed remainder instead - halt: freeze scores (skip update) so pre-halt weights persist instead of routing the full pool to the recycle UID - set_weights: empty/NaN scores skip the round (previous on-chain weights persist) instead of burning
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Subnet emission on Bittensor scales with
price × (1 - miner_burn)— every unit of weight routed to the recycle UID shrinks the whole subnet's emissions. We were burning the full penalty shortfall (ineligible holders, capacity < 1, fill_ratio < 1, empty direction buckets), which regularly amounted to a large slice of the pool.What
The reward formula is untouched:
eligible × pool × crown_share × capacity × fill_ratio. The change is only what happens to the shortfall — instead of topping upRECYCLE_UID, it is left undistributed, andset_weights' existing L1 normalization stretches the distributed mass to 100% of emissions. All penalties keep their full relative bite (ratios between miners are unchanged); the mass a penalized miner forfeits now flows pro-rata to the miners who performed instead of burning.calculate_miner_rewards: recycle top-up removed; the scoring trace now logsundistributed=…with the same cause diagnostics.update_scorescall) so pre-halt weights persist on chain, instead of routing the full pool to the recycle UID._flush_halt_windowdashboard semantics unchanged.set_weightsempty/NaN fallback: skips the round (previous on-chain weights persist) instead of burning — bittensor's uniform-1/n fallback is still avoided.build_halted_rewardsdeleted;RECYCLE_UIDkept in constants (documents the owner UID; tests assert it receives nothing).Incentive notes
undistributed=line) after deploy.Tests
795 passed(full suite). Recycle-pinning tests rewritten to assert the new invariant: nothing lands onRECYCLE_UID, reward sum equals distributed mass only, halt freezes scores.