EpochManager
Finalizing an epoch
At the last block of epoch T
, EpochManager
computes EpochInfo
for epoch T+2
, which
is defined by EpochInfo
for T+1
and the information aggregated from blocks of epoch T
.
EpochInfo
is all the information that EpochManager
stores for the epoch, which is:
epoch_height
: epoch height (T+2
)validators
: the list of validators selected for epochT+2
validator_to_index
: Mapping from account id to index invalidators
block_producers_settlement
: defines the mapping from height to block producerchunk_producers_settlement
: defines the mapping from height and shard id to chunk producerhidden_validators_settlement
: TODOfishermen
,fishermen_to_index
: TODO. disabled on mainnet through a largefishermen_threshold
in configstake_change
: TODOvalidator_reward
: validator reward for epochT
validator_kickout
: see Kickout setminted_amount
: minted tokens in epochT
seat_price
: seat price of the epochprotocol_version
: TODO
Aggregating blocks of the epoch computes the following sets:
block_stats
/chunk_stats
: uptime statistics in the form ofproduced
andexpected
blocks/chunks for each validator ofT
proposals
: stake proposals made in epochT
. If an account made multiple proposals, the last one is used.slashes
: see Slash set
Slash set
NOTE: slashing is currently disabled. The following is the current design, which can change.
Slash sets are maintained on block basis. If a validator gets slashed in epoch T
, subsequent blocks of epochs T
and
T+1
keep it in their slash sets. At the end of epoch T
, the slashed validator is also added to kickout[T+2]
.
Proposals from blocks in slash sets are ignored.
It's kept in the slash set (and kickout sets) for two or three epochs depending on whether it was going to be a validator in T+1
:
- Common case:
v
is invalidators[T]
and invalidators[T+1]
- proposals from
v
inT
,T+1
andT+2
are ignored v
is added tokickout[T+2]
,kickout[T+3]
andkickout[T+4]
as slashedv
can stake again starting with the first block ofT+3
.
- proposals from
- If
v
is invalidators[T]
but not invalidators[T+1]
(e.g. if it unstaked inT-1
)- proposals from
v
inT
andT+1
are ignored v
is added tokickout[T+2]
andkickout[T+3]
as slashedv
can make a proposal inT+2
to become a validator inT+4
- proposals from
- If
v
is invalidators[T-1]
but not invalidators[T]
(e.g. did slashable behavior right before rotating out)- proposals from
v
inT
andT+1
are ignored v
is added tokickout[T+2]
andkickout[T+3]
as slashedv
can make a proposal inT+2
to become a validator inT+4
- proposals from
Computing EpochInfo
Kickout set
kickout[T+2]
contains validators of epoch T+1
that stop being validators in T+2
, and also accounts that are not
necessarily validators of T+1
, but are kept in slashing sets due to the rule described above.
kickout[T+2]
is computed the following way:
Slashed
: accounts in the slash set of the last block inT
Unstaked
: accounts that remove their stake in epochT
, if their stake is non-zero for epochT+1
NotEnoughBlocks/NotEnoughChunks
: For each validator compute the ratio of blocks produced to expected blocks produced (same with chunks produced/expected). If the percentage is belowblock_producer_kickout_threshold
(chunk_producer_kickout_threshold
), the validator is kicked out.- Exception: If all validators of
T
are either inkickout[T+1]
or to be kicked out, we don't kick out the validator with the maximum number of blocks produced. If there are multiple, we choose the one with lowest validator id in the epoch.
- Exception: If all validators of
NotEnoughStake
: computed after validator selection. Accounts who have stake in epochT+1
, but don't meet stake threshold for epochT+2
.DidNotGetASeat
: computed after validator selection. Accounts who have stake in epochT+1
, meet stake threshold for epochT+2
, but didn't get any seats.
Processing proposals
The set of proposals is processed by the validator selection algorithm, but before that, the set of proposals is adjusted the following way:
- If an account is in the slash set as of the end of
T
, or gets kicked out forNotEnoughBlocks/NotEnoughChunks
in epochT
, its proposal is ignored. - If a validator is in
validators[T+1]
, and didn't make a proposal, add an implicit proposal with its stake inT+1
. - If a validator is in both
validators[T]
andvalidators[T+1]
, and made a proposal inT
(including implicit), then its reward for epochT
is automatically added to the proposal.
The adjusted set of proposals is used to compute the seat price, and determine validators
,block_producers_settlement
,
chunk_producers_settlement
sets. This algorithm is described in Economics.
Validator reward
Rewards calculation is described in the Economics section.