eth/tracers: simplify test framework (#25973)
Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>
This commit is contained in:
parent
a404195c7b
commit
5f70f9fd37
|
@ -48,17 +48,18 @@ type callContext struct {
|
||||||
|
|
||||||
// callTrace is the result of a callTracer run.
|
// callTrace is the result of a callTracer run.
|
||||||
type callTrace struct {
|
type callTrace struct {
|
||||||
Type string `json:"type"`
|
|
||||||
From common.Address `json:"from"`
|
From common.Address `json:"from"`
|
||||||
To common.Address `json:"to"`
|
Gas *hexutil.Uint64 `json:"gas"`
|
||||||
|
GasUsed *hexutil.Uint64 `json:"gasUsed"`
|
||||||
|
To common.Address `json:"to,omitempty"`
|
||||||
Input hexutil.Bytes `json:"input"`
|
Input hexutil.Bytes `json:"input"`
|
||||||
Output hexutil.Bytes `json:"output"`
|
Output hexutil.Bytes `json:"output,omitempty"`
|
||||||
Gas *hexutil.Uint64 `json:"gas,omitempty"`
|
|
||||||
GasUsed *hexutil.Uint64 `json:"gasUsed,omitempty"`
|
|
||||||
Value *hexutil.Big `json:"value,omitempty"`
|
|
||||||
Error string `json:"error,omitempty"`
|
Error string `json:"error,omitempty"`
|
||||||
Revertal string `json:"revertReason,omitempty"`
|
Revertal string `json:"revertReason,omitempty"`
|
||||||
Calls []callTrace `json:"calls,omitempty"`
|
Calls []callTrace `json:"calls,omitempty"`
|
||||||
|
Value *hexutil.Big `json:"value,omitempty"`
|
||||||
|
// Gencodec adds overridden fields at the end
|
||||||
|
Type string `json:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// callTracerTest defines a single test to check the call tracer against.
|
// callTracerTest defines a single test to check the call tracer against.
|
||||||
|
@ -144,17 +145,21 @@ func testCallTracer(tracerName string, dirPath string, t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to retrieve trace result: %v", err)
|
t.Fatalf("failed to retrieve trace result: %v", err)
|
||||||
}
|
}
|
||||||
ret := new(callTrace)
|
// The legacy javascript calltracer marshals json in js, which
|
||||||
if err := json.Unmarshal(res, ret); err != nil {
|
// is not deterministic (as opposed to the golang json encoder).
|
||||||
t.Fatalf("failed to unmarshal trace result: %v", err)
|
if strings.HasSuffix(dirPath, "_legacy") {
|
||||||
|
// This is a tweak to make it deterministic. Can be removed when
|
||||||
|
// we remove the legacy tracer.
|
||||||
|
var x callTrace
|
||||||
|
json.Unmarshal(res, &x)
|
||||||
|
res, _ = json.Marshal(x)
|
||||||
}
|
}
|
||||||
|
want, err := json.Marshal(test.Result)
|
||||||
if !jsonEqual(ret, test.Result, new(callTrace), new(callTrace)) {
|
if err != nil {
|
||||||
// uncomment this for easier debugging
|
t.Fatalf("failed to marshal test: %v", err)
|
||||||
//have, _ := json.MarshalIndent(ret, "", " ")
|
}
|
||||||
//want, _ := json.MarshalIndent(test.Result, "", " ")
|
if string(want) != string(res) {
|
||||||
//t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want))
|
t.Fatalf("trace mismatch\n have: %v\n want: %v\n", string(res), string(want))
|
||||||
t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -298,14 +303,8 @@ func TestZeroValueToNotExitCall(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to retrieve trace result: %v", err)
|
t.Fatalf("failed to retrieve trace result: %v", err)
|
||||||
}
|
}
|
||||||
have := new(callTrace)
|
wantStr := `{"from":"0x682a80a6f560eec50d54e63cbeda1c324c5f8d1b","gas":"0x7148","gasUsed":"0x2d0","to":"0x00000000000000000000000000000000deadbeef","input":"0x","calls":[{"from":"0x00000000000000000000000000000000deadbeef","gas":"0x6cbf","gasUsed":"0x0","to":"0x00000000000000000000000000000000000000ff","input":"0x","value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}`
|
||||||
if err := json.Unmarshal(res, have); err != nil {
|
if string(res) != wantStr {
|
||||||
t.Fatalf("failed to unmarshal trace result: %v", err)
|
t.Fatalf("trace mismatch\n have: %v\n want: %v\n", string(res), wantStr)
|
||||||
}
|
|
||||||
wantStr := `{"type":"CALL","from":"0x682a80a6f560eec50d54e63cbeda1c324c5f8d1b","to":"0x00000000000000000000000000000000deadbeef","value":"0x0","gas":"0x7148","gasUsed":"0x2d0","input":"0x","output":"0x","calls":[{"type":"CALL","from":"0x00000000000000000000000000000000deadbeef","to":"0x00000000000000000000000000000000000000ff","value":"0x0","gas":"0x6cbf","gasUsed":"0x0","input":"0x","output":"0x"}]}`
|
|
||||||
want := new(callTrace)
|
|
||||||
json.Unmarshal([]byte(wantStr), want)
|
|
||||||
if !jsonEqual(have, want, new(callTrace), new(callTrace)) {
|
|
||||||
t.Error("have != want")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,19 +35,16 @@ import (
|
||||||
|
|
||||||
// prestateTrace is the result of a prestateTrace run.
|
// prestateTrace is the result of a prestateTrace run.
|
||||||
type prestateTrace = map[common.Address]*account
|
type prestateTrace = map[common.Address]*account
|
||||||
|
|
||||||
type account struct {
|
type account struct {
|
||||||
Balance string `json:"balance,omitempty"`
|
Balance string `json:"balance"`
|
||||||
Nonce uint64 `json:"nonce,omitempty"`
|
Code string `json:"code"`
|
||||||
Code string `json:"code,omitempty"`
|
Nonce uint64 `json:"nonce"`
|
||||||
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
Storage map[common.Hash]common.Hash `json:"storage"`
|
||||||
}
|
|
||||||
type prePostStateTrace struct {
|
|
||||||
Pre prestateTrace `json:"pre"`
|
|
||||||
Post prestateTrace `json:"post"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// prestateTraceTest defines a single test to check the stateDiff tracer against.
|
// testcase defines a single test to check the stateDiff tracer against.
|
||||||
type prestateTraceTest struct {
|
type testcase struct {
|
||||||
Genesis *core.Genesis `json:"genesis"`
|
Genesis *core.Genesis `json:"genesis"`
|
||||||
Context *callContext `json:"context"`
|
Context *callContext `json:"context"`
|
||||||
Input string `json:"input"`
|
Input string `json:"input"`
|
||||||
|
@ -55,15 +52,19 @@ type prestateTraceTest struct {
|
||||||
Result interface{} `json:"result"`
|
Result interface{} `json:"result"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPrestateTracerLegacy(t *testing.T) {
|
||||||
|
testPrestateDiffTracer("prestateTracerLegacy", "prestate_tracer_legacy", t)
|
||||||
|
}
|
||||||
|
|
||||||
func TestPrestateTracer(t *testing.T) {
|
func TestPrestateTracer(t *testing.T) {
|
||||||
testPrestateDiffTracer("prestateTracer", "prestate_tracer", t, func() interface{} { return new(prestateTrace) })
|
testPrestateDiffTracer("prestateTracer", "prestate_tracer", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrestateWithDiffModeTracer(t *testing.T) {
|
func TestPrestateWithDiffModeTracer(t *testing.T) {
|
||||||
testPrestateDiffTracer("prestateTracer", "prestate_tracer_with_diff_mode", t, func() interface{} { return new(prePostStateTrace) })
|
testPrestateDiffTracer("prestateTracer", "prestate_tracer_with_diff_mode", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T, typeBuilder func() interface{}) {
|
func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) {
|
||||||
files, err := os.ReadDir(filepath.Join("testdata", dirPath))
|
files, err := os.ReadDir(filepath.Join("testdata", dirPath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to retrieve tracer test suite: %v", err)
|
t.Fatalf("failed to retrieve tracer test suite: %v", err)
|
||||||
|
@ -77,7 +78,7 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T, typ
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
var (
|
var (
|
||||||
test = new(prestateTraceTest)
|
test = new(testcase)
|
||||||
tx = new(types.Transaction)
|
tx = new(types.Transaction)
|
||||||
)
|
)
|
||||||
// Call tracer test found, read if from disk
|
// Call tracer test found, read if from disk
|
||||||
|
@ -127,17 +128,21 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T, typ
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to retrieve trace result: %v", err)
|
t.Fatalf("failed to retrieve trace result: %v", err)
|
||||||
}
|
}
|
||||||
ret := typeBuilder()
|
// The legacy javascript calltracer marshals json in js, which
|
||||||
if err := json.Unmarshal(res, ret); err != nil {
|
// is not deterministic (as opposed to the golang json encoder).
|
||||||
t.Fatalf("failed to unmarshal trace result: %v", err)
|
if strings.HasSuffix(dirPath, "_legacy") {
|
||||||
|
// This is a tweak to make it deterministic. Can be removed when
|
||||||
|
// we remove the legacy tracer.
|
||||||
|
var x prestateTrace
|
||||||
|
json.Unmarshal(res, &x)
|
||||||
|
res, _ = json.Marshal(x)
|
||||||
}
|
}
|
||||||
|
want, err := json.Marshal(test.Result)
|
||||||
if !jsonEqual(ret, test.Result, typeBuilder(), typeBuilder()) {
|
if err != nil {
|
||||||
// uncomment this for easier debugging
|
t.Fatalf("failed to marshal test: %v", err)
|
||||||
// have, _ := json.MarshalIndent(ret, "", " ")
|
}
|
||||||
// want, _ := json.MarshalIndent(test.Result, "", " ")
|
if string(want) != string(res) {
|
||||||
// t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want))
|
t.Fatalf("trace mismatch\n have: %v\n want: %v\n", string(res), string(want))
|
||||||
t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,8 +77,7 @@
|
||||||
"nonce": 29072
|
"nonce": 29072
|
||||||
},
|
},
|
||||||
"0x1585936b53834b021f68cc13eeefdec2efc8e724": {
|
"0x1585936b53834b021f68cc13eeefdec2efc8e724": {
|
||||||
"balance": "0x0",
|
"balance": "0x0"
|
||||||
"nonce": 0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
{
|
||||||
|
"context": {
|
||||||
|
"difficulty": "3502894804",
|
||||||
|
"gasLimit": "4722976",
|
||||||
|
"miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
|
||||||
|
"number": "2289806",
|
||||||
|
"timestamp": "1513601314"
|
||||||
|
},
|
||||||
|
"genesis": {
|
||||||
|
"alloc": {
|
||||||
|
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
||||||
|
"balance": "0x0",
|
||||||
|
"code": "0x",
|
||||||
|
"nonce": "22",
|
||||||
|
"storage": {}
|
||||||
|
},
|
||||||
|
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
||||||
|
"balance": "0x4d87094125a369d9bd5",
|
||||||
|
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
||||||
|
"nonce": "1",
|
||||||
|
"storage": {
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
||||||
|
"balance": "0x1780d77678137ac1b775",
|
||||||
|
"code": "0x",
|
||||||
|
"nonce": "29072",
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"byzantiumBlock": 1700000,
|
||||||
|
"chainId": 3,
|
||||||
|
"daoForkSupport": true,
|
||||||
|
"eip150Block": 0,
|
||||||
|
"eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
|
||||||
|
"eip155Block": 10,
|
||||||
|
"eip158Block": 10,
|
||||||
|
"ethash": {},
|
||||||
|
"homesteadBlock": 0
|
||||||
|
},
|
||||||
|
"difficulty": "3509749784",
|
||||||
|
"extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
|
||||||
|
"gasLimit": "4727564",
|
||||||
|
"hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
|
||||||
|
"miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
|
||||||
|
"mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
|
||||||
|
"nonce": "0x4eb12e19c16d43da",
|
||||||
|
"number": "2289805",
|
||||||
|
"stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
|
||||||
|
"timestamp": "1513601261",
|
||||||
|
"totalDifficulty": "7143276353481064"
|
||||||
|
},
|
||||||
|
"input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
|
||||||
|
"result": {
|
||||||
|
"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
|
||||||
|
"balance": "0x0",
|
||||||
|
"code": "0x",
|
||||||
|
"nonce": 22,
|
||||||
|
"storage": {}
|
||||||
|
},
|
||||||
|
"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
|
||||||
|
"balance": "0x4d87094125a369d9bd5",
|
||||||
|
"code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
|
||||||
|
"nonce": 1,
|
||||||
|
"storage": {
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
|
||||||
|
"balance": "0x1780d77678137ac1b775",
|
||||||
|
"code": "0x",
|
||||||
|
"nonce": 29072,
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,6 @@
|
||||||
package tracetest
|
package tracetest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
|
@ -64,22 +62,6 @@ var makeTest = function(tx, rewind) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// jsonEqual is similar to reflect.DeepEqual, but does a 'bounce' via json prior to
|
|
||||||
// comparison
|
|
||||||
func jsonEqual(xi, yi, xt, yt interface{}) bool {
|
|
||||||
if xj, err := json.Marshal(xi); err == nil {
|
|
||||||
json.Unmarshal(xj, xt)
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if yj, err := json.Marshal(yi); err == nil {
|
|
||||||
json.Unmarshal(yj, yt)
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return reflect.DeepEqual(xt, yt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// camel converts a snake cased input string into a camel cased output.
|
// camel converts a snake cased input string into a camel cased output.
|
||||||
func camel(str string) string {
|
func camel(str string) string {
|
||||||
pieces := strings.Split(str, "_")
|
pieces := strings.Split(str, "_")
|
||||||
|
|
|
@ -204,7 +204,6 @@
|
||||||
gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),
|
gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),
|
||||||
input: toHex(ctx.input),
|
input: toHex(ctx.input),
|
||||||
output: toHex(ctx.output),
|
output: toHex(ctx.output),
|
||||||
time: ctx.time,
|
|
||||||
};
|
};
|
||||||
if (this.callstack[0].calls !== undefined) {
|
if (this.callstack[0].calls !== undefined) {
|
||||||
result.calls = this.callstack[0].calls;
|
result.calls = this.callstack[0].calls;
|
||||||
|
|
|
@ -16,14 +16,14 @@ var _ = (*accountMarshaling)(nil)
|
||||||
func (a account) MarshalJSON() ([]byte, error) {
|
func (a account) MarshalJSON() ([]byte, error) {
|
||||||
type account struct {
|
type account struct {
|
||||||
Balance *hexutil.Big `json:"balance,omitempty"`
|
Balance *hexutil.Big `json:"balance,omitempty"`
|
||||||
Nonce uint64 `json:"nonce,omitempty"`
|
|
||||||
Code hexutil.Bytes `json:"code,omitempty"`
|
Code hexutil.Bytes `json:"code,omitempty"`
|
||||||
|
Nonce uint64 `json:"nonce,omitempty"`
|
||||||
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
||||||
}
|
}
|
||||||
var enc account
|
var enc account
|
||||||
enc.Balance = (*hexutil.Big)(a.Balance)
|
enc.Balance = (*hexutil.Big)(a.Balance)
|
||||||
enc.Nonce = a.Nonce
|
|
||||||
enc.Code = a.Code
|
enc.Code = a.Code
|
||||||
|
enc.Nonce = a.Nonce
|
||||||
enc.Storage = a.Storage
|
enc.Storage = a.Storage
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
@ -31,10 +31,10 @@ func (a account) MarshalJSON() ([]byte, error) {
|
||||||
// UnmarshalJSON unmarshals from JSON.
|
// UnmarshalJSON unmarshals from JSON.
|
||||||
func (a *account) UnmarshalJSON(input []byte) error {
|
func (a *account) UnmarshalJSON(input []byte) error {
|
||||||
type account struct {
|
type account struct {
|
||||||
Balance *hexutil.Big `json:"balance"`
|
Balance *hexutil.Big `json:"balance,omitempty"`
|
||||||
Nonce *uint64 `json:"nonce"`
|
Code *hexutil.Bytes `json:"code,omitempty"`
|
||||||
Code *hexutil.Bytes `json:"code"`
|
Nonce *uint64 `json:"nonce,omitempty"`
|
||||||
Storage map[common.Hash]common.Hash `json:"storage"`
|
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
||||||
}
|
}
|
||||||
var dec account
|
var dec account
|
||||||
if err := json.Unmarshal(input, &dec); err != nil {
|
if err := json.Unmarshal(input, &dec); err != nil {
|
||||||
|
@ -43,12 +43,12 @@ func (a *account) UnmarshalJSON(input []byte) error {
|
||||||
if dec.Balance != nil {
|
if dec.Balance != nil {
|
||||||
a.Balance = (*big.Int)(dec.Balance)
|
a.Balance = (*big.Int)(dec.Balance)
|
||||||
}
|
}
|
||||||
if dec.Nonce != nil {
|
|
||||||
a.Nonce = *dec.Nonce
|
|
||||||
}
|
|
||||||
if dec.Code != nil {
|
if dec.Code != nil {
|
||||||
a.Code = *dec.Code
|
a.Code = *dec.Code
|
||||||
}
|
}
|
||||||
|
if dec.Nonce != nil {
|
||||||
|
a.Nonce = *dec.Nonce
|
||||||
|
}
|
||||||
if dec.Storage != nil {
|
if dec.Storage != nil {
|
||||||
a.Storage = dec.Storage
|
a.Storage = dec.Storage
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,8 @@ type state = map[common.Address]*account
|
||||||
|
|
||||||
type account struct {
|
type account struct {
|
||||||
Balance *big.Int `json:"balance,omitempty"`
|
Balance *big.Int `json:"balance,omitempty"`
|
||||||
Nonce uint64 `json:"nonce,omitempty"`
|
|
||||||
Code []byte `json:"code,omitempty"`
|
Code []byte `json:"code,omitempty"`
|
||||||
|
Nonce uint64 `json:"nonce,omitempty"`
|
||||||
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,9 +253,9 @@ func (t *prestateTracer) GetResult() (json.RawMessage, error) {
|
||||||
var err error
|
var err error
|
||||||
if t.config.DiffMode {
|
if t.config.DiffMode {
|
||||||
res, err = json.Marshal(struct {
|
res, err = json.Marshal(struct {
|
||||||
Pre state `json:"pre"`
|
|
||||||
Post state `json:"post"`
|
Post state `json:"post"`
|
||||||
}{t.pre, t.post})
|
Pre state `json:"pre"`
|
||||||
|
}{t.post, t.pre})
|
||||||
} else {
|
} else {
|
||||||
res, err = json.Marshal(t.pre)
|
res, err = json.Marshal(t.pre)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue