add process_attestation tests to cover various timing and correctness scenarios
This commit is contained in:
parent
b029c75d88
commit
1ba4917119
|
@ -44,11 +44,8 @@ def run_attestation_processing(spec, state, attestation, valid=True):
|
||||||
else:
|
else:
|
||||||
assert len(state.previous_epoch_attestations) == previous_epoch_count + 1
|
assert len(state.previous_epoch_attestations) == previous_epoch_count + 1
|
||||||
else:
|
else:
|
||||||
for index in spec.get_attesting_indices(state, attestation.data, attestation.aggregation_bits):
|
# After accounting reform, there are cases when processing an attestation does not result in any flag updates
|
||||||
if attestation.data.target.epoch == spec.get_current_epoch(state):
|
pass
|
||||||
assert state.current_epoch_participation[index][spec.TIMELY_TARGET_FLAG]
|
|
||||||
else:
|
|
||||||
assert state.previous_epoch_participation[index][spec.TIMELY_TARGET_FLAG]
|
|
||||||
|
|
||||||
# yield post-state
|
# yield post-state
|
||||||
yield 'post', state
|
yield 'post', state
|
||||||
|
|
|
@ -2,10 +2,13 @@ from eth2spec.test.context import (
|
||||||
spec_state_test,
|
spec_state_test,
|
||||||
always_bls, never_bls,
|
always_bls, never_bls,
|
||||||
with_all_phases,
|
with_all_phases,
|
||||||
|
with_all_phases_except,
|
||||||
spec_test,
|
spec_test,
|
||||||
low_balances,
|
low_balances,
|
||||||
with_custom_state,
|
with_custom_state,
|
||||||
single_phase)
|
single_phase,
|
||||||
|
PHASE1,
|
||||||
|
)
|
||||||
from eth2spec.test.helpers.attestations import (
|
from eth2spec.test.helpers.attestations import (
|
||||||
run_attestation_processing,
|
run_attestation_processing,
|
||||||
get_valid_attestation,
|
get_valid_attestation,
|
||||||
|
@ -329,3 +332,157 @@ def test_too_few_aggregation_bits(spec, state):
|
||||||
attestation.aggregation_bits = attestation.aggregation_bits[:-1]
|
attestation.aggregation_bits = attestation.aggregation_bits[:-1]
|
||||||
|
|
||||||
yield from run_attestation_processing(spec, state, attestation, False)
|
yield from run_attestation_processing(spec, state, attestation, False)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Full correct atttestation contents at different slot inclusions
|
||||||
|
#
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_correct_min_inclusion_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=True)
|
||||||
|
next_slots(spec, state, spec.MIN_ATTESTATION_INCLUSION_DELAY)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_correct_sqrt_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=True, on_time=False)
|
||||||
|
next_slots(spec, state, spec.integer_squareroot(spec.SLOTS_PER_EPOCH))
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_correct_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=True, on_time=False)
|
||||||
|
next_slots(spec, state, spec.SLOTS_PER_EPOCH)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Incorrect head but correct source/target at different slot inclusions
|
||||||
|
#
|
||||||
|
|
||||||
|
@with_all_phases_except([PHASE1])
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_min_inclusion_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False)
|
||||||
|
next_slots(spec, state, spec.MIN_ATTESTATION_INCLUSION_DELAY)
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_sqrt_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.integer_squareroot(spec.SLOTS_PER_EPOCH))
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.SLOTS_PER_EPOCH)
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Incorrect head and target but correct source at different slot inclusions
|
||||||
|
#
|
||||||
|
|
||||||
|
@with_all_phases_except([PHASE1])
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_and_target_min_inclusion_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False)
|
||||||
|
next_slots(spec, state, spec.MIN_ATTESTATION_INCLUSION_DELAY)
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_and_target_sqrt_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.integer_squareroot(spec.SLOTS_PER_EPOCH))
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_head_and_target_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.SLOTS_PER_EPOCH)
|
||||||
|
|
||||||
|
attestation.data.beacon_block_root = b'\x42' * 32
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Correct head and source but incorrect target at different slot inclusions
|
||||||
|
#
|
||||||
|
|
||||||
|
@with_all_phases_except([PHASE1])
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_target_min_inclusion_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False)
|
||||||
|
next_slots(spec, state, spec.MIN_ATTESTATION_INCLUSION_DELAY)
|
||||||
|
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_target_sqrt_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.integer_squareroot(spec.SLOTS_PER_EPOCH))
|
||||||
|
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
||||||
|
|
||||||
|
@with_all_phases
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_target_epoch_delay(spec, state):
|
||||||
|
attestation = get_valid_attestation(spec, state, signed=False, on_time=False)
|
||||||
|
next_slots(spec, state, spec.SLOTS_PER_EPOCH)
|
||||||
|
|
||||||
|
attestation.data.target.root = b'\x42' * 32
|
||||||
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
yield from run_attestation_processing(spec, state, attestation)
|
||||||
|
|
Loading…
Reference in New Issue