AIP-[1]: [Vote Staking for Voting Reward Distribution]
Author
Jianming Liu (@jianmliu)
Status
Draft
Created
2025-12-03
Summary
This proposal introduces Voting Staking, an enhancement to the current block reward distribution model. Today, block rewards are distributed between block proposers and voters, with voting rewards allocated equally among all eligible voters. This proposal adds an optional staking mechanism that allows voters to stake tokens to receive rewards proportional to their staking amount, rather than equally.
This mechanism:
- Does not require mandatory pre-staking.
- Preserves storage capacity as the primary eligibility factor.
- Adds staking as a secondary, optional dimension to optimize voter rewards.
Motivation
Currently, farmers optimize a single dimension for earning rewards: increasing storage capacity. Voting rewards are distributed equally among all voters, regardless of the level of economic commitment.
This AIP introduces a second, optional dimension: staking. Miners can now improve their voting reward share by staking tokens, creating a dual-axis optimization model:
Farmer Reward = f(Storage Capacity, Staking Amount)
This design introduces a natural economic balance between hardware investment and token staking, while maintaining low entry barriers because staking is not mandatory.
Specification
1. Voting Staking Mechanism
A new staking module SHALL be added to:
- Accept deposits of the voting token.
- Track per-account stake balances.
- Provide effective voting weights used for reward distribution.
2. Eligibility
A farmer must first qualify for voting rewards based on storage capacity or other protocol-defined participation criteria. Only eligible voters may receive rewards.
3. Reward Distribution Logic
Voting rewards are computed in the runtime through FindVotingRewardAddresses.
At each reward event:
-
The system retrieves a list of
(voter, weight)pairs. -
Voters where
weight == 0are excluded. -
Let
W = Σ weight_i. -
For each voter except the last:
reward_i = floor(weight_i * reward_pool / W) -
The last voter receives the remainder to ensure:
Σ reward_i = reward_pool
Weight Source and Constraints
-
Weight is determined by the
VotingStakeProvider(i.e.,pallet_voting_stake). -
Raw stake is mapped to effective weight with:
- Minimum stake threshold: below this threshold → weight = 0.
- Maximum stake cap: above this cap → weight = MAX.
Resulting weight:
weight(user) =
0 if stake < MIN_VOTING_BALANCE
MIN(stake, MAX_VOTING_BALANCE) otherwise
4. Unstaking
- Unstaking SHALL be allowed at any time.
- No penalties SHALL be applied.
- Rewards will be automatically and directly distributed; no manual reward claiming is required.
Rationale
Farming economics shift from a single-dimensional capacity race to a two-dimensional equilibrium between capacity contribution and staking contribution.
Benefits
- Encourages long-term alignment.
- Provides fairer reward distribution.
- Avoids forced staking requirements.
- Maintains accessibility: farmers may rely entirely on hardware.
- Allows differentiation between high-capacity farmers and high-stake farmers.
Considerations
Potential Challenges
- Staking concentration: large operators may accumulate excessive stake.
- Small farmer disadvantage: proportional rewards may favor larger stakers.
- Transition complexity: shifting from equal to proportional distribution.
Non-Mandatory Staking
- Staking is optional for farmers.
- No farmer is required to stake tokens to participate.
- Storage capacity remains the foundation of participation.
Open Questions for Community Feedback
- Should there be a maximum multiplier or soft cap to reduce dominance?
- Should a minimum stake threshold be required?
- Should optional long-term lock-ups receive higher weighting?
- Should capacity influence reward weight, not just eligibility?
Backward Compatibility
- No changes to farming or reward mechanics outside staking distribution.
- Hard fork is required.
- Staking is optional; existing voters remain unaffected.
Reference Implementation
The proposal is implemented through the Voting Pallet, added in commit:
https://github.com/jianmliu/subspace/commit/02ea92b6e6074604ca0c8896552dff4ac11fb914
Voting Pallet
The pallet provides:
- storage of staking balances,
- minimum/maximum effective weight enforcement,
- stake/unstake extrinsics,
- implementation of
VotingStakeProvider, - integration with reward distribution through
FindVotingRewardAddresses.
Runtime Integration
pallet_voting_stakeimplementsVotingStakeProvider.FindVotingRewardAddressessupplies(voter, weight).pallet-rewardsdistributes rewards proportionally as described.
Security Considerations
- The staking pallet MUST be audited.
- Staked funds MUST remain withdrawable.
- Flash-staking MUST be prevented (minimum duration ≥ 1 block recommended).
- Reward logic MUST be resistant to manipulation.


