forked from cerc-io/plugeth
eth/tracers/native: set created address to nil in case of failure (#26779)
Fixes #26073
This commit is contained in:
parent
cb1f6bdbc8
commit
41af42e97c
@ -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
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user