solana/book/src/staking-rewards.md

166 lines
8.7 KiB
Markdown
Raw Normal View History

2018-12-12 14:32:56 -08:00
# Staking Rewards
Initial Proof of Stake (PoS) (i.e. using in-protocol asset, SOL, to provide
secure consensus) design ideas outlined here. Solana will implement a proof of
stake reward/security scheme for node validators on the network. The purpose is
threefold:
- Align validator incentives with that of the greater network through
skin-in-the-game deposits at risk
- Avoid 'nothing at stake' fork voting issues by implementing slashing rules
aimed at promoting fork convergence
- Provide an avenue for validator rewards provided as a function of validator
participation in the network.
While many of the details of the specific implementation are currently under
consideration and are expected to come into focus through specific modeling
studies and parameter exploration on the Solana testnet, we outline here our
current thinking on the main components of the PoS system. Much of this
thinking is based on the current status of Casper FFG, with optimizations and
specific attributes to be modified as is allowed by Solana's Proof of History
(PoH) blockchain data structure.
2018-10-22 08:49:28 -07:00
### General Overview
2018-12-12 14:32:56 -08:00
Solana's validation network design is based on a rotating, stake-weighted
randomly selected leader broadcasting network transactions in a PoH data
structure to validating nodes. These nodes, upon receiving the leader's
broadcast, have the opportunity to vote on the current state and PoH height by
signing a transaction into the PoH stream.
To become a Solana validator, a network node must deposit/lock-up some amount
of SOL in a contract. This SOL will not be accessible for a specific time
period. The precise duration of the staking lockup period has not been
determined. However we can consider three phases of this time for which
specific parameters will be necessary:
- *Warm-up period*: which SOL is deposited and inaccessible to the node,
however PoH transaction validation has not begun. Most likely on the order of
days to weeks
- *Validation period*: a minimum duration for which the deposited SOL will be
inaccessible, at risk of slashing (see slashing rules below) and earning
network rewards for the validator participation. Likely duration of months to a
year.
- *Cool-down period*: a duration of time following the submission of a
'withdrawal' transaction. During this period validation responsibilities have
been removed and the funds continue to be inaccessible. Accumulated rewards
should be delivered at the end of this period, along with the return of the
initial deposit.
Solana's trustless sense of time and ordering provided by its PoH data
structure, along with its
[avalanche](https://www.youtube.com/watch?v=qt_gDRXHrHQ&t=1s) data broadcast
and transmission design, should provide subsecond confirmation times that scale
with the log of the number of nodes in the network. This means we shouldn't
have to restrict the number of validating nodes with a prohibitive 'minimum
deposits' and expect nodes to be able to become validators with nominal amounts
of SOL staked. This should also render validation pools, a proposed solution
for economic censorship imposed by minimum staking amounts currently described
in Casper, unnecessary and remove the concern for needing to put slashable
stake at risk while relying on others to play by the rules.
2018-10-29 10:12:04 -07:00
### Stake-weighted Rewards
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
Rewards are expected to be paid out to active validators as a function of
validator activity and as a proportion of the percentage of SOL they have at
stake out of the entirety of the staking pool.
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
We expect to define a baseline annual validator payout/inflation rate based on
the total SOL deposited. E.g. 10% annual interest on SOL deposited with X total
SOL deposited as slashable on network. This is the same design as currently
proposed in Casper FFG which has additionally specifies how inflation rates
adjust as a function of total ETH deposited. Specifically, Casper validator
returns are proportional to the inverse square root of the total deposits and
initial annual rates are estimated as:
2018-10-22 08:49:28 -07:00
| Deposit Size | Annual Validator Interest |
2018-12-12 14:32:56 -08:00
|-------------=|--------------------------=|
2018-10-22 08:49:28 -07:00
| 2.5M ETH | 10.12% |
| 10M ETH | 5.00% |
| 20M ETH | 3.52% |
| 40M ETH | 2.48% |
2018-12-12 14:32:56 -08:00
This has the nice property of potentially incentivizing participation around a
target deposit size. Incentivisation of specific participation rates more
directly (rather than deposit size) may something also worth exploring.
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
The specifics of the Solana validator reward scheme are to be worked out in
parallel with a design for transaction fee assignment as well as our storage
mining reward scheme.
2018-10-22 08:49:28 -07:00
### Slashing rules
2018-10-29 10:12:04 -07:00
2018-12-12 14:32:56 -08:00
Unlike Proof of Work (PoW) where off-chain capital expenses are already
deployed at the time of block construction/voting, PoS systems require
capital-at-risk to prevent a logical/optimal strategy of multiple chain voting.
We intend to implement slashing rules which, if broken, result some amount of
the offending validator's deposited stake to be removed from circulation. Given
the ordering properties of the PoH data structure, we believe we can simplify
our slashing rules to the level of a voting lockout time assigned per vote.
I.e. Each vote has an associated lockout time (PoH duration) that represents a
duration by any additional vote from that validator must be in a PoH that
contains the original vote, or a portion of that validator's stake is
slashable. This duration time is a function of the initial vote PoH count and
all additional vote PoH counts. It will likely take the form:
Lockout<sub>i</sub>(PoH<sub>i</sub>, PoH<sub>j</sub>) = PoH<sub>j</sub> + K *
exp((PoH<sub>j</sub> - PoH<sub>i</sub>) / K)
Where PoH<sub>i</sub> is the height of the vote that the lockout is to be
applied to and PoH<sub>j</sub> is the height of the current vote on the same
fork. If the validator submits a vote on a different PoH fork on any
PoH<sub>k</sub> where k > j > i and PoH<sub>k</sub> < Lockout(PoH<sub>i</sub>,
PoH<sub>j</sub>), then a portion of that validator's stake is at risk of being
slashed.
In addition to the functional form lockout described above, early
implementation may be a numerical approximation based on a First In, First Out
(FIFO) data structure and the following logic:
2018-10-29 10:12:04 -07:00
- FIFO queue holding 32 votes per active validator
- new votes are pushed on top of queue (`push_front`)
- expired votes are popped off top (`pop_front`)
- as votes are pushed into the queue, the lockout of each queued vote doubles
- votes are removed from back of queue if `queue.len() > 32`
2018-12-12 14:32:56 -08:00
- the earliest and latest height that has been removed from the back of the
queue should be stored
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
It is likely that a reward will be offered as a % of the slashed amount to any
node that submits proof of this slashing condition being violated to the PoH.
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
#### Partial Slashing In the schema described so far, when a validator votes on
a given PoH stream, they are committing themselves to that fork for a time
determined by the vote lockout. An open question is whether validators will be
hesitant to begin voting on an available fork if the penalties are perceived
too harsh for an honest mistake or flipped bit.
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
One way to address this concern would be a partial slashing design that results
in a slashable amount as a function of either:
2018-10-29 10:12:04 -07:00
2018-12-12 14:32:56 -08:00
1) the fraction of validators, out of the total validator pool, that were also
slashed during the same time period (ala Casper), 2) the amount of time since
the vote was cast (e.g. a linearly increasing % of total deposited as slashable
amount over time), or both.
2018-10-29 10:12:04 -07:00
This is an area currently under exploration
2018-10-22 08:49:28 -07:00
2018-12-12 14:32:56 -08:00
### Penalties As previously discussed, annual validator reward rates are to be
specified as a function of total amount staked. The network rewards validators
who are online and actively participating in the validation process throughout
the entirety of their *validation period*. For validators that go offline/fail
to validate transactions during this period, their annual reward is effectively
reduced.
Similarly, we may consider an algorithmic reduction in a validator's active
amount staked amount in the case that they are offline. I.e. if a validator is
inactive for some amount of time, either due to a partition or otherwise, the
amount of their stake that is considered active (eligible to earn rewards)
may be reduced. This design would be structured to help long-lived partitions
to eventually reach finality on their respective chains as the % of non-voting
total stake is reduced over time until a super-majority can be achieved by the
active validators in each partition. Similarly, upon re-engaging, the active
amount staked will come back online at some defined rate. Different rates of
stake reduction may be considered depending on the size of the partition/active
set.