From da583f55ab249cbcb1d324ef5f593c7389d5f036 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Mon, 28 Mar 2022 21:10:24 +0800 Subject: [PATCH] add sharedStorage to the prefetcher of miner --- core/blockchain.go | 5 +++++ core/state/state_object.go | 4 ++-- miner/worker.go | 7 +++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 47ac859441..eeaf1b7e0a 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -842,6 +842,11 @@ func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error) { return state.New(root, bc.stateCache, bc.snaps) } +// StateAtWithSharedPool returns a new mutable state based on a particular point in time with sharedStorage +func (bc *BlockChain) StateAtWithSharedPool(root common.Hash) (*state.StateDB, error) { + return state.NewWithSharedPool(root, bc.stateCache, bc.snaps) +} + // StateCache returns the caching database underpinning the blockchain instance. func (bc *BlockChain) StateCache() state.Database { return bc.stateCache diff --git a/core/state/state_object.go b/core/state/state_object.go index a89feebf28..b40a8a2f85 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -81,8 +81,8 @@ type StateObject struct { trie Trie // storage trie, which becomes non-nil on first access code Code // contract bytecode, which gets set when code is loaded - sharedOriginStorage *sync.Map // Storage cache of original entries to dedup rewrites, reset for every transaction - originStorage Storage + sharedOriginStorage *sync.Map // Point to the entry of the stateObject in sharedPool + originStorage Storage // Storage cache of original entries to dedup rewrites, reset for every transaction pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block dirtyStorage Storage // Storage entries that have been modified in the current transaction execution diff --git a/miner/worker.go b/miner/worker.go index 2224dc0071..4f5345275a 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -661,7 +661,7 @@ func (w *worker) resultLoop() { func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { // Retrieve the parent state to execute on top and start a prefetcher for // the miner to speed block sealing up a bit - state, err := w.chain.StateAt(parent.Root()) + state, err := w.chain.StateAtWithSharedPool(parent.Root()) if err != nil { return err } @@ -786,7 +786,10 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin txCurr := &tx //prefetch txs from all pending txs txsPrefetch := txs.Copy() - w.prefetcher.PrefetchMining(txsPrefetch, w.current.header, w.current.gasPool.Gas(), w.current.state.Copy(), *w.chain.GetVMConfig(), interruptCh, txCurr) + newStatedb := w.current.state.Copy() + newStatedb.EnableWriteOnSharedStorage() + w.prefetcher.PrefetchMining(txsPrefetch, w.current.header, + w.current.gasPool.Gas(), newStatedb, *w.chain.GetVMConfig(), interruptCh, txCurr) LOOP: for {