From 55f042aa71c8a6a3f62e803077ecb77f33a3b432 Mon Sep 17 00:00:00 2001 From: Justin Drake Date: Wed, 24 Apr 2019 15:17:25 +1000 Subject: [PATCH] More fixes --- specs/core/0_beacon-chain.md | 4 ++-- test_libs/pyspec/tests/helpers.py | 9 ++++++--- test_libs/pyspec/tests/test_sanity.py | 16 ++++++++++++---- tests/phase0/helpers.py | 3 ++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/specs/core/0_beacon-chain.md b/specs/core/0_beacon-chain.md index 159d2d839..3dd4c944c 100644 --- a/specs/core/0_beacon-chain.md +++ b/specs/core/0_beacon-chain.md @@ -929,7 +929,7 @@ def get_beacon_proposer_index(state: BeaconState) -> ValidatorIndex: i = 0 while True: candidate_index = first_committee[(current_epoch + i) % len(first_committee)] - random_byte = hash(generate_seed(state, epoch) + int_to_bytes8(i // 32))[i % 32] + random_byte = hash(generate_seed(state, current_epoch) + int_to_bytes8(i // 32))[i % 32] effective_balance = state.validator_registry[candidate_index].effective_balance if effective_balance * MAX_RANDOM_BYTE >= MAX_EFFECTIVE_BALANCE * random_byte: return candidate_index @@ -2011,7 +2011,7 @@ def process_transfer(state: BeaconState, transfer: Transfer) -> None: assert ( state.validator_registry[transfer.sender].activation_eligibility_epoch == FAR_FUTURE_EPOCH or get_current_epoch(state) >= state.validator_registry[transfer.sender].withdrawable_epoch or - transfer.amount + transfer.fee + MAX_EFFECTIVE_BALANCE <= get_balance(state, transfer.sender) + transfer.amount + transfer.fee + MAX_EFFECTIVE_BALANCE <= state.balances[transfer.sender] ) # Verify that the pubkey is valid assert ( diff --git a/test_libs/pyspec/tests/helpers.py b/test_libs/pyspec/tests/helpers.py index 465825c35..cf3d2624a 100644 --- a/test_libs/pyspec/tests/helpers.py +++ b/test_libs/pyspec/tests/helpers.py @@ -28,6 +28,7 @@ from eth2spec.phase0.spec import ( get_active_validator_indices, get_attesting_indices, get_block_root, + get_block_root_at_slot, get_crosslink_committees_at_slot, get_current_epoch, get_domain, @@ -51,9 +52,11 @@ privkeys = [i + 1 for i in range(1000)] pubkeys = [bls.privtopub(privkey) for privkey in privkeys] pubkey_to_privkey = {pubkey: privkey for privkey, pubkey in zip(privkeys, pubkeys)} + def get_balance(state, index): return state.balances[index] + def set_bitfield_bit(bitfield, i): """ Set the bit in ``bitfield`` at position ``i`` to ``1``. @@ -151,16 +154,16 @@ def build_attestation_data(state, slot, shard): if slot == state.slot: block_root = build_empty_block_for_next_slot(state).previous_block_root else: - block_root = get_block_root(state, slot) + block_root = get_block_root_at_slot(state, slot) current_epoch_start_slot = get_epoch_start_slot(get_current_epoch(state)) if slot < current_epoch_start_slot: print(slot) - epoch_boundary_root = get_block_root(state, get_epoch_start_slot(get_previous_epoch(state))) + epoch_boundary_root = get_block_root(state, get_previous_epoch(state)) elif slot == current_epoch_start_slot: epoch_boundary_root = block_root else: - epoch_boundary_root = get_block_root(state, current_epoch_start_slot) + epoch_boundary_root = get_block_root(state, get_current_epoch(state)) if slot < current_epoch_start_slot: justified_epoch = state.previous_justified_epoch diff --git a/test_libs/pyspec/tests/test_sanity.py b/test_libs/pyspec/tests/test_sanity.py index 182c9cfe0..b54b5f75a 100644 --- a/test_libs/pyspec/tests/test_sanity.py +++ b/test_libs/pyspec/tests/test_sanity.py @@ -9,6 +9,7 @@ from eth2spec.utils.minimal_ssz import signing_root from eth2spec.phase0.spec import ( # constants ZERO_HASH, + SLOTS_PER_HISTORICAL_ROOT, # SSZ Deposit, Transfer, @@ -17,9 +18,9 @@ from eth2spec.phase0.spec import ( get_active_validator_indices, get_beacon_proposer_index, get_block_root, + get_block_root_at_slot, get_current_epoch, get_domain, - get_state_root, advance_slot, cache_state, slot_to_epoch, @@ -48,6 +49,13 @@ from .helpers import ( ) +def get_state_root(state, slot) -> bytes: + """ + Return the state root at a recent ``slot``. + """ + assert slot < state.slot <= slot + SLOTS_PER_HISTORICAL_ROOT + return state.latest_state_roots[slot % SLOTS_PER_HISTORICAL_ROOT] + # mark entire file as 'sanity' pytestmark = pytest.mark.sanity @@ -94,7 +102,7 @@ def test_empty_block_transition(state): state_transition(test_state, block) assert len(test_state.eth1_data_votes) == len(state.eth1_data_votes) + 1 - assert get_block_root(test_state, state.slot) == block.previous_block_root + assert get_block_root_at_slot(test_state, state.slot) == block.previous_block_root return state, [block], test_state @@ -108,7 +116,7 @@ def test_skipped_slots(state): assert test_state.slot == block.slot for slot in range(state.slot, test_state.slot): - assert get_block_root(test_state, slot) == block.previous_block_root + assert get_block_root_at_slot(test_state, slot) == block.previous_block_root return state, [block], test_state @@ -122,7 +130,7 @@ def test_empty_epoch_transition(state): assert test_state.slot == block.slot for slot in range(state.slot, test_state.slot): - assert get_block_root(test_state, slot) == block.previous_block_root + assert get_block_root_at_slot(test_state, slot) == block.previous_block_root return state, [block], test_state diff --git a/tests/phase0/helpers.py b/tests/phase0/helpers.py index 20054b821..c042dec91 100644 --- a/tests/phase0/helpers.py +++ b/tests/phase0/helpers.py @@ -16,6 +16,7 @@ from build.phase0.spec import ( VoluntaryExit, # functions get_block_root, + get_block_root_at_slot, get_current_epoch, get_domain, get_empty_block, @@ -141,7 +142,7 @@ def build_attestation_data(state, slot, shard): if epoch_start_slot == slot: epoch_boundary_root = block_root else: - get_block_root(state, epoch_start_slot) + get_block_root(state, get_current_epoch(state)) if slot < epoch_start_slot: justified_block_root = state.previous_justified_root