use of tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair in project teku by ConsenSys.
the class BlockProcessorAltair method processSyncAggregate.
@Override
public void processSyncAggregate(final MutableBeaconState baseState, final SyncAggregate aggregate, final BLSSignatureVerifier signatureVerifier) throws BlockProcessingException {
final MutableBeaconStateAltair state = MutableBeaconStateAltair.required(baseState);
final List<BLSPublicKey> participantPubkeys = new ArrayList<>();
final List<BLSPublicKey> idlePubkeys = new ArrayList<>();
for (int i = 0; i < specConfigAltair.getSyncCommitteeSize(); i++) {
final BLSPublicKey publicKey = syncCommitteeUtil.getCurrentSyncCommitteeParticipantPubKey(state, i);
if (aggregate.getSyncCommitteeBits().getBit(i)) {
participantPubkeys.add(publicKey);
} else {
idlePubkeys.add(publicKey);
}
}
final UInt64 previousSlot = state.getSlot().minusMinZero(1);
final Bytes32 domain = beaconStateAccessors.getDomain(state.getForkInfo(), Domain.SYNC_COMMITTEE, miscHelpers.computeEpochAtSlot(previousSlot));
final Bytes32 signingRoot = miscHelpersAltair.computeSigningRoot(beaconStateAccessors.getBlockRootAtSlot(state, previousSlot), domain);
if (!eth2FastAggregateVerify(signatureVerifier, participantPubkeys, signingRoot, aggregate.getSyncCommitteeSignature().getSignature())) {
throw new BlockProcessingException("Invalid sync committee signature in " + aggregate);
}
// Compute participant and proposer rewards
final UInt64 totalActiveIncrements = beaconStateAccessors.getTotalActiveBalance(state).dividedBy(specConfig.getEffectiveBalanceIncrement());
final UInt64 totalBaseRewards = beaconStateAccessorsAltair.getBaseRewardPerIncrement(state).times(totalActiveIncrements);
final UInt64 maxParticipantRewards = totalBaseRewards.times(SYNC_REWARD_WEIGHT).dividedBy(WEIGHT_DENOMINATOR).dividedBy(specConfig.getSlotsPerEpoch());
final UInt64 participantReward = maxParticipantRewards.dividedBy(specConfigAltair.getSyncCommitteeSize());
final UInt64 proposerReward = participantReward.times(PROPOSER_WEIGHT).dividedBy(WEIGHT_DENOMINATOR.minus(PROPOSER_WEIGHT));
// Apply participant and proposer rewards
participantPubkeys.stream().map(pubkey -> validatorsUtil.getValidatorIndex(state, pubkey).orElseThrow()).forEach(participantIndex -> beaconStateMutators.increaseBalance(state, participantIndex, participantReward));
UInt64 totalProposerReward = proposerReward.times(participantPubkeys.size());
beaconStateMutators.increaseBalance(state, beaconStateAccessors.getBeaconProposerIndex(state), totalProposerReward);
// impose penalties for any idle validators
idlePubkeys.stream().map(pubkey -> validatorsUtil.getValidatorIndex(state, pubkey).orElseThrow()).forEach(participantIndex -> beaconStateMutators.decreaseBalance(state, participantIndex, participantReward));
}
use of tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair in project teku by ConsenSys.
the class BlockProcessorAltair method processNewValidator.
@Override
protected void processNewValidator(final MutableBeaconState genericState, final Deposit deposit) {
super.processNewValidator(genericState, deposit);
final MutableBeaconStateAltair state = MutableBeaconStateAltair.required(genericState);
state.getPreviousEpochParticipation().append(SszByte.ZERO);
state.getCurrentEpochParticipation().append(SszByte.ZERO);
state.getInactivityScores().append(SszUInt64.ZERO);
}
use of tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair in project teku by ConsenSys.
the class EpochProcessorAltair method processSyncCommitteeUpdates.
@Override
public void processSyncCommitteeUpdates(final MutableBeaconState genericState) {
final UInt64 nextEpoch = beaconStateAccessors.getCurrentEpoch(genericState).increment();
if (nextEpoch.mod(specConfigAltair.getEpochsPerSyncCommitteePeriod()).isZero()) {
final MutableBeaconStateAltair state = MutableBeaconStateAltair.required(genericState);
state.setCurrentSyncCommittee(state.getNextSyncCommittee());
state.setNextSyncCommittee(beaconStateAccessorsAltair.getNextSyncCommittee(state));
}
}
use of tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair in project teku by ConsenSys.
the class EpochProcessorAltair method processInactivityUpdates.
@Override
public void processInactivityUpdates(final MutableBeaconState baseState, final ValidatorStatuses validatorStatuses) {
if (beaconStateAccessors.getCurrentEpoch(baseState).equals(SpecConfig.GENESIS_EPOCH)) {
return;
}
final MutableBeaconStateAltair state = MutableBeaconStateAltair.required(baseState);
final SszMutableUInt64List inactivityScores = state.getInactivityScores();
final List<ValidatorStatus> statuses = validatorStatuses.getStatuses();
final boolean isInInactivityLeak = beaconStateAccessors.isInactivityLeak(state);
for (int i = 0; i < statuses.size(); i++) {
final ValidatorStatus validatorStatus = statuses.get(i);
if (!validatorStatus.isEligibleValidator()) {
continue;
}
// Increase inactivity score of inactive validators
final UInt64 currentScore = inactivityScores.getElement(i);
UInt64 newScore;
if (validatorStatus.isNotSlashed() && validatorStatus.isPreviousEpochTargetAttester()) {
newScore = currentScore.minusMinZero(1);
} else {
newScore = currentScore.plus(specConfigAltair.getInactivityScoreBias());
}
// Decrease the score of all validators for forgiveness when not during a leak
if (!isInInactivityLeak) {
newScore = newScore.minusMinZero(specConfigAltair.getInactivityScoreRecoveryRate());
}
if (!currentScore.equals(newScore)) {
inactivityScores.setElement(i, newScore);
}
}
}
use of tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair in project teku by ConsenSys.
the class EpochProcessorAltair method processParticipationUpdates.
/**
* Corresponds to process_participation_flag_updates in beacon-chain spec
*
* @param genericState The state to process
* @see <a
* href="https://github.com/ethereum/eth2.0-specs/blob/master/specs/altair/beacon-chain.md#participation-flags-updates">Altair
* Participation Flags updates</a>
*/
@Override
public void processParticipationUpdates(final MutableBeaconState genericState) {
final MutableBeaconStateAltair state = MutableBeaconStateAltair.required(genericState);
state.setPreviousEpochParticipation(state.getCurrentEpochParticipation());
// Reset current epoch participation flags
state.getCurrentEpochParticipation().clear();
state.getCurrentEpochParticipation().setAll(SszByte.ZERO, state.getValidators().size());
}
Aggregations