enable inactivity updates test generator output, implement new participation flag updates testing

This commit is contained in:
protolambda 2021-05-22 18:43:29 +02:00
parent f7da1a3834
commit 4c02dbadd0
No known key found for this signature in database
GPG Key ID: EC89FDBB2B4C7623
2 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,110 @@
from random import Random
from eth2spec.test.helpers.constants import MINIMAL
from eth2spec.test.context import (
with_altair_and_later,
with_custom_state,
spec_test, spec_state_test,
with_presets,
single_phase,
)
from eth2spec.test.helpers.state import next_epoch_via_block
from eth2spec.test.helpers.epoch_processing import run_epoch_processing_with
def run_process_participation_flag_updates(spec, state):
yield from run_epoch_processing_with(spec, state, 'process_participation_flag_updates')
@with_altair_and_later
@spec_state_test
def test_zeroed(spec, state):
next_epoch_via_block(spec, state)
state.current_epoch_participation = [0] * len(state.validators)
state.previous_epoch_participation = [0] * len(state.validators)
yield from run_process_participation_flag_updates(spec, state)
@with_altair_and_later
@spec_state_test
def test_filled(spec, state):
next_epoch_via_block(spec, state)
full_flags = spec.ParticipationFlags(0)
for flag_index in range(len(spec.PARTICIPATION_FLAG_WEIGHTS)):
full_flags = spec.add_flag(full_flags, flag_index)
state.previous_epoch_participation = [full_flags] * len(state.validators)
state.current_epoch_participation = [full_flags] * len(state.validators)
yield from run_process_participation_flag_updates(spec, state)
def random_flags(spec, state, seed: int, previous=True, current=True):
rng = Random(seed)
count = len(state.validators)
max_flag_value_excl = 2**len(spec.PARTICIPATION_FLAG_WEIGHTS)
if previous:
state.previous_epoch_participation = [rng.randrange(0, max_flag_value_excl) for _ in range(count)]
if current:
state.current_epoch_participation = [rng.randrange(0, max_flag_value_excl) for _ in range(count)]
@with_altair_and_later
@spec_state_test
def test_random(spec, state):
next_epoch_via_block(spec, state)
random_flags(spec, state, 10)
yield from run_process_participation_flag_updates(spec, state)
@with_altair_and_later
@spec_state_test
def test_random_genesis(spec, state):
random_flags(spec, state, 11)
yield from run_process_participation_flag_updates(spec, state)
@with_altair_and_later
@spec_state_test
def test_zeroing(spec, state):
next_epoch_via_block(spec, state)
random_flags(spec, state, 12, current=False)
state.current_epoch_participation = [0] * len(state.validators)
yield from run_process_participation_flag_updates(spec, state)
@with_altair_and_later
@spec_state_test
def test_prev_zeroed(spec, state):
next_epoch_via_block(spec, state)
random_flags(spec, state, 13, previous=False)
state.previous_epoch_participation = [0] * len(state.validators)
yield from run_process_participation_flag_updates(spec, state)
def custom_validator_count(factor: float):
def initializer(spec):
num_validators = spec.SLOTS_PER_EPOCH * spec.MAX_COMMITTEES_PER_SLOT * spec.TARGET_COMMITTEE_SIZE
return [spec.MAX_EFFECTIVE_BALANCE] * int(float(int(num_validators)) * factor)
return initializer
@with_altair_and_later
@with_presets([MINIMAL], reason="mainnet config requires too many pre-generated public/private keys")
@spec_test
@with_custom_state(balances_fn=custom_validator_count(1.3), threshold_fn=lambda spec: spec.config.EJECTION_BALANCE)
@single_phase
def test_slightly_larger_random(spec, state):
random_flags(spec, state, 14)
yield from run_process_participation_flag_updates(spec, state)
@with_altair_and_later
@with_presets([MINIMAL], reason="mainnet config requires too many pre-generated public/private keys")
@spec_test
@with_custom_state(balances_fn=custom_validator_count(2.6), threshold_fn=lambda spec: spec.config.EJECTION_BALANCE)
@single_phase
def test_large_random(spec, state):
random_flags(spec, state, 15)
yield from run_process_participation_flag_updates(spec, state)

View File

@ -17,6 +17,8 @@ if __name__ == "__main__":
]}
altair_mods = {
**{key: 'eth2spec.test.altair.epoch_processing.test_process_' + key for key in [
'inactivity_updates',
'participation_flag_updates',
'sync_committee_updates',
]},
**phase_0_mods,