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
0for 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
lockedto the resulting value (and updateamountso thatamount + lockedstays the same)
Slashing
TODO.