70 lines
2.1 KiB
Markdown
70 lines
2.1 KiB
Markdown
## 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)
|
|
|
|
signingInfo, found = getValidatorSigningInfo(address)
|
|
if !found {
|
|
signingInfo = ValidatorSigningInfo {
|
|
StartHeight : CurrentHeight,
|
|
IndexOffset : 0,
|
|
JailedUntil : time.Unix(0, 0),
|
|
MissedBloskCounter : 0
|
|
}
|
|
setValidatorSigningInfo(signingInfo)
|
|
}
|
|
|
|
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
|
|
```
|