/// <summary> /// Slash the validator with index ``slashed_index``. /// </summary> public void SlashValidator(BeaconState state, ValidatorIndex slashedIndex, ValidatorIndex?optionalWhistleblowerIndex) { RewardsAndPenalties rewardsAndPenalties = _rewardsAndPenaltiesOptions.CurrentValue; StateListLengths stateListLengths = _stateListLengthOptions.CurrentValue; Epoch epoch = _beaconStateAccessor.GetCurrentEpoch(state); InitiateValidatorExit(state, slashedIndex); Validator validator = state.Validators[(int)slashedIndex]; validator.SetSlashed(); Epoch slashedWithdrawableEpoch = (Epoch)(epoch + stateListLengths.EpochsPerSlashingsVector); Epoch withdrawableEpoch = Epoch.Max(validator.WithdrawableEpoch, slashedWithdrawableEpoch); validator.SetWithdrawableEpoch(withdrawableEpoch); Epoch slashingsIndex = (Epoch)(epoch % stateListLengths.EpochsPerSlashingsVector); state.SetSlashings(slashingsIndex, validator.EffectiveBalance); Gwei slashingPenalty = validator.EffectiveBalance / rewardsAndPenalties.MinimumSlashingPenaltyQuotient; DecreaseBalance(state, slashedIndex, slashingPenalty); // Apply proposer and whistleblower rewards ValidatorIndex proposerIndex = _beaconStateAccessor.GetBeaconProposerIndex(state); ValidatorIndex whistleblowerIndex = optionalWhistleblowerIndex ?? proposerIndex; Gwei whistleblowerReward = validator.EffectiveBalance / rewardsAndPenalties.WhistleblowerRewardQuotient; Gwei proposerReward = whistleblowerReward / rewardsAndPenalties.ProposerRewardQuotient; IncreaseBalance(state, proposerIndex, proposerReward); IncreaseBalance(state, whistleblowerIndex, whistleblowerReward - proposerReward); }
public bool IsProposer(BeaconState state, ValidatorIndex validatorIndex) { ValidatorIndex stateProposerIndex = _beaconStateAccessor.GetBeaconProposerIndex(state); return(stateProposerIndex.Equals(validatorIndex)); }