Skip to content

Commit fd4e1f8

Browse files
nebojsa94s1na
andauthored
eth/tracers: flag for empty acounts in prestateTracer (#31855)
This PR introduces a flag that enables returning of newly created state objects in the prestateTracer. **Rationale** Having this information is useful because local execution can more easily distinguish between newly created objects and system contracts. --------- Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>
1 parent 72d9269 commit fd4e1f8

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"context": {
3+
"difficulty": "3755480783",
4+
"gasLimit": "5401723",
5+
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
6+
"number": "2294702",
7+
"timestamp": "1513676146"
8+
},
9+
"genesis": {
10+
"alloc": {
11+
"0x13e4acefe6a6700604929946e70e6443e4e73447": {
12+
"balance": "0xcf3e0938579f000",
13+
"code": "0x",
14+
"nonce": "9",
15+
"storage": {}
16+
}
17+
},
18+
"config": {
19+
"byzantiumBlock": 1700000,
20+
"chainId": 3,
21+
"daoForkSupport": true,
22+
"eip150Block": 0,
23+
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
24+
"eip155Block": 10,
25+
"eip158Block": 10,
26+
"ethash": {},
27+
"homesteadBlock": 0
28+
},
29+
"difficulty": "3757315409",
30+
"extraData": "0x566961425443",
31+
"gasLimit": "5406414",
32+
"hash": "0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d",
33+
"miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
34+
"mixHash": "0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1",
35+
"nonce": "0x93363bbd2c95f410",
36+
"number": "2294701",
37+
"stateRoot": "0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c",
38+
"timestamp": "1513676127"
39+
},
40+
"input": "0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f",
41+
"tracerConfig": {
42+
"includeEmpty": true
43+
},
44+
"result": {
45+
"0x13e4acefe6a6700604929946e70e6443e4e73447": {
46+
"balance": "0xcf3e0938579f000",
47+
"nonce": 9
48+
},
49+
"0x7dc9c9730689ff0b0fd506c67db815f12d90a448": {
50+
"balance": "0x0",
51+
"storage": {
52+
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000",
53+
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000",
54+
"0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000000"
55+
}
56+
},
57+
"0xd049bfd667cb46aa3ef5df0da3e57db3be39e511": {
58+
"balance": "0x0"
59+
}
60+
}
61+
}

eth/tracers/native/prestate.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package native
1919
import (
2020
"bytes"
2121
"encoding/json"
22+
"errors"
2223
"math/big"
2324
"sync/atomic"
2425

@@ -75,13 +76,19 @@ type prestateTracerConfig struct {
7576
DiffMode bool `json:"diffMode"` // If true, this tracer will return state modifications
7677
DisableCode bool `json:"disableCode"` // If true, this tracer will not return the contract code
7778
DisableStorage bool `json:"disableStorage"` // If true, this tracer will not return the contract storage
79+
IncludeEmpty bool `json:"includeEmpty"` // If true, this tracer will return empty state objects
7880
}
7981

8082
func newPrestateTracer(ctx *tracers.Context, cfg json.RawMessage, chainConfig *params.ChainConfig) (*tracers.Tracer, error) {
8183
var config prestateTracerConfig
8284
if err := json.Unmarshal(cfg, &config); err != nil {
8385
return nil, err
8486
}
87+
// Diff mode has special semantics around account creating and deletion which
88+
// requires it to include empty accounts and storage.
89+
if config.DiffMode && config.IncludeEmpty {
90+
return nil, errors.New("cannot use diffMode with includeEmpty")
91+
}
8592
t := &prestateTracer{
8693
pre: stateMap{},
8794
post: stateMap{},
@@ -180,7 +187,7 @@ func (t *prestateTracer) OnTxEnd(receipt *types.Receipt, err error) {
180187
// the new created contracts' prestate were empty, so delete them
181188
for a := range t.created {
182189
// the created contract maybe exists in statedb before the creating tx
183-
if s := t.pre[a]; s != nil && s.empty {
190+
if s := t.pre[a]; s != nil && s.empty && !t.config.IncludeEmpty {
184191
delete(t.pre, a)
185192
}
186193
}

0 commit comments

Comments
 (0)