mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-09 22:06:21 +00:00
f19a497eec
* ncli_db: add putState, putBlock These tools allow modifying an existing nimbus database for the purpose of recovery or reorg, moving the head, tail and genesis to arbitrary points. * remove potentially expensive `putState` in `BeaconStateDB` * introduce `latest_block_root` which computes the root of the latest applied block from the `latest_block_header` field (instead of passing it in separately) * avoid some unnecessary BeaconState copies during init * discover https://github.com/nim-lang/Nim/issues/19094 * prefer `HashedBeaconState` in a few places to avoid recomputing state root * fetch latest block root from state when creating blocks * harden `get_beacon_proposer_index` against invalid slots and document * move random spec function tests to `test_spec.nim` * avoid unnecessary state root computation before block proposal
77 lines
3.2 KiB
Nim
77 lines
3.2 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 2018-2021 Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
{.used.}
|
|
|
|
# Test for spec functions and helpers outside of the EF test vectors - mainly
|
|
# helpers that extend or make the spec functions usable outside of the state
|
|
# transition functions
|
|
|
|
import
|
|
unittest2,
|
|
../beacon_chain/spec/datatypes/phase0,
|
|
../beacon_chain/spec/[beaconstate, state_transition],
|
|
./testutil, ./testblockutil
|
|
|
|
suite "Beacon state" & preset():
|
|
test "Smoke test initialize_beacon_state_from_eth1" & preset():
|
|
let state = newClone(initialize_beacon_state_from_eth1(
|
|
defaultRuntimeConfig, Eth2Digest(), 0,
|
|
makeInitialDeposits(SLOTS_PER_EPOCH, {}), {}))
|
|
check: state.validators.lenu64 == SLOTS_PER_EPOCH
|
|
|
|
test "latest_block_root":
|
|
var
|
|
cfg = defaultRuntimeConfig
|
|
state = (ref ForkedHashedBeaconState)(
|
|
kind: BeaconStateFork.Phase0,
|
|
phase0Data: initialize_hashed_beacon_state_from_eth1(
|
|
defaultRuntimeConfig, Eth2Digest(), 0,
|
|
makeInitialDeposits(SLOTS_PER_EPOCH, {}), {skipBlsValidation}))
|
|
genBlock = get_initial_beacon_block(state[])
|
|
cache: StateCache
|
|
info: ForkedEpochInfo
|
|
|
|
check: # Works for genesis block
|
|
state[].phase0Data.latest_block_root() == genBlock.root
|
|
process_slots(cfg, state[], Slot 1, cache, info, {})
|
|
state[].phase0Data.latest_block_root() == genBlock.root
|
|
|
|
let blck = addTestBlock(
|
|
state[], cache, nextSlot = false, flags = {skipBlsValidation}).phase0Data
|
|
|
|
check: # Works for random blocks
|
|
state[].phase0Data.latest_block_root() == blck.root
|
|
process_slots(cfg, state[], Slot 2, cache, info, {})
|
|
state[].phase0Data.latest_block_root() == blck.root
|
|
|
|
test "get_beacon_proposer_index":
|
|
var
|
|
cfg = defaultRuntimeConfig
|
|
state = (ref ForkedHashedBeaconState)(
|
|
kind: BeaconStateFork.Phase0,
|
|
phase0Data: initialize_hashed_beacon_state_from_eth1(
|
|
defaultRuntimeConfig, Eth2Digest(), 0,
|
|
makeInitialDeposits(SLOTS_PER_EPOCH, {}), {skipBlsValidation}))
|
|
cache: StateCache
|
|
info: ForkedEpochInfo
|
|
|
|
check:
|
|
get_beacon_proposer_index(state[].phase0Data.data, cache, Slot 1).isSome()
|
|
get_beacon_proposer_index(
|
|
state[].phase0Data.data, cache, Epoch(1).compute_start_slot_at_epoch()).isNone()
|
|
get_beacon_proposer_index(
|
|
state[].phase0Data.data, cache, Epoch(2).compute_start_slot_at_epoch()).isNone()
|
|
|
|
check:
|
|
process_slots(cfg, state[], Epoch(1).compute_start_slot_at_epoch(), cache, info, {})
|
|
get_beacon_proposer_index(state[].phase0Data.data, cache, Slot 1).isNone()
|
|
get_beacon_proposer_index(
|
|
state[].phase0Data.data, cache, Epoch(1).compute_start_slot_at_epoch()).isSome()
|
|
get_beacon_proposer_index(
|
|
state[].phase0Data.data, cache, Epoch(2).compute_start_slot_at_epoch()).isNone()
|