cosmos-sdk/docs/spec/slashing/hooks.md

2.1 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)

  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