Compute state root instead of loading from database (#1297)
htr is fast now, so hitting the database to load the state root is no longer motivated - the more simple code is less vulnerable to database corruption.
This commit is contained in:
parent
87928e0069
commit
d6f317950c
|
@ -505,12 +505,8 @@ proc skipAndUpdateState(
|
||||||
state: var HashedBeaconState, blck: BlockRef, slot: Slot, save: bool) =
|
state: var HashedBeaconState, blck: BlockRef, slot: Slot, save: bool) =
|
||||||
while state.data.slot < slot:
|
while state.data.slot < slot:
|
||||||
# Process slots one at a time in case afterUpdate needs to see empty states
|
# Process slots one at a time in case afterUpdate needs to see empty states
|
||||||
# TODO when replaying, we already do this query when loading the ancestors -
|
|
||||||
# save and reuse
|
|
||||||
# TODO possibly we should keep this in memory for the hot blocks
|
|
||||||
let nextStateRoot = dag.db.getStateRoot(blck.root, state.data.slot + 1)
|
|
||||||
var stateCache = getEpochCache(blck, state.data)
|
var stateCache = getEpochCache(blck, state.data)
|
||||||
advance_slot(state, nextStateRoot, dag.updateFlags, stateCache)
|
advance_slot(state, dag.updateFlags, stateCache)
|
||||||
|
|
||||||
if save:
|
if save:
|
||||||
dag.putState(state, blck)
|
dag.putState(state, blck)
|
||||||
|
|
|
@ -125,8 +125,8 @@ func process_slot*(state: var HashedBeaconState) {.nbench.} =
|
||||||
hash_tree_root(state.data.latest_block_header)
|
hash_tree_root(state.data.latest_block_header)
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function
|
||||||
proc advance_slot*(state: var HashedBeaconState,
|
proc advance_slot*(
|
||||||
nextStateRoot: Opt[Eth2Digest], updateFlags: UpdateFlags,
|
state: var HashedBeaconState, updateFlags: UpdateFlags,
|
||||||
epochCache: var StateCache) {.nbench.} =
|
epochCache: var StateCache) {.nbench.} =
|
||||||
# Special case version of process_slots that moves one slot at a time - can
|
# Special case version of process_slots that moves one slot at a time - can
|
||||||
# run faster if the state root is known already (for example when replaying
|
# run faster if the state root is known already (for example when replaying
|
||||||
|
@ -141,9 +141,6 @@ proc advance_slot*(state: var HashedBeaconState,
|
||||||
if is_epoch_transition:
|
if is_epoch_transition:
|
||||||
beacon_current_validators.set(get_epoch_validator_count(state.data))
|
beacon_current_validators.set(get_epoch_validator_count(state.data))
|
||||||
|
|
||||||
if nextStateRoot.isSome:
|
|
||||||
state.root = nextStateRoot.get()
|
|
||||||
else:
|
|
||||||
state.root = hash_tree_root(state.data)
|
state.root = hash_tree_root(state.data)
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.1/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function
|
||||||
|
@ -166,7 +163,7 @@ proc process_slots*(state: var HashedBeaconState, slot: Slot,
|
||||||
# Catch up to the target slot
|
# Catch up to the target slot
|
||||||
var cache = get_empty_per_epoch_cache()
|
var cache = get_empty_per_epoch_cache()
|
||||||
while state.data.slot < slot:
|
while state.data.slot < slot:
|
||||||
advance_slot(state, err(Opt[Eth2Digest]), updateFlags, cache)
|
advance_slot(state, updateFlags, cache)
|
||||||
|
|
||||||
true
|
true
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ proc addTestBlock*(
|
||||||
graffiti = Eth2Digest(),
|
graffiti = Eth2Digest(),
|
||||||
flags: set[UpdateFlag] = {}): SignedBeaconBlock =
|
flags: set[UpdateFlag] = {}): SignedBeaconBlock =
|
||||||
# Create and add a block to state - state will advance by one slot!
|
# Create and add a block to state - state will advance by one slot!
|
||||||
advance_slot(state, err(Opt[Eth2Digest]), flags, cache)
|
advance_slot(state, flags, cache)
|
||||||
|
|
||||||
let
|
let
|
||||||
proposer_index = get_beacon_proposer_index(state.data, cache)
|
proposer_index = get_beacon_proposer_index(state.data, cache)
|
||||||
|
|
Loading…
Reference in New Issue