opt: upgrade blockResult process flow (#68)

* upgrade blockResult process flow

* fix format optimization
This commit is contained in:
maskpp 2022-03-31 18:01:14 +08:00 committed by GitHub
parent a96775b3ff
commit 40e8f088b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 11 deletions

View file

@ -1188,17 +1188,17 @@ func (bc *BlockChain) writeKnownBlock(block *types.Block) error {
}
// WriteBlockWithState writes the block and all associated state to the database.
func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, blockResult *types.BlockResult, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) {
func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, evmTraces []*types.ExecutionResult, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) {
if !bc.chainmu.TryLock() {
return NonStatTy, errInsertionInterrupted
}
defer bc.chainmu.Unlock()
return bc.writeBlockWithState(block, receipts, logs, blockResult, state, emitHeadEvent)
return bc.writeBlockWithState(block, receipts, logs, evmTraces, state, emitHeadEvent)
}
// writeBlockWithState writes the block and all associated state to the database,
// but is expects the chain mutex to be held.
func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, blockResult *types.BlockResult, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) {
func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, evmTraces []*types.ExecutionResult, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) {
if bc.insertStopped() {
return NonStatTy, errInsertionInterrupted
}
@ -1320,8 +1320,9 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.
bc.futureBlocks.Remove(block.Hash())
// Fill blockResult content
if blockResult != nil {
bc.writeBlockResult(state, block, blockResult)
var blockResult *types.BlockResult
if evmTraces != nil {
blockResult = bc.writeBlockResult(state, block, evmTraces)
bc.blockResultCache.Add(block.Hash(), blockResult)
}
@ -1345,7 +1346,10 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.
}
// Fill blockResult content
func (bc *BlockChain) writeBlockResult(state *state.StateDB, block *types.Block, blockResult *types.BlockResult) {
func (bc *BlockChain) writeBlockResult(state *state.StateDB, block *types.Block, evmTraces []*types.ExecutionResult) *types.BlockResult {
blockResult := &types.BlockResult{
ExecutionResults: evmTraces,
}
coinbase := types.AccountProofWrapper{
Address: block.Coinbase(),
Nonce: state.GetNonce(block.Coinbase()),
@ -1396,6 +1400,7 @@ func (bc *BlockChain) writeBlockResult(state *state.StateDB, block *types.Block,
evmTrace.ByteCode = hexutil.Encode(tx.Data())
}
}
return blockResult
}
// addFutureBlock checks if the block is within the max allowed window to get

View file

@ -181,7 +181,7 @@ func (l *StructLogger) CaptureState(pc uint64, op OpCode, gas, cost uint64, scop
}
}
var (
recordStorageDetail bool = false
recordStorageDetail bool
storage Storage
storageKey common.Hash
storageValue common.Hash
@ -189,12 +189,12 @@ func (l *StructLogger) CaptureState(pc uint64, op OpCode, gas, cost uint64, scop
if !l.cfg.DisableStorage {
if op == SLOAD && stack.len() >= 1 {
recordStorageDetail = true
storageKey = common.Hash(stack.data[stack.len()-1].Bytes32())
storageKey = stack.data[stack.len()-1].Bytes32()
storageValue = l.env.StateDB.GetState(contract.Address(), storageKey)
} else if op == SSTORE && stack.len() >= 2 {
recordStorageDetail = true
storageKey = common.Hash(stack.data[stack.len()-1].Bytes32())
storageValue = common.Hash(stack.data[stack.len()-2].Bytes32())
storageKey = stack.data[stack.len()-1].Bytes32()
storageValue = stack.data[stack.len()-2].Bytes32()
}
}
extraData := types.NewExtraData()

View file

@ -668,7 +668,7 @@ func (w *worker) resultLoop() {
logs = append(logs, receipt.Logs...)
}
// Commit block and state to database.
_, err := w.chain.WriteBlockWithState(block, receipts, logs, &types.BlockResult{ExecutionResults: evmTraces}, task.state, true)
_, err := w.chain.WriteBlockWithState(block, receipts, logs, evmTraces, task.state, true)
if err != nil {
log.Error("Failed writing block to chain", "err", err)
continue