From f17366534ea8e2704bffd106bb0b5968b871cece Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Wed, 30 Nov 2016 16:18:01 +0100 Subject: [PATCH] core: leave contract addr in receipt empty when deployment fails --- core/state_processor.go | 6 ++++-- core/state_transition.go | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/state_processor.go b/core/state_processor.go index e346917c32..8a2b466f03 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -97,7 +97,7 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, gp *GasPool, s return nil, nil, nil, err } - _, gas, err := ApplyMessage(NewEnv(statedb, config, bc, msg, header, cfg), msg, gp) + ret, gas, err := ApplyMessage(NewEnv(statedb, config, bc, msg, header, cfg), msg, gp) if err != nil { return nil, nil, nil, err } @@ -107,7 +107,9 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, gp *GasPool, s receipt := types.NewReceipt(statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes(), usedGas) receipt.TxHash = tx.Hash() receipt.GasUsed = new(big.Int).Set(gas) - if MessageCreatesContract(msg) { + + // ret is only not nil when the contract is deployed successful. + if MessageCreatesContract(msg) && ret != nil { receipt.ContractAddress = crypto.CreateAddress(msg.From(), tx.Nonce()) } diff --git a/core/state_transition.go b/core/state_transition.go index 8abe17b0a2..d1bfe439e5 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -235,6 +235,8 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b if err != nil { ret = nil glog.V(logger.Core).Infoln("VM create err:", err) + } else if ret == nil { // contract deployed without code + ret = []byte{} } } else { // Increment the nonce for the next transaction