Skip to content

Stale Nomination Reward Curve#104

Open
shawntabrizi wants to merge 6 commits intomainfrom
shawntabrizi-stale-nominations
Open

Stale Nomination Reward Curve#104
shawntabrizi wants to merge 6 commits intomainfrom
shawntabrizi-stale-nominations

Conversation

@shawntabrizi
Copy link
Copy Markdown
Member

@shawntabrizi shawntabrizi commented Jul 16, 2024

Summary

Introduces a configurable decaying multiplier for stale nominations in NPoS staking. Nominators who do not periodically re-affirm their selection see their effective stake reduced over time, which both reduces their share of rewards and lets validators backed only by stale nominations drop out of the active set.

The mechanism adds:

  • A NominationStalenessCurve trait and a default piecewise-linear LinearStalenessCurve<GracePeriod, DecayPeriod, Floor>.
  • Proposed defaults: 1 month grace, 5 month linear decay, floor at zero.
  • Single-site change in the election snapshot path; no changes to the reward path. Lost reward share flows naturally to the validator's non-stale co-nominators through existing exposure-based payout math.

Design highlights

  • Only nominate resets the freshness counter, including same-target re-submission. No "renew" extrinsic; the friction of reconsidering targets is the point.
  • Pool nominations govern at the pool level (operator's nominate call sets the counter).
  • Stale-only validators get evicted automatically once their backing collapses to self-bond.
  • Migration resets every existing nominator's submitted_in to the upgrade era, so all nominators enter with a full grace period.
  • Bags-list is intentionally not re-bagged for staleness (would impose per-era maintenance work for marginal benefit).

Prototype

Working implementation on the shawntabrizi-stale-nominations branch of polkadot-sdk or just see PR paritytech/polkadot-sdk#11961. 14 tests cover curve boundaries, refresh-trigger semantics, snapshot behavior, and the migration helper. All existing pallet-staking tests still pass.

Open questions

  • Default values for GracePeriod / DecayPeriod / Floor.
  • Whether to ship with a non-zero floor to soften the impact on long-term inactive holders.

shawntabrizi and others added 2 commits May 1, 2026 16:36
Complete the Explanation, Drawbacks, Testing/Security/Privacy,
Performance/Ergonomics/Compatibility, Prior Art, Unresolved
Questions, and Future Directions sections. Add subsections on
voter iteration order (bags-list interaction) and recurring
ecosystem engagement as a secondary effect.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Remove off-topic references (RFC-0010 burn coretime, OpenGov
conviction decay, conviction-style integration future direction).
Strip em-dashes and a few other AI-style phrasings.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@shawntabrizi shawntabrizi reopened this May 1, 2026
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@shawntabrizi shawntabrizi added Proposed Is awaiting 3 formal reviews. and removed Stale Is no longer pursued. labels May 1, 2026
@shawntabrizi shawntabrizi changed the title [WIP] Stale Nominations Stale Nomination Reward Curve May 1, 2026
@shawntabrizi shawntabrizi marked this pull request as ready for review May 1, 2026 21:18
@shawntabrizi
Copy link
Copy Markdown
Member Author

Bumping this as it has now been updated and completed.

Implementation for reference can be found here: paritytech/polkadot-sdk#11961

### Security

- **No new attack surface in the election solver.** The reduction in input stake does not change the structure of the optimization problem; the solver receives smaller weights for some voters and proceeds as before.
- **Slashing.** Staleness does not interact with slashing. A stale nominator is still slashed in full if their elected validator misbehaves; reducing slashing based on staleness would perversely reward inattention.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- **Slashing.** Staleness does not interact with slashing. A stale nominator is still slashed in full if their elected validator misbehaves; reducing slashing based on staleness would perversely reward inattention.
- **Slashing.** Staleness does not interact with slashing.

I think this is the suggestion you are asking to update.

Basically the PR does not affect slashing in any way, so i will simply remove any details which assumes the previous behavior of slashing.

That being said, I am not sure I presently agree with the idea, but that is for another thread.


## Unresolved Questions

- **Default curve parameters.** A `GracePeriod` of 28 eras and `DecayPeriod` of 140 eras (one month plus five months) is proposed. Different values are reasonable. The trait-based design leaves the curve fully configurable; the question is what default values to ship.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could ship with GracePeriod set to u32::MAX (effectively disabling decay), wire the parameters through pallet-parameters (or dedicated pallet storage), and set the actual values via an OpenGov referendum.


## Future Directions and Related Material

- **Validator-side staleness.** This RFC applies the staleness mechanism only to nominators. Validators' `validate(prefs)` registrations are not changed and continue to persist indefinitely, as today. A parallel mechanism (requiring validators to periodically re-call `validate` to remain in the candidate pool) would address dormant or abandoned validator entries, and is a plausible follow-up, but is explicitly **not** included in this RFC and should be proposed as its own RFC.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Proposed Is awaiting 3 formal reviews.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants