diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-04-27 19:27:33 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-04-27 19:29:18 +0800 |
commit | 7a7428a027de03ad9e80e89a70818c692193e60a (patch) | |
tree | c6c40618954b558f50d82aa4b9522e01365cec9c | |
parent | cfe8f5fd948954ccedd975b6630e455a4e5653db (diff) | |
download | dexon-7a7428a027de03ad9e80e89a70818c692193e60a.tar.gz dexon-7a7428a027de03ad9e80e89a70818c692193e60a.tar.zst dexon-7a7428a027de03ad9e80e89a70818c692193e60a.zip |
core, eth: fix tracer dirty finalization
-rw-r--r-- | core/state/statedb.go | 21 | ||||
-rw-r--r-- | core/vm/evm.go | 5 | ||||
-rw-r--r-- | eth/api_tracer.go | 5 |
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) } |