From d6f317950ca4ba93668c00cdc1f7a615ad151f74 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Fri, 10 Jul 2020 22:47:39 +0200 Subject: [PATCH] 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. --- beacon_chain/block_pools/candidate_chains.nim | 6 +----- beacon_chain/spec/state_transition.nim | 11 ++++------- tests/testblockutil.nim | 2 +- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/beacon_chain/block_pools/candidate_chains.nim b/beacon_chain/block_pools/candidate_chains.nim index 667d1fdce..f0eaa2f53 100644 --- a/beacon_chain/block_pools/candidate_chains.nim +++ b/beacon_chain/block_pools/candidate_chains.nim @@ -505,12 +505,8 @@ proc skipAndUpdateState( state: var HashedBeaconState, blck: BlockRef, slot: Slot, save: bool) = while state.data.slot < slot: # 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) - advance_slot(state, nextStateRoot, dag.updateFlags, stateCache) + advance_slot(state, dag.updateFlags, stateCache) if save: dag.putState(state, blck) diff --git a/beacon_chain/spec/state_transition.nim b/beacon_chain/spec/state_transition.nim index 59608849b..d9e23fcf1 100644 --- a/beacon_chain/spec/state_transition.nim +++ b/beacon_chain/spec/state_transition.nim @@ -125,8 +125,8 @@ func process_slot*(state: var HashedBeaconState) {.nbench.} = 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 -proc advance_slot*(state: var HashedBeaconState, - nextStateRoot: Opt[Eth2Digest], updateFlags: UpdateFlags, +proc advance_slot*( + state: var HashedBeaconState, updateFlags: UpdateFlags, epochCache: var StateCache) {.nbench.} = # 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 @@ -141,10 +141,7 @@ proc advance_slot*(state: var HashedBeaconState, if is_epoch_transition: 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 proc process_slots*(state: var HashedBeaconState, slot: Slot, @@ -166,7 +163,7 @@ proc process_slots*(state: var HashedBeaconState, slot: Slot, # Catch up to the target slot var cache = get_empty_per_epoch_cache() while state.data.slot < slot: - advance_slot(state, err(Opt[Eth2Digest]), updateFlags, cache) + advance_slot(state, updateFlags, cache) true diff --git a/tests/testblockutil.nim b/tests/testblockutil.nim index 80dc51e86..76dd8d8f3 100644 --- a/tests/testblockutil.nim +++ b/tests/testblockutil.nim @@ -94,7 +94,7 @@ proc addTestBlock*( graffiti = Eth2Digest(), flags: set[UpdateFlag] = {}): SignedBeaconBlock = # 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 proposer_index = get_beacon_proposer_index(state.data, cache)