Skip to content

Commit

Permalink
implement second gossip check from state
Browse files Browse the repository at this point in the history
  • Loading branch information
StefanBratanov committed Jul 5, 2023
1 parent dd07f4a commit 92f4980
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,6 @@ public UInt64 computeTimeAtSlot(final UInt64 genesisTime, final UInt64 slot) {
return genesisTime.plus(slot.times(specConfig.getSecondsPerSlot()));
}

public UInt64 computeStartTimeAtEpoch(final UInt64 genesisTime, final UInt64 epoch) {
final UInt64 epochStartSlot = computeStartSlotAtEpoch(epoch);
return computeTimeAtSlot(genesisTime, epochStartSlot);
}

public UInt64 computeTimeAtSlot(final BeaconState state, final UInt64 slot) {
UInt64 slotsSinceGenesis = slot.minus(SpecConfig.GENESIS_SLOT);
return state.getGenesisTime().plus(slotsSinceGenesis.times(specConfig.getSecondsPerSlot()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,9 @@ public abstract AttestationWorthinessChecker createAttestationWorthinessChecker(
performSlotInclusionGossipValidation(
Attestation attestation, UInt64 genesisTime, UInt64 currentTimeMillis);

public abstract Optional<SlotInclusionGossipValidationResult>
performSlotInclusionGossipValidation(Attestation attestation, BeaconState state);

public enum SlotInclusionGossipValidationResult {
IGNORE,
SAVE_FOR_FUTURE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import tech.pegasys.teku.infrastructure.unsigned.UInt64;
import tech.pegasys.teku.spec.config.SpecConfig;
import tech.pegasys.teku.spec.datastructures.operations.Attestation;
import tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState;
import tech.pegasys.teku.spec.logic.common.helpers.BeaconStateAccessors;
import tech.pegasys.teku.spec.logic.common.helpers.MiscHelpers;
import tech.pegasys.teku.spec.logic.versions.altair.util.AttestationUtilAltair;
Expand All @@ -35,17 +36,9 @@ public AttestationUtilDeneb(
}

/**
*
*
* <ul>
* <li>[IGNORE] attestation.data.slot is equal to or earlier than the current_slot (with a
* MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e. attestation.data.slot <= current_slot
* (a client MAY queue future attestation for processing at the appropriate slot).
* <li>[IGNORE] the epoch of attestation.data.slot is either the current or previous epoch (with
* a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e.
* compute_epoch_at_slot(attestation.data.slot) in (get_previous_epoch(state),
* get_current_epoch(state))
* </ul>
* [IGNORE] attestation.data.slot is equal to or earlier than the current_slot (with a
* MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e. attestation.data.slot <= current_slot (a
* client MAY queue future attestation for processing at the appropriate slot).
*/
@Override
public Optional<SlotInclusionGossipValidationResult> performSlotInclusionGossipValidation(
Expand All @@ -55,36 +48,35 @@ public Optional<SlotInclusionGossipValidationResult> performSlotInclusionGossipV
&& isFromFarFuture(attestation, genesisTime, currentTimeMillis)) {
return Optional.of(SlotInclusionGossipValidationResult.IGNORE);
}
if (!isAttestationSlotCurrentOrPreviousEpoch(attestationSlot, genesisTime, currentTimeMillis)) {
return Optional.of(SlotInclusionGossipValidationResult.IGNORE);
}
if (isCurrentTimeBeforeMinimumAttestationBroadcastTime(
attestationSlot, genesisTime, currentTimeMillis)) {
return Optional.of(SlotInclusionGossipValidationResult.SAVE_FOR_FUTURE);
}
return Optional.empty();
}

/**
* [IGNORE] the epoch of aggregate.data.slot is either the current or previous epoch (with a
* MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e. compute_epoch_at_slot(aggregate.data.slot) in
* (get_previous_epoch(state), get_current_epoch(state))
*/
@Override
public Optional<SlotInclusionGossipValidationResult> performSlotInclusionGossipValidation(
final Attestation attestation, final BeaconState state) {
final UInt64 attestationEpoch = miscHelpers.computeEpochAtSlot(attestation.getData().getSlot());

if (attestationEpoch.isGreaterThanOrEqualTo(beaconStateAccessors.getPreviousEpoch(state))
&& attestationEpoch.isLessThanOrEqualTo(beaconStateAccessors.getCurrentEpoch(state))) {
return Optional.of(SlotInclusionGossipValidationResult.IGNORE);
}
return Optional.empty();
}

private boolean isAttestationSlotAfterCurrentTime(
final UInt64 attestationSlot, final UInt64 genesisTime, final UInt64 currentTimeMillis) {
final UInt64 attestationSlotTimeMillis =
secondsToMillis(miscHelpers.computeTimeAtSlot(genesisTime, attestationSlot));
return attestationSlotTimeMillis.isGreaterThan(
currentTimeMillis.plus(specConfig.getMaximumGossipClockDisparity()));
}

private boolean isAttestationSlotCurrentOrPreviousEpoch(
final UInt64 attestationSlot, final UInt64 genesisTime, final UInt64 currentTimeMillis) {
final UInt64 attestationEpoch = miscHelpers.computeEpochAtSlot(attestationSlot);
final UInt64 nextEpochStartTimeMillis =
secondsToMillis(miscHelpers.computeStartTimeAtEpoch(genesisTime, attestationEpoch.plus(1)));
final UInt64 previousEpochStartTimeMillis =
secondsToMillis(
miscHelpers.computeStartTimeAtEpoch(genesisTime, attestationEpoch.minusMinZero(1)));
return currentTimeMillis
.minusMinZero(specConfig.getMaximumGossipClockDisparity())
.isGreaterThanOrEqualTo(previousEpochStartTimeMillis)
&& currentTimeMillis.isLessThan(
nextEpochStartTimeMillis.plus(specConfig.getMaximumGossipClockDisparity()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ public Optional<SlotInclusionGossipValidationResult> performSlotInclusionGossipV
return Optional.empty();
}

@Override
public Optional<SlotInclusionGossipValidationResult> performSlotInclusionGossipValidation(
final Attestation attestation, final BeaconState state) {
return Optional.empty();
}

protected boolean isCurrentTimeBeforeMinimumAttestationBroadcastTime(
final UInt64 attestationSlot, final UInt64 genesisTime, final UInt64 currentTimeMillis) {
final UInt64 minimumBroadcastTimeMillis =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import tech.pegasys.teku.spec.datastructures.operations.AttestationData;
import tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState;
import tech.pegasys.teku.spec.logic.common.util.AsyncBLSSignatureVerifier;
import tech.pegasys.teku.spec.logic.common.util.AttestationUtil;
import tech.pegasys.teku.spec.logic.common.util.AttestationUtil.SlotInclusionGossipValidationResult;
import tech.pegasys.teku.storage.client.RecentChainData;

Expand Down Expand Up @@ -99,10 +100,11 @@ SafeFuture<InternalValidationResultWithState> singleOrAggregateAttestationChecks
final UInt64 genesisTime = recentChainData.getGenesisTime();
final UInt64 currentTimeMillis = recentChainData.getStore().getTimeMillis();

final AttestationUtil attestationUtil = spec.atSlot(data.getSlot()).getAttestationUtil();

final Optional<SlotInclusionGossipValidationResult> slotInclusionGossipValidationResult =
spec.atSlot(data.getSlot())
.getAttestationUtil()
.performSlotInclusionGossipValidation(attestation, genesisTime, currentTimeMillis);
attestationUtil.performSlotInclusionGossipValidation(
attestation, genesisTime, currentTimeMillis);

if (slotInclusionGossipValidationResult.isPresent()) {
switch (slotInclusionGossipValidationResult.get()) {
Expand Down Expand Up @@ -130,6 +132,20 @@ SafeFuture<InternalValidationResultWithState> singleOrAggregateAttestationChecks
return completedFuture(InternalValidationResultWithState.ignore());
}
final BeaconState state = maybeState.get();

final Optional<SlotInclusionGossipValidationResult>
slotInclusionGossipValidationWithStateResult =
attestationUtil.performSlotInclusionGossipValidation(attestation, state);

if (slotInclusionGossipValidationWithStateResult.isPresent()) {
switch (slotInclusionGossipValidationWithStateResult.get()) {
case IGNORE:
return completedFuture(InternalValidationResultWithState.ignore());
case SAVE_FOR_FUTURE:
break;
}
}

// The committee index is within the expected range
if (data.getIndex()
.isGreaterThanOrEqualTo(
Expand Down

0 comments on commit 92f4980

Please sign in to comment.