mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-02-17 13:06:34 +00:00
Merge pull request #2556 from ralexstokes/add-randomized-testing-for-altair-inactivity-scores
Add randomized testing for altair inactivity scores
This commit is contained in:
commit
70d4ddf613
@ -18,6 +18,7 @@ from eth2spec.test.helpers.epoch_processing import (
|
|||||||
from eth2spec.test.helpers.random import (
|
from eth2spec.test.helpers.random import (
|
||||||
randomize_attestation_participation,
|
randomize_attestation_participation,
|
||||||
randomize_previous_epoch_participation,
|
randomize_previous_epoch_participation,
|
||||||
|
randomize_state,
|
||||||
)
|
)
|
||||||
from eth2spec.test.helpers.rewards import leaking
|
from eth2spec.test.helpers.rewards import leaking
|
||||||
|
|
||||||
@ -321,3 +322,58 @@ def test_some_exited_full_random_leaking(spec, state):
|
|||||||
|
|
||||||
# Check still in leak
|
# Check still in leak
|
||||||
assert spec.is_in_inactivity_leak(state)
|
assert spec.is_in_inactivity_leak(state)
|
||||||
|
|
||||||
|
|
||||||
|
def _run_randomized_state_test_for_inactivity_updates(spec, state, rng=Random(13377331)):
|
||||||
|
randomize_inactivity_scores(spec, state, rng=rng)
|
||||||
|
randomize_state(spec, state, rng=rng)
|
||||||
|
|
||||||
|
exited_validators = get_exited_validators(spec, state)
|
||||||
|
exited_but_not_slashed = []
|
||||||
|
for index in exited_validators:
|
||||||
|
validator = state.validators[index]
|
||||||
|
if validator.slashed:
|
||||||
|
continue
|
||||||
|
exited_but_not_slashed.append(index)
|
||||||
|
|
||||||
|
assert len(exited_but_not_slashed) > 0
|
||||||
|
|
||||||
|
some_exited_validator = exited_but_not_slashed[0]
|
||||||
|
|
||||||
|
pre_score_for_exited_validator = state.inactivity_scores[some_exited_validator]
|
||||||
|
|
||||||
|
assert pre_score_for_exited_validator != 0
|
||||||
|
|
||||||
|
assert len(set(state.inactivity_scores)) > 1
|
||||||
|
|
||||||
|
yield from run_inactivity_scores_test(spec, state)
|
||||||
|
|
||||||
|
post_score_for_exited_validator = state.inactivity_scores[some_exited_validator]
|
||||||
|
assert pre_score_for_exited_validator == post_score_for_exited_validator
|
||||||
|
|
||||||
|
|
||||||
|
@with_altair_and_later
|
||||||
|
@spec_state_test
|
||||||
|
def test_randomized_state(spec, state):
|
||||||
|
"""
|
||||||
|
This test ensures that once a validator has exited,
|
||||||
|
their inactivity score does not change.
|
||||||
|
"""
|
||||||
|
rng = Random(10011001)
|
||||||
|
_run_randomized_state_test_for_inactivity_updates(spec, state, rng=rng)
|
||||||
|
|
||||||
|
|
||||||
|
@with_altair_and_later
|
||||||
|
@spec_state_test
|
||||||
|
@leaking()
|
||||||
|
def test_randomized_state_leaking(spec, state):
|
||||||
|
"""
|
||||||
|
This test ensures that once a validator has exited,
|
||||||
|
their inactivity score does not change, even during a leak.
|
||||||
|
Note that slashed validators are still subject to mutations
|
||||||
|
(refer ``get_eligible_validator_indices`).
|
||||||
|
"""
|
||||||
|
rng = Random(10011002)
|
||||||
|
_run_randomized_state_test_for_inactivity_updates(spec, state, rng=rng)
|
||||||
|
# Check still in leak
|
||||||
|
assert spec.is_in_inactivity_leak(state)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from random import Random
|
from random import Random
|
||||||
|
|
||||||
|
from eth2spec.test.context import is_post_altair
|
||||||
from eth2spec.test.helpers.keys import pubkeys, privkeys
|
from eth2spec.test.helpers.keys import pubkeys, privkeys
|
||||||
from eth2spec.utils import bls
|
from eth2spec.utils import bls
|
||||||
from eth2spec.utils.merkle_minimal import calc_merkle_tree_from_leaves, get_merkle_proof
|
from eth2spec.utils.merkle_minimal import calc_merkle_tree_from_leaves, get_merkle_proof
|
||||||
@ -15,6 +16,8 @@ def mock_deposit(spec, state, index):
|
|||||||
state.validators[index].activation_eligibility_epoch = spec.FAR_FUTURE_EPOCH
|
state.validators[index].activation_eligibility_epoch = spec.FAR_FUTURE_EPOCH
|
||||||
state.validators[index].activation_epoch = spec.FAR_FUTURE_EPOCH
|
state.validators[index].activation_epoch = spec.FAR_FUTURE_EPOCH
|
||||||
state.validators[index].effective_balance = spec.MAX_EFFECTIVE_BALANCE
|
state.validators[index].effective_balance = spec.MAX_EFFECTIVE_BALANCE
|
||||||
|
if is_post_altair(spec):
|
||||||
|
state.inactivity_scores[index] = 0
|
||||||
assert not spec.is_active_validator(state.validators[index], spec.get_current_epoch(state))
|
assert not spec.is_active_validator(state.validators[index], spec.get_current_epoch(state))
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user