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 /// Post-Gloas: attestation with index == 1 (payload_present) requires the block's
/// payload to have been received (`root in store.payload_states`). /// payload to have been received (`root in store.payload_states`).
PayloadNotReceived { beacon_block_root: Hash256 }, 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)] #[derive(Debug, Clone, PartialEq)]
@@ -1123,15 +1118,6 @@ where
if matches!(is_from_block, AttestationFromBlock::False) { if matches!(is_from_block, AttestationFromBlock::False) {
self.validate_target_epoch_against_current_time(target.epoch)?; 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()) { if target.epoch != indexed_attestation.data().slot.epoch(E::slots_per_epoch()) {

View File

@@ -402,10 +402,22 @@ impl<E: EthSpec> Case for ForkChoiceTest<E> {
match valid { match valid {
Some(false) => { Some(false) => {
if result.is_ok() { if result.is_ok() {
return Err(Error::DidntFail( // We allow acceptance of future slot attestations which the spec
"attestation marked valid=false should have been rejected" // deems invalid (we just queue them).
.into(), 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?, _ => result?,

View File

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