From 3217938b6f611892ed3fa71a06daa5891c155216 Mon Sep 17 00:00:00 2001 From: Dankrad Feist Date: Wed, 8 May 2019 23:48:12 +0100 Subject: [PATCH] Re-add early derived secret reveal tests --- .../phase1_test_process_randao_key_reveal.py | 109 ------------------ ...est_process_early_derived_secret_reveal.py | 109 ++++++++++++++++++ test_libs/pyspec/tests/helpers_phase1.py | 14 ++- 3 files changed, 117 insertions(+), 115 deletions(-) delete mode 100644 test_libs/pyspec/tests/block_processing_phase1/phase1_test_process_randao_key_reveal.py create mode 100644 test_libs/pyspec/tests/block_processing_phase1/test_process_early_derived_secret_reveal.py diff --git a/test_libs/pyspec/tests/block_processing_phase1/phase1_test_process_randao_key_reveal.py b/test_libs/pyspec/tests/block_processing_phase1/phase1_test_process_randao_key_reveal.py deleted file mode 100644 index 0be8ab4a9..000000000 --- a/test_libs/pyspec/tests/block_processing_phase1/phase1_test_process_randao_key_reveal.py +++ /dev/null @@ -1,109 +0,0 @@ -from copy import deepcopy -import pytest - -import eth2spec.phase1.spec as spec -from eth2spec.phase1.spec import ( - get_current_epoch, - process_randao_key_reveal, - RANDAO_PENALTY_EPOCHS, - CUSTODY_PERIOD_TO_RANDAO_PADDING, - RANDAO_PENALTY_MAX_FUTURE_EPOCHS, -) -from tests.helpers_phase1 import ( - get_valid_randao_key_reveal, -) - -mark entire file as 'randao_key_reveals' -pytestmark = pytest.mark.randao_key_reveals - - -def run_randao_key_reveal_processing(state, randao_key_reveal, valid=True): - """ - Run ``process_randao_key_reveal`` returning the pre and post state. - If ``valid == False``, run expecting ``AssertionError`` - """ - post_state = deepcopy(state) - - if not valid: - with pytest.raises(AssertionError): - process_randao_key_reveal(post_state, randao_key_reveal) - return state, None - - process_randao_key_reveal(post_state, randao_key_reveal) - - slashed_validator = post_state.validator_registry[randao_key_reveal.revealed_index] - - if randao_key_reveal.epoch >= get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING: - assert slashed_validator.slashed - assert slashed_validator.exit_epoch < spec.FAR_FUTURE_EPOCH - assert slashed_validator.withdrawable_epoch < spec.FAR_FUTURE_EPOCH - # lost whistleblower reward - # FIXME: Currently broken because get_base_reward in genesis epoch is 0 - assert ( - post_state.balances[randao_key_reveal.revealed_index] < - state.balances[randao_key_reveal.revealed_index] - ) - - return state, post_state - - -def test_success(state): - randao_key_reveal = get_valid_randao_key_reveal(state) - - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal) - - return pre_state, randao_key_reveal, post_state - - -def test_reveal_from_current_epoch(state): - randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state)) - - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, False) - - return pre_state, randao_key_reveal, post_state - -# Not currently possible as we are testing at epoch 0 -# -#def test_reveal_from_past_epoch(state): -# randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state) - 1) -# -# pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, False) -# -# return pre_state, randao_key_reveal, post_state - -def test_reveal_with_custody_padding(state): - randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING) - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, True) - - return pre_state, randao_key_reveal, post_state - -def test_reveal_with_custody_padding_minus_one(state): - randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING - 1) - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, True) - - return pre_state, randao_key_reveal, post_state - -def test_double_reveal(state): - - randao_key_reveal1 = get_valid_randao_key_reveal(state, get_current_epoch(state) + RANDAO_PENALTY_EPOCHS + 1) - pre_state, intermediate_state = run_randao_key_reveal_processing(state, randao_key_reveal1) - - randao_key_reveal2 = get_valid_randao_key_reveal(intermediate_state, get_current_epoch(pre_state) + RANDAO_PENALTY_EPOCHS + 1) - intermediate_state_, post_state = run_randao_key_reveal_processing(intermediate_state, randao_key_reveal2, False) - - return pre_state, [randao_key_reveal1, randao_key_reveal2], post_state - -def test_revealer_is_slashed(state): - randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state)) - state.validator_registry[randao_key_reveal.revealed_index].slashed = True - - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, False) - - return pre_state, randao_key_reveal, post_state - -def test_far_future_epoch(state): - randao_key_reveal = get_valid_randao_key_reveal(state, get_current_epoch(state) + RANDAO_PENALTY_MAX_FUTURE_EPOCHS) - - pre_state, post_state = run_randao_key_reveal_processing(state, randao_key_reveal, False) - - return pre_state, randao_key_reveal, post_state diff --git a/test_libs/pyspec/tests/block_processing_phase1/test_process_early_derived_secret_reveal.py b/test_libs/pyspec/tests/block_processing_phase1/test_process_early_derived_secret_reveal.py new file mode 100644 index 000000000..30ae1e77e --- /dev/null +++ b/test_libs/pyspec/tests/block_processing_phase1/test_process_early_derived_secret_reveal.py @@ -0,0 +1,109 @@ +from copy import deepcopy +import pytest + +import eth2spec.phase1.spec as spec +from eth2spec.phase1.spec import ( + get_current_epoch, + process_early_derived_secret_reveal, + RANDAO_PENALTY_EPOCHS, + CUSTODY_PERIOD_TO_RANDAO_PADDING, + EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS, +) +from tests.helpers_phase1 import ( + get_valid_early_derived_secret_reveal, +) + +#mark entire file as 'randao_key_reveals' +pytestmark = pytest.mark.randao_key_reveals + + +def run_early_derived_secret_reveal_processing(state, randao_key_reveal, valid=True): + """ + Run ``process_randao_key_reveal`` returning the pre and post state. + If ``valid == False``, run expecting ``AssertionError`` + """ + post_state = deepcopy(state) + + if not valid: + with pytest.raises(AssertionError): + process_early_derived_secret_reveal(post_state, randao_key_reveal) + return state, None + + process_early_derived_secret_reveal(post_state, randao_key_reveal) + + slashed_validator = post_state.validator_registry[randao_key_reveal.revealed_index] + + if randao_key_reveal.epoch >= get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING: + assert slashed_validator.slashed + assert slashed_validator.exit_epoch < spec.FAR_FUTURE_EPOCH + assert slashed_validator.withdrawable_epoch < spec.FAR_FUTURE_EPOCH + # lost whistleblower reward + # FIXME: Currently broken because get_base_reward in genesis epoch is 0 + assert ( + post_state.balances[randao_key_reveal.revealed_index] < + state.balances[randao_key_reveal.revealed_index] + ) + + return state, post_state + + +def test_success(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state) + + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal) + + return pre_state, randao_key_reveal, post_state + + +def test_reveal_from_current_epoch(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state)) + + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, False) + + return pre_state, randao_key_reveal, post_state + +# Not currently possible as we are testing at epoch 0 +# +#def test_reveal_from_past_epoch(state): +# randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state) - 1) +# +# pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, False) +# +# return pre_state, randao_key_reveal, post_state + +def test_reveal_with_custody_padding(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING) + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, True) + + return pre_state, randao_key_reveal, post_state + +def test_reveal_with_custody_padding_minus_one(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state) + CUSTODY_PERIOD_TO_RANDAO_PADDING - 1) + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, True) + + return pre_state, randao_key_reveal, post_state + +def test_double_reveal(state): + + randao_key_reveal1 = get_valid_early_derived_secret_reveal(state, get_current_epoch(state) + RANDAO_PENALTY_EPOCHS + 1) + pre_state, intermediate_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal1) + + randao_key_reveal2 = get_valid_early_derived_secret_reveal(intermediate_state, get_current_epoch(pre_state) + RANDAO_PENALTY_EPOCHS + 1) + intermediate_state_, post_state = run_early_derived_secret_reveal_processing(intermediate_state, randao_key_reveal2, False) + + return pre_state, [randao_key_reveal1, randao_key_reveal2], post_state + +def test_revealer_is_slashed(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state)) + state.validator_registry[randao_key_reveal.revealed_index].slashed = True + + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, False) + + return pre_state, randao_key_reveal, post_state + +def test_far_future_epoch(state): + randao_key_reveal = get_valid_early_derived_secret_reveal(state, get_current_epoch(state) + EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS) + + pre_state, post_state = run_early_derived_secret_reveal_processing(state, randao_key_reveal, False) + + return pre_state, randao_key_reveal, post_state diff --git a/test_libs/pyspec/tests/helpers_phase1.py b/test_libs/pyspec/tests/helpers_phase1.py index aba93e159..5b67e9aa6 100644 --- a/test_libs/pyspec/tests/helpers_phase1.py +++ b/test_libs/pyspec/tests/helpers_phase1.py @@ -1,12 +1,12 @@ from py_ecc import bls import eth2spec.phase1.spec as spec -from eth2spec.phase0.spec import ( +from eth2spec.phase1.spec import ( # constants ZERO_HASH, CUSTODY_PERIOD_TO_RANDAO_PADDING, # SSZ - RandaoKeyReveal, + EarlyDerivedSecretReveal, # functions get_active_validator_indices, get_current_epoch, @@ -14,7 +14,9 @@ from eth2spec.phase0.spec import ( hash_tree_root, ) -def get_valid_randao_key_reveal(state, epoch=None): +from .helpers import privkeys + +def get_valid_early_derived_secret_reveal(state, epoch=None): current_epoch = get_current_epoch(state) revealed_index = get_active_validator_indices(state, current_epoch)[-1] masker_index = get_active_validator_indices(state, current_epoch)[0] @@ -24,7 +26,7 @@ def get_valid_randao_key_reveal(state, epoch=None): reveal = bls.sign( message_hash=hash_tree_root(epoch), - privkey=pubkey_to_privkey[state.validator_registry[revealed_index].pubkey], + privkey=privkeys[revealed_index], domain=get_domain( state=state, domain_type=spec.DOMAIN_RANDAO, @@ -33,7 +35,7 @@ def get_valid_randao_key_reveal(state, epoch=None): ) mask = bls.sign( message_hash=hash_tree_root(epoch), - privkey=pubkey_to_privkey[state.validator_registry[masker_index].pubkey], + privkey=privkeys[masker_index], domain=get_domain( state=state, domain_type=spec.DOMAIN_RANDAO, @@ -41,7 +43,7 @@ def get_valid_randao_key_reveal(state, epoch=None): ), ) - return RandaoKeyReveal( + return EarlyDerivedSecretReveal( revealed_index=revealed_index, epoch=epoch, reveal=reveal,