Skip to content

Commit 978ca5f

Browse files
authored
eth/tracers: various fixes (#30540)
Breaking changes: - The ChainConfig was exposed to tracers via VMContext passed in `OnTxStart`. This is unnecessary specially looking through the lens of live tracers as chain config remains the same throughout the lifetime of the program. It was there so that native API-invoked tracers could access it. So instead we moved it to the constructor of API tracers. Non-breaking: - Change the default config of the tracers to be `{}` instead of nil. This way an extra nil check can be avoided. Refactoring: - Rename `supply` struct to `supplyTracer`. - Un-export some hook definitions.
1 parent 18a5918 commit 978ca5f

File tree

24 files changed

+174
-120
lines changed

24 files changed

+174
-120
lines changed

cmd/evm/internal/t8ntool/execution.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ type rejectedTx struct {
132132
// Apply applies a set of transactions to a pre-state
133133
func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
134134
txIt txIterator, miningReward int64,
135-
getTracerFn func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error)) (*state.StateDB, *ExecutionResult, []byte, error) {
135+
getTracerFn func(txIndex int, txHash common.Hash, chainConfig *params.ChainConfig) (*tracers.Tracer, io.WriteCloser, error)) (*state.StateDB, *ExecutionResult, []byte, error) {
136136
// Capture errors for BLOCKHASH operation, if we haven't been supplied the
137137
// required blockhashes
138138
var hashError error
@@ -242,7 +242,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
242242
continue
243243
}
244244
}
245-
tracer, traceOutput, err := getTracerFn(txIndex, tx.Hash())
245+
tracer, traceOutput, err := getTracerFn(txIndex, tx.Hash(), chainConfig)
246246
if err != nil {
247247
return nil, nil, nil, err
248248
}

cmd/evm/internal/t8ntool/transition.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ type input struct {
8282
}
8383

8484
func Transition(ctx *cli.Context) error {
85-
var getTracer = func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error) { return nil, nil, nil }
85+
var getTracer = func(txIndex int, txHash common.Hash, chainConfig *params.ChainConfig) (*tracers.Tracer, io.WriteCloser, error) {
86+
return nil, nil, nil
87+
}
8688

8789
baseDir, err := createBasedir(ctx)
8890
if err != nil {
@@ -97,7 +99,7 @@ func Transition(ctx *cli.Context) error {
9799
EnableReturnData: ctx.Bool(TraceEnableReturnDataFlag.Name),
98100
Debug: true,
99101
}
100-
getTracer = func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error) {
102+
getTracer = func(txIndex int, txHash common.Hash, _ *params.ChainConfig) (*tracers.Tracer, io.WriteCloser, error) {
101103
traceFile, err := os.Create(filepath.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String())))
102104
if err != nil {
103105
return nil, nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err))
@@ -121,12 +123,12 @@ func Transition(ctx *cli.Context) error {
121123
if ctx.IsSet(TraceTracerConfigFlag.Name) {
122124
config = []byte(ctx.String(TraceTracerConfigFlag.Name))
123125
}
124-
getTracer = func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error) {
126+
getTracer = func(txIndex int, txHash common.Hash, chainConfig *params.ChainConfig) (*tracers.Tracer, io.WriteCloser, error) {
125127
traceFile, err := os.Create(filepath.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String())))
126128
if err != nil {
127129
return nil, nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err))
128130
}
129-
tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config)
131+
tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config, chainConfig)
130132
if err != nil {
131133
return nil, nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err))
132134
}

