Staking and slashing
Stake invariant
Account
has two fields representing its tokens: amount
and locked
. amount + locked
is the total number of
tokens an account has: locking/unlocking actions involve transferring balance between the two fields, and slashing
is done by subtracting from the locked
value.
On a stake action the balance gets locked immediately (but the locked balance can only increase), and the stake proposal is passed to the epoch manager. Proposals get accumulated during an epoch and get processed all at once when an epoch is finalized. Unlocking only happens at the start of an epoch.
Account's stake is defined per epoch and is stored in EpochInfo
's validators
and fishermen
sets. locked
is always
equal to the maximum of the last three stakes and the highest proposal in the current epoch.
Returning stake
locked
is the number of tokens locked for staking, it's computed the following way:
- initially it's the value in genesis or
0
for new accounts - on a staking proposal with a value higher than
locked
, it increases to that value - at the start of each epoch it's recomputed:
- consider the most recent 3 epochs
- for non-slashed accounts, take the maximum of their stakes in those epochs
- if an account made a proposal in the block that starts the epoch, also take the maximum with the proposal value
- change
locked
to the resulting value (and updateamount
so thatamount + locked
stays the same)
Slashing
TODO.