1.8 KiB
Hooks
In this section we describe the "hooks" - slashing module code that runs when other events happen.
Validator Bonded
Upon successful bonding of a validator (a given validator entering the "bonded" state,
which may happen on delegation, on unjailing, etc), we create a new SlashingPeriod
structure for the
now-bonded validator, which StartHeight
of the current block, EndHeight
of 0
(sentinel value for not-yet-ended),
and SlashedSoFar
of 0
:
onValidatorBonded(address sdk.ValAddress)
slashingPeriod = SlashingPeriod{
ValidatorAddr : address,
StartHeight : CurrentHeight,
EndHeight : 0,
SlashedSoFar : 0,
}
setSlashingPeriod(slashingPeriod)
return
Validator Unbonded
When a validator is unbonded, we update the in-progress SlashingPeriod
with the current block as the EndHeight
:
onValidatorUnbonded(address sdk.ValAddress)
slashingPeriod = getSlashingPeriod(address, CurrentHeight)
slashingPeriod.EndHeight = CurrentHeight
setSlashingPeriod(slashingPeriod)
return
Validator Slashed
When a validator is slashed, we look up the appropriate SlashingPeriod
based on the validator
address and the time of infraction, cap the fraction slashed as max(SlashFraction, SlashedSoFar)
(which may be 0
), and update the SlashingPeriod
with the increased SlashedSoFar
:
beforeValidatorSlashed(address sdk.ValAddress, fraction sdk.Rat, infractionHeight int64)
slashingPeriod = getSlashingPeriod(address, infractionHeight)
totalToSlash = max(slashingPeriod.SlashedSoFar, fraction)
slashingPeriod.SlashedSoFar = totalToSlash
setSlashingPeriod(slashingPeriod)
remainderToSlash = slashingPeriod.SlashedSoFar - totalToSlash
fraction = remainderToSlash
continue with slashing