core, eth: fix tracer dirty finalization
This commit is contained in:
		@@ -572,27 +572,6 @@ func (self *StateDB) Prepare(thash, bhash common.Hash, ti int) {
 | 
			
		||||
	self.txIndex = ti
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteSuicides flags the suicided objects for deletion so that it
 | 
			
		||||
// won't be referenced again when called / queried up on.
 | 
			
		||||
//
 | 
			
		||||
// DeleteSuicides should not be used for consensus related updates
 | 
			
		||||
// under any circumstances.
 | 
			
		||||
func (s *StateDB) DeleteSuicides() {
 | 
			
		||||
	// Reset refund so that any used-gas calculations can use this method.
 | 
			
		||||
	s.clearJournalAndRefund()
 | 
			
		||||
 | 
			
		||||
	for addr := range s.stateObjectsDirty {
 | 
			
		||||
		stateObject := s.stateObjects[addr]
 | 
			
		||||
 | 
			
		||||
		// If the object has been removed by a suicide
 | 
			
		||||
		// flag the object as deleted.
 | 
			
		||||
		if stateObject.suicided {
 | 
			
		||||
			stateObject.deleted = true
 | 
			
		||||
		}
 | 
			
		||||
		delete(s.stateObjectsDirty, addr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *StateDB) clearJournalAndRefund() {
 | 
			
		||||
	s.journal = newJournal()
 | 
			
		||||
	s.validRevisions = s.validRevisions[:0]
 | 
			
		||||
 
 | 
			
		||||
@@ -160,6 +160,11 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
 | 
			
		||||
			precompiles = PrecompiledContractsByzantium
 | 
			
		||||
		}
 | 
			
		||||
		if precompiles[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 {
 | 
			
		||||
			// Calling a non existing account, don't do antything, but ping the tracer
 | 
			
		||||
			if evm.vmConfig.Debug && evm.depth == 0 {
 | 
			
		||||
				evm.vmConfig.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, value)
 | 
			
		||||
				evm.vmConfig.Tracer.CaptureEnd(ret, 0, 0, nil)
 | 
			
		||||
			}
 | 
			
		||||
			return nil, gas, nil
 | 
			
		||||
		}
 | 
			
		||||
		evm.StateDB.CreateAccount(addr)
 | 
			
		||||
 
 | 
			
		||||
@@ -201,7 +201,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl
 | 
			
		||||
						log.Warn("Tracing failed", "hash", tx.Hash(), "block", task.block.NumberU64(), "err", err)
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
					task.statedb.DeleteSuicides()
 | 
			
		||||
					task.statedb.Finalise(true)
 | 
			
		||||
					task.results[i] = &txTraceResult{Result: res}
 | 
			
		||||
				}
 | 
			
		||||
				// Stream the result back to the user or abort on teardown
 | 
			
		||||
@@ -640,7 +640,8 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree
 | 
			
		||||
		if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil {
 | 
			
		||||
			return nil, vm.Context{}, nil, fmt.Errorf("tx %x failed: %v", tx.Hash(), err)
 | 
			
		||||
		}
 | 
			
		||||
		statedb.DeleteSuicides()
 | 
			
		||||
		// Ensure any modifications are committed to the state
 | 
			
		||||
		statedb.Finalise(true)
 | 
			
		||||
	}
 | 
			
		||||
	return nil, vm.Context{}, nil, fmt.Errorf("tx index %d out of range for block %x", txIndex, blockHash)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user