From 61c0ddbcbbea2f09d57076a51c28a4c0cebd0837 Mon Sep 17 00:00:00 2001 From: protolambda Date: Mon, 6 May 2019 16:23:33 +0200 Subject: [PATCH] update attester slashing testing --- .../test_process_attester_slashing.py | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/test_libs/pyspec/tests/block_processing/test_process_attester_slashing.py b/test_libs/pyspec/tests/block_processing/test_process_attester_slashing.py index 2ea16f13d..631484b12 100644 --- a/test_libs/pyspec/tests/block_processing/test_process_attester_slashing.py +++ b/test_libs/pyspec/tests/block_processing/test_process_attester_slashing.py @@ -1,4 +1,3 @@ -from copy import deepcopy import pytest import eth2spec.phase0.spec as spec @@ -12,52 +11,69 @@ from tests.helpers import ( next_epoch, ) -# mark entire file as 'attester_slashing' -pytestmark = pytest.mark.attester_slashings +from tests.utils import spectest +from tests.context import with_state + +from .block_test_helpers import spec_state_test def run_attester_slashing_processing(state, attester_slashing, valid=True): """ - Run ``process_attester_slashing`` returning the pre and post state. + Run ``process_attester_slashing``, yielding: + - pre-state ('pre') + - attester_slashing ('attester_slashing') + - post-state ('post'). If ``valid == False``, run expecting ``AssertionError`` """ - post_state = deepcopy(state) + + yield 'pre', state + yield 'attester_slashing', attester_slashing if not valid: with pytest.raises(AssertionError): - process_attester_slashing(post_state, attester_slashing) - return state, None - - process_attester_slashing(post_state, attester_slashing) + process_attester_slashing(state, attester_slashing) + yield 'post', None + return slashed_index = attester_slashing.attestation_1.custody_bit_0_indices[0] - slashed_validator = post_state.validator_registry[slashed_index] + pre_slashed_balance = get_balance(state, slashed_index) + + proposer_index = get_beacon_proposer_index(state) + pre_proposer_balance = get_balance(state, proposer_index) + + # Process slashing + process_attester_slashing(state, attester_slashing) + + slashed_validator = state.validator_registry[slashed_index] + + # Check slashing 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 assert ( - get_balance(post_state, slashed_index) < - get_balance(state, slashed_index) + get_balance(state, slashed_index) < + pre_slashed_balance ) - proposer_index = get_beacon_proposer_index(state) + # gained whistleblower reward assert ( - get_balance(post_state, proposer_index) > - get_balance(state, proposer_index) + get_balance(state, proposer_index) > + pre_proposer_balance ) - return state, post_state + yield 'post', state +@spec_state_test def test_success_double(state): attester_slashing = get_valid_attester_slashing(state) - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing) - - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing) +@spec_state_test def test_success_surround(state): next_epoch(state) state.current_justified_epoch += 1 @@ -67,31 +83,28 @@ def test_success_surround(state): attester_slashing.attestation_1.data.source_epoch = attester_slashing.attestation_2.data.source_epoch - 1 attester_slashing.attestation_1.data.target_epoch = attester_slashing.attestation_2.data.target_epoch + 1 - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing) - - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing) +@spec_state_test def test_same_data(state): attester_slashing = get_valid_attester_slashing(state) attester_slashing.attestation_1.data = attester_slashing.attestation_2.data - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing, False) - - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing, False) +@spec_state_test def test_no_double_or_surround(state): attester_slashing = get_valid_attester_slashing(state) attester_slashing.attestation_1.data.target_epoch += 1 - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing, False) - - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing, False) +@spec_state_test def test_participants_already_slashed(state): attester_slashing = get_valid_attester_slashing(state) @@ -101,17 +114,15 @@ def test_participants_already_slashed(state): for index in validator_indices: state.validator_registry[index].slashed = True - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing, False) - - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing, False) +@spec_state_test def test_custody_bit_0_and_1(state): attester_slashing = get_valid_attester_slashing(state) attester_slashing.attestation_1.custody_bit_1_indices = ( attester_slashing.attestation_1.custody_bit_0_indices ) - pre_state, post_state = run_attester_slashing_processing(state, attester_slashing, False) - return pre_state, attester_slashing, post_state + yield from run_attester_slashing_processing(state, attester_slashing, False)