aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-04-27 19:27:33 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-04-27 19:29:18 +0800
commit7a7428a027de03ad9e80e89a70818c692193e60a (patch)
treec6c40618954b558f50d82aa4b9522e01365cec9c
parentcfe8f5fd948954ccedd975b6630e455a4e5653db (diff)
downloaddexon-7a7428a027de03ad9e80e89a70818c692193e60a.tar.gz
dexon-7a7428a027de03ad9e80e89a70818c692193e60a.tar.zst
dexon-7a7428a027de03ad9e80e89a70818c692193e60a.zip
core, eth: fix tracer dirty finalization
-rw-r--r--core/state/statedb.go21
-rw-r--r--core/vm/evm.go5
-rw-r--r--eth/api_tracer.go5
3 files changed, 8 insertions, 23 deletions
diff --git a/core/state/statedb.go b/core/state/statedb.go
index 3ae6843d8..a952027d6 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -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]
diff --git a/core/vm/evm.go b/core/vm/evm.go
index 96676c314..ea4620974 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -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)
diff --git a/eth/api_tracer.go b/eth/api_tracer.go
index 07c4457bc..80a3ab719 100644
--- a/eth/api_tracer.go
+++ b/eth/api_tracer.go
@@ -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)
}