eth/tracers/native: set created address to nil in case of failure (#26779)

Fixes #26073
This commit is contained in:
Sina Mahmoodi 2023-03-07 17:09:11 +03:30 committed by GitHub
parent cb1f6bdbc8
commit 41af42e97c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 35 deletions

View File

@ -58,7 +58,7 @@ type callTrace struct {
From common.Address `json:"from"` From common.Address `json:"from"`
Gas *hexutil.Uint64 `json:"gas"` Gas *hexutil.Uint64 `json:"gas"`
GasUsed *hexutil.Uint64 `json:"gasUsed"` GasUsed *hexutil.Uint64 `json:"gasUsed"`
To common.Address `json:"to,omitempty"` To *common.Address `json:"to,omitempty"`
Input hexutil.Bytes `json:"input"` Input hexutil.Bytes `json:"input"`
Output hexutil.Bytes `json:"output,omitempty"` Output hexutil.Bytes `json:"output,omitempty"`
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`

File diff suppressed because one or more lines are too long

View File

@ -50,7 +50,6 @@
"input": "0x02f9029d82053980849502f90085010c388d00832dc6c08080b90241608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033c001a07566181071cabaf58b70fc41557eb813bfc7a24f5c58554e7fed0bf7c031f169a0420af50b5fe791a4d839e181a676db5250b415dfb35cb85d544db7a1475ae2cc", "input": "0x02f9029d82053980849502f90085010c388d00832dc6c08080b90241608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033c001a07566181071cabaf58b70fc41557eb813bfc7a24f5c58554e7fed0bf7c031f169a0420af50b5fe791a4d839e181a676db5250b415dfb35cb85d544db7a1475ae2cc",
"result": { "result": {
"from": "0x3623191d4ccfbbdf09e8ebf6382a1f8257417bc1", "from": "0x3623191d4ccfbbdf09e8ebf6382a1f8257417bc1",
"to": "0x0000000000000000000000000000000000000000",
"gas": "0x2cd774", "gas": "0x2cd774",
"gasUsed": "0x25590", "gasUsed": "0x25590",
"input": "0x608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033", "input": "0x608060405234801561001057600080fd5b50600060405161001f906100a2565b604051809103906000f08015801561003b573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c04062266040518163ffffffff1660e01b815260040160006040518083038186803b15801561008457600080fd5b505afa158015610098573d6000803e3d6000fd5b50505050506100af565b610145806100fc83390190565b603f806100bd6000396000f3fe6080604052600080fdfea264697066735822122077f7dbd3450d6e817079cf3fe27107de5768bb3163a402b94e2206b468eb025664736f6c63430008070033608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c040622614602d575b600080fd5b60336035565b005b60036002116076576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401606d906097565b60405180910390fd5b565b6000608360128360b5565b9150608c8260c6565b602082019050919050565b6000602082019050818103600083015260ae816078565b9050919050565b600082825260208201905092915050565b7f546869732063616c6c6564206661696c6564000000000000000000000000000060008201525056fea264697066735822122033f8d92e29d467e5ea08d0024eab0b36b86b8cdb3542c6e89dbaabeb8ffaa42064736f6c63430008070033",

View File

@ -42,17 +42,17 @@ type callLog struct {
} }
type callFrame struct { type callFrame struct {
Type vm.OpCode `json:"-"` Type vm.OpCode `json:"-"`
From common.Address `json:"from"` From common.Address `json:"from"`
Gas uint64 `json:"gas"` Gas uint64 `json:"gas"`
GasUsed uint64 `json:"gasUsed"` GasUsed uint64 `json:"gasUsed"`
To common.Address `json:"to,omitempty" rlp:"optional"` To *common.Address `json:"to,omitempty" rlp:"optional"`
Input []byte `json:"input" rlp:"optional"` Input []byte `json:"input" rlp:"optional"`
Output []byte `json:"output,omitempty" rlp:"optional"` Output []byte `json:"output,omitempty" rlp:"optional"`
Error string `json:"error,omitempty" rlp:"optional"` Error string `json:"error,omitempty" rlp:"optional"`
RevertReason string `json:"revertReason,omitempty"` RevertReason string `json:"revertReason,omitempty"`
Calls []callFrame `json:"calls,omitempty" rlp:"optional"` Calls []callFrame `json:"calls,omitempty" rlp:"optional"`
Logs []callLog `json:"logs,omitempty" rlp:"optional"` Logs []callLog `json:"logs,omitempty" rlp:"optional"`
// Placed at end on purpose. The RLP will be decoded to 0 instead of // Placed at end on purpose. The RLP will be decoded to 0 instead of
// nil if there are non-empty elements after in the struct. // nil if there are non-empty elements after in the struct.
Value *big.Int `json:"value,omitempty" rlp:"optional"` Value *big.Int `json:"value,omitempty" rlp:"optional"`
@ -74,7 +74,7 @@ func (f *callFrame) processOutput(output []byte, err error) {
} }
f.Error = err.Error() f.Error = err.Error()
if f.Type == vm.CREATE || f.Type == vm.CREATE2 { if f.Type == vm.CREATE || f.Type == vm.CREATE2 {
f.To = common.Address{} f.To = nil
} }
if !errors.Is(err, vm.ErrExecutionReverted) || len(output) == 0 { if !errors.Is(err, vm.ErrExecutionReverted) || len(output) == 0 {
return return
@ -127,10 +127,11 @@ func newCallTracer(ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, e
// CaptureStart implements the EVMLogger interface to initialize the tracing operation. // CaptureStart implements the EVMLogger interface to initialize the tracing operation.
func (t *callTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { func (t *callTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
toCopy := to
t.callstack[0] = callFrame{ t.callstack[0] = callFrame{
Type: vm.CALL, Type: vm.CALL,
From: from, From: from,
To: to, To: &toCopy,
Input: common.CopyBytes(input), Input: common.CopyBytes(input),
Gas: gas, Gas: gas,
Value: value, Value: value,
@ -191,10 +192,11 @@ func (t *callTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.
return return
} }
toCopy := to
call := callFrame{ call := callFrame{
Type: typ, Type: typ,
From: from, From: from,
To: to, To: &toCopy,
Input: common.CopyBytes(input), Input: common.CopyBytes(input),
Gas: gas, Gas: gas,
Value: value, Value: value,

View File

@ -193,7 +193,7 @@ func (t *flatCallTracer) CaptureExit(output []byte, gasUsed uint64, err error) {
to = call.To to = call.To
) )
if typ == vm.CALL || typ == vm.STATICCALL { if typ == vm.CALL || typ == vm.STATICCALL {
if t.isPrecompiled(to) { if t.isPrecompiled(*to) {
t.tracer.callstack[len(t.tracer.callstack)-1].Calls = parent.Calls[:len(parent.Calls)-1] t.tracer.callstack[len(t.tracer.callstack)-1].Calls = parent.Calls[:len(parent.Calls)-1]
} }
} }
@ -299,7 +299,7 @@ func newFlatCreate(input *callFrame) *flatCallFrame {
}, },
Result: &flatCallResult{ Result: &flatCallResult{
GasUsed: &input.GasUsed, GasUsed: &input.GasUsed,
Address: &input.To, Address: input.To,
Code: &resultCode, Code: &resultCode,
}, },
} }
@ -315,7 +315,7 @@ func newFlatCall(input *callFrame) *flatCallFrame {
Type: strings.ToLower(vm.CALL.String()), Type: strings.ToLower(vm.CALL.String()),
Action: flatCallAction{ Action: flatCallAction{
From: &input.From, From: &input.From,
To: &input.To, To: input.To,
Gas: &input.Gas, Gas: &input.Gas,
Value: input.Value, Value: input.Value,
CallType: strings.ToLower(input.Type.String()), CallType: strings.ToLower(input.Type.String()),
@ -334,7 +334,7 @@ func newFlatSuicide(input *callFrame) *flatCallFrame {
Action: flatCallAction{ Action: flatCallAction{
SelfDestructed: &input.From, SelfDestructed: &input.From,
Balance: input.Value, Balance: input.Value,
RefundAddress: &input.To, RefundAddress: input.To,
}, },
} }
} }

View File

@ -16,19 +16,19 @@ var _ = (*callFrameMarshaling)(nil)
// MarshalJSON marshals as JSON. // MarshalJSON marshals as JSON.
func (c callFrame) MarshalJSON() ([]byte, error) { func (c callFrame) MarshalJSON() ([]byte, error) {
type callFrame0 struct { type callFrame0 struct {
Type vm.OpCode `json:"-"` Type vm.OpCode `json:"-"`
From common.Address `json:"from"` From common.Address `json:"from"`
Gas hexutil.Uint64 `json:"gas"` Gas hexutil.Uint64 `json:"gas"`
GasUsed hexutil.Uint64 `json:"gasUsed"` GasUsed hexutil.Uint64 `json:"gasUsed"`
To common.Address `json:"to,omitempty" rlp:"optional"` To *common.Address `json:"to,omitempty" rlp:"optional"`
Input hexutil.Bytes `json:"input" rlp:"optional"` Input hexutil.Bytes `json:"input" rlp:"optional"`
Output hexutil.Bytes `json:"output,omitempty" rlp:"optional"` Output hexutil.Bytes `json:"output,omitempty" rlp:"optional"`
Error string `json:"error,omitempty" rlp:"optional"` Error string `json:"error,omitempty" rlp:"optional"`
RevertReason string `json:"revertReason,omitempty"` RevertReason string `json:"revertReason,omitempty"`
Calls []callFrame `json:"calls,omitempty" rlp:"optional"` Calls []callFrame `json:"calls,omitempty" rlp:"optional"`
Logs []callLog `json:"logs,omitempty" rlp:"optional"` Logs []callLog `json:"logs,omitempty" rlp:"optional"`
Value *hexutil.Big `json:"value,omitempty" rlp:"optional"` Value *hexutil.Big `json:"value,omitempty" rlp:"optional"`
TypeString string `json:"type"` TypeString string `json:"type"`
} }
var enc callFrame0 var enc callFrame0
enc.Type = c.Type enc.Type = c.Type
@ -80,7 +80,7 @@ func (c *callFrame) UnmarshalJSON(input []byte) error {
c.GasUsed = uint64(*dec.GasUsed) c.GasUsed = uint64(*dec.GasUsed)
} }
if dec.To != nil { if dec.To != nil {
c.To = *dec.To c.To = dec.To
} }
if dec.Input != nil { if dec.Input != nil {
c.Input = *dec.Input c.Input = *dec.Input