cmd/utils/flags.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ var (
543543
VMTraceJsonConfigFlag = &cli.StringFlag{
544544
Name: "vmtrace.jsonconfig",
545545
Usage: "Tracer configuration (JSON)",
546+
Value: "{}",
546547
Category: flags.VMCategory,
547548
}
548549
// API options.
@@ -1899,13 +1900,8 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) {
18991900
// VM tracing config.
19001901
if ctx.IsSet(VMTraceFlag.Name) {
19011902
if name := ctx.String(VMTraceFlag.Name); name != "" {
1902-
var config string
1903-
if ctx.IsSet(VMTraceJsonConfigFlag.Name) {
1904-
config = ctx.String(VMTraceJsonConfigFlag.Name)
1905-
}
1906-
19071903
cfg.VMTrace = name
1908-
cfg.VMTraceJsonConfig = config
1904+
cfg.VMTraceJsonConfig = ctx.String(VMTraceJsonConfigFlag.Name)
19091905
}
19101906
}
19111907
}
@@ -2186,10 +2182,7 @@ func MakeChain(ctx *cli.Context, stack *node.Node, readonly bool) (*core.BlockCh
21862182
}
21872183
if ctx.IsSet(VMTraceFlag.Name) {
21882184
if name := ctx.String(VMTraceFlag.Name); name != "" {
2189-
var config json.RawMessage
2190-
if ctx.IsSet(VMTraceJsonConfigFlag.Name) {
2191-
config = json.RawMessage(ctx.String(VMTraceJsonConfigFlag.Name))
2192-
}
2185+
config := json.RawMessage(ctx.String(VMTraceJsonConfigFlag.Name))
21932186
t, err := tracers.LiveDirectory.New(name, config)
21942187
if err != nil {
21952188
Fatalf("Failed to create tracer %q: %v", name, err)

core/tracing/hooks.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,8 @@ type VMContext struct {
5555
Time uint64
5656
Random *common.Hash
5757
// Effective tx gas price
58-
GasPrice *big.Int
59-
ChainConfig *params.ChainConfig
60-
StateDB StateDB
58+
GasPrice *big.Int
59+
StateDB StateDB
6160
}
6261

6362
// BlockEvent is emitted upon tracing an incoming block.

core/vm/evm.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,6 @@ func (evm *EVM) GetVMContext() *tracing.VMContext {
613613
Time: evm.Context.Time,
614614
Random: evm.Context.Random,
615615
GasPrice: evm.TxContext.GasPrice,
616-
ChainConfig: evm.ChainConfig(),
617616
StateDB: evm.StateDB,
618617
}
619618
}

core/vm/runtime/runtime_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ func benchmarkNonModifyingCode(gas uint64, code []byte, name string, tracerCode
395395
cfg.State, _ = state.New(types.EmptyRootHash, state.NewDatabaseForTesting())
396396
cfg.GasLimit = gas
397397
if len(tracerCode) > 0 {
398-
tracer, err := tracers.DefaultDirectory.New(tracerCode, new(tracers.Context), nil)
398+
tracer, err := tracers.DefaultDirectory.New(tracerCode, new(tracers.Context), nil, cfg.ChainConfig)
399399
if err != nil {
400400
b.Fatal(err)
401401
}
@@ -887,7 +887,7 @@ func TestRuntimeJSTracer(t *testing.T) {
887887
statedb.SetCode(common.HexToAddress("0xee"), calleeCode)
888888
statedb.SetCode(common.HexToAddress("0xff"), suicideCode)
889889

890-
tracer, err := tracers.DefaultDirectory.New(jsTracer, new(tracers.Context), nil)
890+
tracer, err := tracers.DefaultDirectory.New(jsTracer, new(tracers.Context), nil, params.MergedTestChainConfig)
891891
if err != nil {
892892
t.Fatal(err)
893893
}
@@ -922,7 +922,7 @@ func TestJSTracerCreateTx(t *testing.T) {
922922
code := []byte{byte(vm.PUSH1), 0, byte(vm.PUSH1), 0, byte(vm.RETURN)}
923923

924924
statedb, _ := state.New(types.EmptyRootHash, state.NewDatabaseForTesting())
925-
tracer, err := tracers.DefaultDirectory.New(jsTracer, new(tracers.Context), nil)
925+
tracer, err := tracers.DefaultDirectory.New(jsTracer, new(tracers.Context), nil, params.MergedTestChainConfig)
926926
if err != nil {
927927
t.Fatal(err)
928928
}

eth/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) {
197197
}
198198
)
199199
if config.VMTrace != "" {
200-
var traceConfig json.RawMessage
200+
traceConfig := json.RawMessage("{}")
201201
if config.VMTraceJsonConfig != "" {
202202
traceConfig = json.RawMessage(config.VMTraceJsonConfig)
203203
}

eth/tracers/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ func (api *API) traceTx(ctx context.Context, tx *types.Transaction, message *cor
10111011
Stop: logger.Stop,
10121012
}
10131013
} else {
1014-
tracer, err = DefaultDirectory.New(*config.Tracer, txctx, config.TracerConfig)
1014+
tracer, err = DefaultDirectory.New(*config.Tracer, txctx, config.TracerConfig, api.backend.ChainConfig())
10151015
if err != nil {
10161016
return nil, err
10171017
}

eth/tracers/dir.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/ethereum/go-ethereum/common"
2424
"github.com/ethereum/go-ethereum/core/tracing"
25+
"github.com/ethereum/go-ethereum/params"
2526
)
2627

2728
// Context contains some contextual infos for a transaction execution that is not
@@ -44,8 +45,8 @@ type Tracer struct {
4445
Stop func(err error)
4546
}
4647

47-
type ctorFn func(*Context, json.RawMessage) (*Tracer, error)
48-
type jsCtorFn func(string, *Context, json.RawMessage) (*Tracer, error)
48+
type ctorFn func(*Context, json.RawMessage, *params.ChainConfig) (*Tracer, error)
49+
type jsCtorFn func(string, *Context, json.RawMessage, *params.ChainConfig) (*Tracer, error)
4950

5051
type elem struct {
5152
ctor ctorFn
@@ -78,12 +79,15 @@ func (d *directory) RegisterJSEval(f jsCtorFn) {
7879
// New returns a new instance of a tracer, by iterating through the
7980
// registered lookups. Name is either name of an existing tracer
8081
// or an arbitrary JS code.
81-
func (d *directory) New(name string, ctx *Context, cfg json.RawMessage) (*Tracer, error) {
82+
func (d *directory) New(name string, ctx *Context, cfg json.RawMessage, chainConfig *params.ChainConfig) (*Tracer, error) {
83+
if len(cfg) == 0 {
84+
cfg = json.RawMessage("{}")
85+
}
8286
if elem, ok := d.elems[name]; ok {
83-
return elem.ctor(ctx, cfg)
87+
return elem.ctor(ctx, cfg, chainConfig)
8488
}
8589
// Assume JS code
86-
return d.jsEval(name, ctx, cfg)
90+
return d.jsEval(name, ctx, cfg, chainConfig)
8791
}
8892

8993
// IsJS will return true if the given tracer will evaluate

eth/tracers/internal/tracetest/calltrace_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func testCallTracer(tracerName string, dirPath string, t *testing.T) {
120120
)
121121
state.Close()
122122

123-
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig)
123+
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig, test.Genesis.Config)
124124
if err != nil {
125125
t.Fatalf("failed to create call tracer: %v", err)
126126
}
@@ -227,7 +227,7 @@ func benchTracer(tracerName string, test *callTracerTest, b *testing.B) {
227227
b.ReportAllocs()
228228
b.ResetTimer()
229229
for i := 0; i < b.N; i++ {
230-
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), nil)
230+
tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), nil, test.Genesis.Config)
231231
if err != nil {
232232
b.Fatalf("failed to create call tracer: %v", err)
233233
}
@@ -264,7 +264,7 @@ func TestInternals(t *testing.T) {
264264
}
265265
)
266266
mkTracer := func(name string, cfg json.RawMessage) *tracers.Tracer {
267-
tr, err := tracers.DefaultDirectory.New(name, nil, cfg)
267+
tr, err := tracers.DefaultDirectory.New(name, nil, cfg, config)
268268
if err != nil {
269269
t.Fatalf("failed to create call tracer: %v", err)
270270
}

0 commit comments

Comments
 (0)