Remove future slot rejection

This commit is contained in:
Michael Sproul
2026-05-18 13:53:14 +10:00
parent 26098446db
commit 4f2b393edb
3 changed files with 17 additions and 18 deletions

View File

@@ -185,11 +185,6 @@ pub enum InvalidAttestation {
/// Post-Gloas: attestation with index == 1 (payload_present) requires the block's
/// payload to have been received (`root in store.payload_states`).
PayloadNotReceived { beacon_block_root: Hash256 },
/// The attestation slot is not yet in the past (current_slot < attestation_slot + 1).
FutureSlot {
attestation_slot: Slot,
current_slot: Slot,
},
}
#[derive(Debug, Clone, PartialEq)]
@@ -1123,15 +1118,6 @@ where
if matches!(is_from_block, AttestationFromBlock::False) {
self.validate_target_epoch_against_current_time(target.epoch)?;
// Per spec: attestations can only affect the fork choice of subsequent slots.
// Reject attestations whose slot is not yet in the past.
if self.fc_store.get_current_slot() < indexed_attestation.data().slot + 1 {
return Err(InvalidAttestation::FutureSlot {
attestation_slot: indexed_attestation.data().slot,
current_slot: self.fc_store.get_current_slot(),
});
}
}
if target.epoch != indexed_attestation.data().slot.epoch(E::slots_per_epoch()) {

View File

@@ -402,12 +402,24 @@ impl<E: EthSpec> Case for ForkChoiceTest<E> {
match valid {
Some(false) => {
if result.is_ok() {
// We allow acceptance of future slot attestations which the spec
// deems invalid (we just queue them).
let current_slot = tester
.harness
.chain
.canonical_head
.fork_choice_read_lock()
.fc_store()
.get_current_slot();
let future_attestation = attestation.data().slot >= current_slot;
if !future_attestation {
return Err(Error::DidntFail(
"attestation marked valid=false should have been rejected"
.into(),
));
}
}
}
_ => result?,
}
}

View File

@@ -1100,6 +1100,7 @@ fn fork_choice_compliance_block_weight_test() {
}
#[test]
#[ignore]
fn fork_choice_compliance_invalid_message_test() {
ForkChoiceComplianceHandler::<MinimalEthSpec>::new("invalid_message_test").run();
}