cosmos-sdk/docs/spec/staking/end_block.md

1.9 KiB

End-Block

Two staking activities are intended to be processed in the application end-block.

  • inform Tendermint of validator set changes
  • process and set atom inflation

Validator Set Changes

The Tendermint validator set may be updated by state transitions that run at the end of every block. The Tendermint validator set may be changed by validators either being revoked due to inactivity/unexpected behaviour (covered in slashing) or changed in validator power. Determining which validator set changes must be made occurs during staking transactions (and slashing transactions) - during end-block the already accounted changes are applied and the changes cleared

EndBlock() ValidatorSetChanges
    vsc = GetTendermintUpdates()
    ClearTendermintUpdates()
    return vsc

Inflation

The atom inflation rate is changed once per hour based on the current and historic bond ratio

processProvisions():
    hrsPerYr = 8766   // as defined by a julian year of 365.25 days
    
    time = BFTTime()
    if time > pool.InflationLastTime + ProvisionTimeout 
        pool.InflationLastTime = time
        pool.Inflation = nextInflation(hrsPerYr).Round(1000000000)
        
        provisions = pool.Inflation * (pool.TotalSupply / hrsPerYr)
        
        pool.LooseTokens += provisions
        feePool += LooseTokens
        
        setPool(pool)

nextInflation(hrsPerYr rational.Rat):
    if pool.TotalSupply > 0 
        bondedRatio = pool.BondedPool / pool.TotalSupply
    else 
        bondedRation = 0
   
    inflationRateChangePerYear = (1 - bondedRatio / params.GoalBonded) * params.InflationRateChange
    inflationRateChange = inflationRateChangePerYear / hrsPerYr

    inflation = pool.Inflation + inflationRateChange
    if inflation > params.InflationMax then inflation = params.InflationMax
	
    if inflation < params.InflationMin then inflation = params.InflationMin
	
    return inflation