mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-01-12 03:34:20 +00:00
add asserts to ensure that attestation slot must match the target epoch
This commit is contained in:
parent
cf5b48ff21
commit
432257659e
@ -1482,6 +1482,7 @@ def process_attestation(state: BeaconState, attestation: Attestation) -> None:
|
|||||||
data = attestation.data
|
data = attestation.data
|
||||||
assert data.index < get_committee_count_at_slot(state, data.slot)
|
assert data.index < get_committee_count_at_slot(state, data.slot)
|
||||||
assert data.target.epoch in (get_previous_epoch(state), get_current_epoch(state))
|
assert data.target.epoch in (get_previous_epoch(state), get_current_epoch(state))
|
||||||
|
assert data.target.epoch == compute_epoch_at_slot(data.slot)
|
||||||
assert data.slot + MIN_ATTESTATION_INCLUSION_DELAY <= state.slot <= data.slot + SLOTS_PER_EPOCH
|
assert data.slot + MIN_ATTESTATION_INCLUSION_DELAY <= state.slot <= data.slot + SLOTS_PER_EPOCH
|
||||||
|
|
||||||
committee = get_beacon_committee(state, data.slot, data.index)
|
committee = get_beacon_committee(state, data.slot, data.index)
|
||||||
|
@ -307,6 +307,7 @@ def on_attestation(store: Store, attestation: Attestation) -> None:
|
|||||||
# Use GENESIS_EPOCH for previous when genesis to avoid underflow
|
# Use GENESIS_EPOCH for previous when genesis to avoid underflow
|
||||||
previous_epoch = current_epoch - 1 if current_epoch > GENESIS_EPOCH else GENESIS_EPOCH
|
previous_epoch = current_epoch - 1 if current_epoch > GENESIS_EPOCH else GENESIS_EPOCH
|
||||||
assert target.epoch in [current_epoch, previous_epoch]
|
assert target.epoch in [current_epoch, previous_epoch]
|
||||||
|
assert target.epoch == compute_epoch_at_slot(attestation.data.slot)
|
||||||
|
|
||||||
# Attestations target be for a known block. If target block is unknown, delay consideration until the block is found
|
# Attestations target be for a known block. If target block is unknown, delay consideration until the block is found
|
||||||
assert target.root in store.blocks
|
assert target.root in store.blocks
|
||||||
|
@ -84,6 +84,29 @@ def test_on_attestation_past_epoch(spec, state):
|
|||||||
run_on_attestation(spec, state, store, attestation, False)
|
run_on_attestation(spec, state, store, attestation, False)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_on_attestation_mismatched_target_and_slot(spec, state):
|
||||||
|
store = spec.get_genesis_store(state)
|
||||||
|
spec.on_tick(store, store.time + spec.SECONDS_PER_SLOT * spec.SLOTS_PER_EPOCH)
|
||||||
|
|
||||||
|
block = build_empty_block_for_next_slot(spec, state)
|
||||||
|
signed_block = state_transition_and_sign_block(spec, state, block)
|
||||||
|
|
||||||
|
# store block in store
|
||||||
|
spec.on_block(store, signed_block)
|
||||||
|
|
||||||
|
attestation = get_valid_attestation(spec, state, slot=block.slot)
|
||||||
|
attestation.data.target.epoch += 1
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
assert attestation.data.target.epoch == spec.GENESIS_EPOCH + 1
|
||||||
|
assert spec.compute_epoch_at_slot(attestation.data.slot) == spec.GENESIS_EPOCH
|
||||||
|
assert spec.compute_epoch_at_slot(spec.get_current_slot(store)) == spec.GENESIS_EPOCH + 1
|
||||||
|
|
||||||
|
run_on_attestation(spec, state, store, attestation, False)
|
||||||
|
|
||||||
|
|
||||||
@with_all_phases
|
@with_all_phases
|
||||||
@spec_state_test
|
@spec_state_test
|
||||||
def test_on_attestation_target_not_in_store(spec, state):
|
def test_on_attestation_target_not_in_store(spec, state):
|
||||||
|
@ -177,6 +177,20 @@ def test_invalid_index(spec, state):
|
|||||||
yield from run_attestation_processing(spec, state, attestation, False)
|
yield from run_attestation_processing(spec, state, attestation, False)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_mismatched_target_and_slot(spec, state):
|
||||||
|
next_epoch(spec, state)
|
||||||
|
next_epoch(spec, state)
|
||||||
|
|
||||||
|
attestation = get_valid_attestation(spec, state)
|
||||||
|
attestation.data.slot = attestation.data.slot - spec.SLOTS_PER_EPOCH
|
||||||
|
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation, False)
|
||||||
|
|
||||||
|
|
||||||
@with_all_phases
|
@with_all_phases
|
||||||
@spec_state_test
|
@spec_state_test
|
||||||
def test_old_target_epoch(spec, state):
|
def test_old_target_epoch(spec, state):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user