mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-12 23:34:44 +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
85 lines
3.1 KiB
Nim
85 lines
3.1 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 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.
|
|
|
|
{.push raises: [Defect].}
|
|
|
|
import
|
|
tables,
|
|
stew/[assign2, endians2, io2, objects, results],
|
|
serialization, chronicles,
|
|
eth/db/[kvstore, kvstore_sqlite3],
|
|
./spec/[crypto, datatypes, digest],
|
|
./ssz/[ssz_serialization, merkleization],
|
|
filepath
|
|
|
|
type
|
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#beaconstate
|
|
# Memory-representation-equivalent to a v1.0.1 BeaconState for in-place SSZ reading and writing
|
|
BeaconStateNoImmutableValidators* = object
|
|
# Versioning
|
|
genesis_time*: uint64
|
|
genesis_validators_root*: Eth2Digest
|
|
slot*: Slot
|
|
fork*: Fork
|
|
|
|
# History
|
|
latest_block_header*: BeaconBlockHeader ##\
|
|
## `latest_block_header.state_root == ZERO_HASH` temporarily
|
|
|
|
block_roots*: HashArray[Limit SLOTS_PER_HISTORICAL_ROOT, Eth2Digest] ##\
|
|
## Needed to process attestations, older to newer
|
|
|
|
state_roots*: HashArray[Limit SLOTS_PER_HISTORICAL_ROOT, Eth2Digest]
|
|
historical_roots*: HashList[Eth2Digest, Limit HISTORICAL_ROOTS_LIMIT]
|
|
|
|
# Eth1
|
|
eth1_data*: Eth1Data
|
|
eth1_data_votes*:
|
|
HashList[Eth1Data, Limit(EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH)]
|
|
eth1_deposit_index*: uint64
|
|
|
|
# Registry
|
|
validators*: HashList[ValidatorStatus, Limit VALIDATOR_REGISTRY_LIMIT]
|
|
balances*: HashList[uint64, Limit VALIDATOR_REGISTRY_LIMIT]
|
|
|
|
# Randomness
|
|
randao_mixes*: HashArray[Limit EPOCHS_PER_HISTORICAL_VECTOR, Eth2Digest]
|
|
|
|
# Slashings
|
|
slashings*: HashArray[Limit EPOCHS_PER_SLASHINGS_VECTOR, uint64] ##\
|
|
## Per-epoch sums of slashed effective balances
|
|
|
|
# Attestations
|
|
previous_epoch_attestations*:
|
|
HashList[PendingAttestation, Limit(MAX_ATTESTATIONS * SLOTS_PER_EPOCH)]
|
|
current_epoch_attestations*:
|
|
HashList[PendingAttestation, Limit(MAX_ATTESTATIONS * SLOTS_PER_EPOCH)]
|
|
|
|
# Finality
|
|
justification_bits*: uint8 ##\
|
|
## Bit set for every recent justified epoch
|
|
## Model a Bitvector[4] as a one-byte uint, which should remain consistent
|
|
## with ssz/hashing.
|
|
|
|
previous_justified_checkpoint*: Checkpoint ##\
|
|
## Previous epoch snapshot
|
|
|
|
current_justified_checkpoint*: Checkpoint
|
|
finalized_checkpoint*: Checkpoint
|
|
|
|
static:
|
|
# Each of these pairs of types has ABI-compatible memory representations, so
|
|
# that the SSZ serialization can read and write directly from an object with
|
|
# only mutable portions of BeaconState into a full BeaconState without using
|
|
# any extra copies.
|
|
doAssert sizeof(Validator) == sizeof(ValidatorStatus)
|
|
doAssert sizeof(BeaconState) == sizeof(BeaconStateNoImmutableValidators)
|
|
|
|
proc loadImmutableValidators*(dbSeq: var auto): seq[ImmutableValidatorData] =
|
|
for i in 0 ..< dbSeq.len:
|
|
result.add dbSeq.get(i)
|