github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/epoch/precompute/slashing.go (about)

     1  package precompute
     2  
     3  import (
     4  	types "github.com/prysmaticlabs/eth2-types"
     5  	"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
     6  	iface "github.com/prysmaticlabs/prysm/beacon-chain/state/interface"
     7  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     8  	"github.com/prysmaticlabs/prysm/shared/mathutil"
     9  	"github.com/prysmaticlabs/prysm/shared/params"
    10  )
    11  
    12  // ProcessSlashingsPrecompute processes the slashed validators during epoch processing.
    13  // This is an optimized version by passing in precomputed total epoch balances.
    14  func ProcessSlashingsPrecompute(state iface.BeaconState, pBal *Balance) error {
    15  	currentEpoch := helpers.CurrentEpoch(state)
    16  	exitLength := params.BeaconConfig().EpochsPerSlashingsVector
    17  
    18  	// Compute the sum of state slashings
    19  	slashings := state.Slashings()
    20  	totalSlashing := uint64(0)
    21  	for _, slashing := range slashings {
    22  		totalSlashing += slashing
    23  	}
    24  
    25  	minSlashing := mathutil.Min(totalSlashing*params.BeaconConfig().ProportionalSlashingMultiplier, pBal.ActiveCurrentEpoch)
    26  	epochToWithdraw := currentEpoch + exitLength/2
    27  
    28  	var hasSlashing bool
    29  	// Iterate through validator list in state, stop until a validator satisfies slashing condition of current epoch.
    30  	err := state.ReadFromEveryValidator(func(idx int, val iface.ReadOnlyValidator) error {
    31  		correctEpoch := epochToWithdraw == val.WithdrawableEpoch()
    32  		if val.Slashed() && correctEpoch {
    33  			hasSlashing = true
    34  		}
    35  		return nil
    36  	})
    37  	if err != nil {
    38  		return err
    39  	}
    40  	// Exit early if there's no meaningful slashing to process.
    41  	if !hasSlashing {
    42  		return nil
    43  	}
    44  
    45  	increment := params.BeaconConfig().EffectiveBalanceIncrement
    46  	validatorFunc := func(idx int, val *ethpb.Validator) (bool, *ethpb.Validator, error) {
    47  		correctEpoch := epochToWithdraw == val.WithdrawableEpoch
    48  		if val.Slashed && correctEpoch {
    49  			penaltyNumerator := val.EffectiveBalance / increment * minSlashing
    50  			penalty := penaltyNumerator / pBal.ActiveCurrentEpoch * increment
    51  			if err := helpers.DecreaseBalance(state, types.ValidatorIndex(idx), penalty); err != nil {
    52  				return false, val, err
    53  			}
    54  			return true, val, nil
    55  		}
    56  		return false, val, nil
    57  	}
    58  
    59  	return state.ApplyToEveryValidator(validatorFunc)
    60  }