mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-09 13:56:23 +00:00
8def2486b0
* initial immutable validator database factoring * remove changes from chain_dag: this abstraction properly belongs in beacon_chain_db * add merging mutable/immutable validator portions; individually test database roundtripping of immutable validators and states-sans-immutable-validators * update test summaries * use stew/assign2 instead of Nim assignment * add reading/writing of immutable validators in chaindag * remove unused import * replace chunked k/v store of immutable validators with per-row SQL table storage * use List instead of HashList * un-stub some ncli_db code so that it uses * switch HashArray to array; move BeaconStateNoImmutableValidators from datatypes to beacon_chain_db * begin only-mutable-part state storage * uncomment some assigns * work around https://github.com/nim-lang/Nim/issues/17253 * fix most of the issues/oversights; local sim runs again * fix test suite by adding missing beaconstate field to copy function * have ncli bench also store immutable validators * extract some immutable-validator-specific code from the beacon chain db module * add more rigorous database state roundtripping, with changing validator sets * adjust ncli_db to use new schema * simplify putState/getState by moving all immutable validator accounting into beacon state DB * remove redundant test case and move code to immutable-beacon-chain module * more efficient, but still brute-force, mutable+immutable validator merging * reuse BeaconState in getState * ensure HashList/HashArray caches are cleared when reusing getState buffers; add ncli_db and a unit test to verify this * HashList.clear() -> HashList.clearCache() * only copy incrementally necessary immutable validators * increase strictness of test cases and fix/work around resulting HashList cache invalidation issues * remove explanatory scaffolding * allow for storage of full (with all validators) states for backwards/forwards-compatibility * adjust DbSeq type usage * store full, with-validators, state every 64 epochs to enable reverting versions * reduce memory allocation and intermediate objects in state storage codepath * eliminate allocation/copying through intermediate BeaconStateNoImmutableValidators objects * skip benchmarking initial genesis-validator-heavy state store * always store new-style state and sometimes old-style state * document intent behind BeaconState/Validator type-punnery * more accurate failure message on SQLite in-memory database initialization failure
72 lines
2.5 KiB
Nim
72 lines
2.5 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2021 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
{.push raises: [Defect].}
|
|
|
|
import
|
|
options, stew/endians2,
|
|
./mocking/mock_deposits,
|
|
./helpers/math_helpers,
|
|
../beacon_chain/ssz/merkleization,
|
|
../beacon_chain/spec/[beaconstate, crypto, datatypes, presets,
|
|
helpers, state_transition]
|
|
|
|
proc valid_deposit(state: var BeaconState) =
|
|
const deposit_amount = MAX_EFFECTIVE_BALANCE
|
|
let validator_index = state.validators.len
|
|
let deposit = mockUpdateStateForNewDeposit(
|
|
state,
|
|
uint64 validator_index,
|
|
deposit_amount,
|
|
flags = {}
|
|
)
|
|
|
|
let pre_val_count = state.validators.len
|
|
let pre_balance = if validator_index < pre_val_count:
|
|
state.balances[validator_index]
|
|
else:
|
|
0
|
|
doAssert process_deposit(defaultRuntimePreset(), state, deposit, {}).isOk
|
|
doAssert state.validators.len == pre_val_count + 1
|
|
doAssert state.balances.len == pre_val_count + 1
|
|
doAssert state.balances[validator_index] == pre_balance + deposit.data.amount
|
|
doAssert state.validators[validator_index].effective_balance ==
|
|
round_multiple_down(
|
|
min(MAX_EFFECTIVE_BALANCE, state.balances[validator_index]),
|
|
EFFECTIVE_BALANCE_INCREMENT
|
|
)
|
|
|
|
proc getTestStates*(initialState: HashedBeaconState):
|
|
seq[ref HashedBeaconState] =
|
|
# Randomly generated slot numbers, with a jump to around
|
|
# SLOTS_PER_HISTORICAL_ROOT to force wraparound of those
|
|
# slot-based mod/increment fields.
|
|
const stateEpochs = [
|
|
0, 1,
|
|
|
|
# Around minimal wraparound SLOTS_PER_HISTORICAL_ROOT wraparound
|
|
5, 6, 7, 8, 9,
|
|
|
|
39, 40, 97, 98, 99, 113, 114, 115, 116, 130, 131, 145, 146, 192, 193,
|
|
232, 233, 237, 238,
|
|
|
|
# Approaching and passing SLOTS_PER_HISTORICAL_ROOT wraparound
|
|
254, 255, 256, 257, 258]
|
|
|
|
var
|
|
tmpState = assignClone(initialState)
|
|
cache = StateCache()
|
|
|
|
for i, epoch in stateEpochs:
|
|
let slot = epoch.Epoch.compute_start_slot_at_epoch
|
|
if tmpState.data.slot < slot:
|
|
doAssert process_slots(tmpState[], slot, cache)
|
|
if i mod 3 == 0:
|
|
valid_deposit(tmpState.data)
|
|
doAssert tmpState.data.slot == slot
|
|
result.add assignClone(tmpState[])
|