-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UIP 7: Stake Boost #16
Open
hdevalence
wants to merge
2
commits into
main
Choose a base branch
from
stake-boost
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ Read [UIP-1](./uip-1.md) for information on the UIP process. | |
| [4](./uip-4.md) | Spend Backreferences | Jennifer Helsby ([@redshiftzero](https://github.com/redshiftzero)), Henry de Valence ([@hdevalence](https://github.com/hdevalence)), Lúcás Meier ([@cronokirby](https://github.com/cronokirby)) | | ||
| [5](./uip-5.md) | Outbound Packet Forwarding Middleware Support | Ava Howell <[email protected]> | | ||
| [6](./uip-6.md) | App Version Safeguard | Conor Schaefer ([@conorsch](https://github.com/conorsch)), Lucas Meier ([@cronokirby](https://github.com/cronokirby)) | | ||
| [7](./uip-7.md) | Stake Boost | Henry de Valence ([@hdevalence](https://github.com/hdevalence)) | | ||
|
||
## Contributing | ||
|
||
|
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
| uip | 7 | | ||
| - | - | | ||
| title | Stake Boost | | ||
| description | Improves decentralization by boosting rewards for small validators | | ||
| author | Henry de Valence ([@hdevalence](https://github.com/hdevalence)) | | ||
| discussions-to | <https://forum.penumbra.zone/t/uip-staking-boost/134> | | ||
| status | Draft | | ||
| type | Standards Track | | ||
| consensus | Yes | | ||
| created | 2024-12-08 | | ||
|
||
## Abstract | ||
|
||
This UIP introduces Stake Boost, a mechanism to improve validator | ||
decentralization by allocating a portion of staking rewards in each epoch to a | ||
single validator, selected uniformly at random from the active set. As all | ||
validators have an equal chance of being boosted, this mechanism boosts rewards | ||
for smaller validators relative to larger ones, incentivizing stake | ||
distribution across the network. | ||
|
||
## Motivation | ||
|
||
Currently, Penumbra's stake distribution is more centralized than desirable. | ||
While gradual decentralization has been occurring naturally and UI improvements | ||
have aimed to encourage this process, additional economic incentives could help | ||
accelerate stake distribution across the network. The Stake Boost mechanism | ||
provides direct economic incentives for delegators to stake with smaller | ||
validators, helping to create a more decentralized and robust network. | ||
|
||
## Specification | ||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174. | ||
|
||
### Parameters | ||
|
||
A new chain parameter `staking_boost_percent` is added to the staking | ||
parameters. This parameter define the percentage of new staking issuance | ||
allocated to the boost mechanism. | ||
|
||
The default value for `staking_boost_percent` should be `20`, though for | ||
clarity this only affects newly generated parameters (e.g., for testnets); | ||
parameter selection on Penumbra mainnet is subject to community consensus and | ||
governance. | ||
|
||
### Validator Selection | ||
|
||
At the end of each epoch, one validator in the active set is chosen to be | ||
boosted. To select the boosted validator, a `ChaCha20Rng` should be seeded | ||
with the previous block's app hash. | ||
|
||
As described below, this is an imperfect source of randomness compared to a | ||
real VRF, but probably good enough for this mechanism. | ||
|
||
### Reward Distribution | ||
|
||
Staking reward issuance is changed from the current logic to divert `staking_boost_percent` of rewards to the boost mechanism. | ||
|
||
TODO: fill in | ||
|
||
## Rationale | ||
|
||
The Staking Boost mechanism creates economic incentives for decentralization by | ||
differentially rewarding validators of different sizes. | ||
|
||
For small validators, the boost provides an outsized return relative to their | ||
delegation pool size. Consider a minimal validator with only the required | ||
minimum bond: while their pro-rata share of the regular rewards would be | ||
minimal, winning the boost (which occurs with equal probability for all | ||
validators) provides a fixed-size reward independent of stake. This | ||
significantly increases their expected returns and makes them much more | ||
attractive to delegators. | ||
|
||
For large validators, the same fixed-size boost becomes insignificant when | ||
divided across their large delegation pool. A validator with outsized voting | ||
power would see only a tiny increase in their effective APY from winning the | ||
boost, as the boost amount would be diluted across their large delegation pool. | ||
|
||
This asymmetric effect is intentional: it creates strong incentives for | ||
delegators to stake with smaller validators, as their expected returns will be | ||
much higher, while avoiding disruption to the basic stability of the network by | ||
maintaining most rewards on a pro-rata basis. | ||
|
||
The random selection mechanism is chosen for simplicity of implementation while | ||
preserving the desired economic effects. Rewarding validators only in | ||
expectation also minimizes some potential Sybil issues, as described below. | ||
|
||
## Backwards Compatibility | ||
|
||
This would be a breaking consensus change, requiring a network upgrade. | ||
|
||
## Security Considerations | ||
|
||
The Stake Boost mechanism has two primary security considerations: | ||
proposer manipulation and validator sybiling. | ||
|
||
A proposer could potentially manipulate the app hash to influence the boost | ||
allocation. However, this manipulation is unlikely to occur in practice for | ||
three reasons. First, proposer selection is weighted by stake, so the | ||
proposer at the end of an epoch is likely to be a large validator, for whom | ||
the value of the boost is minimal relative to their pro-rata rewards. | ||
Second, performing manipulation would require developing custom software, whose | ||
development cost likely exceeds the potential reward. Third, manipulation | ||
would either be a one-off event with minimal benefit, or would be recurrent | ||
and create public evidence of malfeasance, exposing the validator to social | ||
slashing. | ||
|
||
The mechanism could incentivize validator sybiling, where validators split | ||
their stake across multiple validator identities to increase their chance of | ||
winning the boost. However, two factors minimize this in practice. First, | ||
because the boost value is constant, it provides diminishing returns to large | ||
validators, who have little incentive to sybil. Second, the validator set | ||
size limit creates a floor on the effectiveness of sybiling. Small validators | ||
considering whether to split their stake must weigh the potential boost | ||
rewards against the risk that both validators could be pushed out of the | ||
active set by other validators competing for the boost. While any mechanism | ||
that provides additional support for small validators necessarily creates some | ||
incentive for sybiling, this design minimizes that effect in practice. | ||
|
||
## Privacy Considerations | ||
|
||
The Stake Boost mechanism operates entirely on public chain data and does not | ||
introduce new privacy considerations beyond those already present in Penumbra's | ||
staking system. | ||
|
||
## Copyright | ||
|
||
Copyright and related rights waived via [CC0](https://github.com/penumbra-zone/UIPs/blob/main/LICENSE). |
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be filled in with reference to the source code, I believe the majority of the staking code would be unchanged (just changing the top line input to that computation), with some extra logic to adjust the boosted validator's exchange rate to account for the boost.