From 2a8b1a8b1af8f9c6cb77d2ea24bd1553d6ac3a36 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 03:02:52 +0000 Subject: [PATCH 01/18] eth/tracers: JSONLogger implement tracers.Tracer Signed-off-by: jsvisa --- eth/tracers/logger/logger_json.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eth/tracers/logger/logger_json.go b/eth/tracers/logger/logger_json.go index a2cb4cd9fc59..2f13308a79c4 100644 --- a/eth/tracers/logger/logger_json.go +++ b/eth/tracers/logger/logger_json.go @@ -100,3 +100,7 @@ func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} func (l *JSONLogger) CaptureTxStart(gasLimit uint64) {} func (l *JSONLogger) CaptureTxEnd(restGas uint64) {} + +func (l *JSONLogger) GetResult() (json.RawMessage, error) { return nil, nil } + +func (l *JSONLogger) Stop(err error) {} From 467f056483cd1a2c6fd36add0f02b2ba43b4ad0a Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 03:03:17 +0000 Subject: [PATCH 02/18] cmd/evm: use tracers.Trace instead of vm.EVMLogger Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/execution.go | 3 ++- cmd/evm/internal/t8ntool/transition.go | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 5cac5f07f886..40b0fa638f8a 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -117,7 +118,7 @@ type rejectedTx struct { // Apply applies a set of transactions to a pre-state func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, txIt txIterator, miningReward int64, - getTracerFn func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error)) (*state.StateDB, *ExecutionResult, []byte, error) { + getTracerFn func(txIndex int, txHash common.Hash) (tracer tracers.Tracer, err error)) (*state.StateDB, *ExecutionResult, []byte, error) { // Capture errors for BLOCKHASH operation, if we haven't been supplied the // required blockhashes var hashError error diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index d517592e5cfb..5bca170a1fec 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -89,7 +90,7 @@ func Transition(ctx *cli.Context) error { err error tracer vm.EVMLogger ) - var getTracer func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) + var getTracer func(txIndex int, txHash common.Hash) (tracers.Tracer, error) baseDir, err := createBasedir(ctx) if err != nil { @@ -122,7 +123,7 @@ func Transition(ctx *cli.Context) error { prevFile.Close() } }() - getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { + getTracer = func(txIndex int, txHash common.Hash) (tracers.Tracer, error) { if prevFile != nil { prevFile.Close() } @@ -134,7 +135,7 @@ func Transition(ctx *cli.Context) error { return logger.NewJSONLogger(logConfig, traceFile), nil } } else { - getTracer = func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error) { + getTracer = func(txIndex int, txHash common.Hash) (tracer tracers.Tracer, err error) { return nil, nil } } From 4c332a793547024be693adc4c92f60bf9c3dd068 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 04:21:37 +0000 Subject: [PATCH 03/18] cmd/evm: add --trace.tracer Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/execution.go | 6 +- cmd/evm/internal/t8ntool/flags.go | 4 + cmd/evm/internal/t8ntool/transition.go | 110 +++++++++++++++++-------- cmd/evm/main.go | 5 ++ 4 files changed, 88 insertions(+), 37 deletions(-) diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 40b0fa638f8a..41c2913a475d 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -118,7 +117,7 @@ type rejectedTx struct { // Apply applies a set of transactions to a pre-state func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, txIt txIterator, miningReward int64, - getTracerFn func(txIndex int, txHash common.Hash) (tracer tracers.Tracer, err error)) (*state.StateDB, *ExecutionResult, []byte, error) { + getTracerFn func(txIndex int, txHash common.Hash) (*traceWriter, error)) (*state.StateDB, *ExecutionResult, []byte, error) { // Capture errors for BLOCKHASH operation, if we haven't been supplied the // required blockhashes var hashError error @@ -249,6 +248,9 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, return nil, nil, nil, NewError(ErrorMissingBlockhash, hashError) } gasUsed += msgResult.UsedGas + if err := tracer.Write(); err != nil { + return nil, nil, nil, err + } // Receipt: { diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index de19dbc851ef..4e6428bbefcc 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -30,6 +30,10 @@ var ( Name: "trace", Usage: "Output full trace logs to files .jsonl", } + TraceTracerFlag = &cli.StringFlag{ + Name: "trace.tracer", + Usage: "Tracer name", + } TraceDisableMemoryFlag = &cli.BoolFlag{ Name: "trace.nomemory", Value: true, diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 5bca170a1fec..90136879434b 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -80,6 +80,33 @@ type input struct { TxRlp string `json:"txsRlp,omitempty"` } +type traceWriter struct { + tracers.Tracer + filename string +} + +func (t *traceWriter) Write() error { + if len(t.filename) == 0 { + return nil + } + file, err := os.Create(t.filename) + if err != nil { + return NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) + } + defer file.Close() + + result, err := t.GetResult() + if err != nil { + return err + } + if result == nil { + return nil + } + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + return encoder.Encode(result) +} + func Transition(ctx *cli.Context) error { // Configure the go-ethereum logger glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) @@ -90,52 +117,65 @@ func Transition(ctx *cli.Context) error { err error tracer vm.EVMLogger ) - var getTracer func(txIndex int, txHash common.Hash) (tracers.Tracer, error) + var getTracer func(txIndex int, txHash common.Hash) (*traceWriter, error) baseDir, err := createBasedir(ctx) if err != nil { return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) } if ctx.Bool(TraceFlag.Name) { - if ctx.IsSet(TraceDisableMemoryFlag.Name) && ctx.IsSet(TraceEnableMemoryFlag.Name) { - return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) - } - if ctx.IsSet(TraceDisableReturnDataFlag.Name) && ctx.IsSet(TraceEnableReturnDataFlag.Name) { - return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) - } - if ctx.IsSet(TraceDisableMemoryFlag.Name) { - log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) - } - if ctx.IsSet(TraceDisableReturnDataFlag.Name) { - log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) - } - // Configure the EVM logger - logConfig := &logger.Config{ - DisableStack: ctx.Bool(TraceDisableStackFlag.Name), - EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name) || ctx.Bool(TraceEnableMemoryFlag.Name), - EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name) || ctx.Bool(TraceEnableReturnDataFlag.Name), - Debug: true, - } - var prevFile *os.File - // This one closes the last file - defer func() { - if prevFile != nil { - prevFile.Close() + if ctx.IsSet(TraceTracerFlag.Name) { + config := &tracers.TraceConfig{} + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config.TracerConfig) + if err != nil { + return NewError(ErrorConfig, fmt.Errorf("%w unknown value of --%s", err, TraceTracerFlag)) } - }() - getTracer = func(txIndex int, txHash common.Hash) (tracers.Tracer, error) { - if prevFile != nil { - prevFile.Close() + + getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { + traceFile := path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String())) + return &traceWriter{tracer, traceFile}, nil } - traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) - if err != nil { - return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) + } else { + if ctx.IsSet(TraceDisableMemoryFlag.Name) && ctx.IsSet(TraceEnableMemoryFlag.Name) { + return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) + } + if ctx.IsSet(TraceDisableReturnDataFlag.Name) && ctx.IsSet(TraceEnableReturnDataFlag.Name) { + return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) + } + if ctx.IsSet(TraceDisableMemoryFlag.Name) { + log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) + } + if ctx.IsSet(TraceDisableReturnDataFlag.Name) { + log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) + } + // Configure the EVM logger + logConfig := &logger.Config{ + DisableStack: ctx.Bool(TraceDisableStackFlag.Name), + EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name) || ctx.Bool(TraceEnableMemoryFlag.Name), + EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name) || ctx.Bool(TraceEnableReturnDataFlag.Name), + Debug: true, + } + var prevFile *os.File + // This one closes the last file + defer func() { + if prevFile != nil { + prevFile.Close() + } + }() + getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { + if prevFile != nil { + prevFile.Close() + } + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) + if err != nil { + return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) + } + prevFile = traceFile + return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), ""}, nil } - prevFile = traceFile - return logger.NewJSONLogger(logConfig, traceFile), nil } } else { - getTracer = func(txIndex int, txHash common.Hash) (tracer tracers.Tracer, err error) { + getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { return nil, nil } } diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 1f6500b78c6c..8a1c88699017 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -26,6 +26,10 @@ import ( "github.com/ethereum/go-ethereum/internal/debug" "github.com/ethereum/go-ethereum/internal/flags" "github.com/urfave/cli/v2" + + // Force-load the tracer engines to trigger registration + _ "github.com/ethereum/go-ethereum/eth/tracers/js" + _ "github.com/ethereum/go-ethereum/eth/tracers/native" ) var ( @@ -143,6 +147,7 @@ var stateTransitionCommand = &cli.Command{ Action: t8ntool.Transition, Flags: []cli.Flag{ t8ntool.TraceFlag, + t8ntool.TraceTracerFlag, t8ntool.TraceDisableMemoryFlag, t8ntool.TraceEnableMemoryFlag, t8ntool.TraceDisableStackFlag, From 5044f9571df6f956f3ab1ccfd8a69b058115d43c Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 04:34:15 +0000 Subject: [PATCH 04/18] cmd/evm: add --trace.tracer.config Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/flags.go | 4 ++++ cmd/evm/internal/t8ntool/transition.go | 9 ++++++--- cmd/evm/main.go | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 4e6428bbefcc..c30624ee228b 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -34,6 +34,10 @@ var ( Name: "trace.tracer", Usage: "Tracer name", } + TraceTracerConfigFlag = &cli.StringFlag{ + Name: "trace.tracer.config", + Usage: "The config of trace.tracer, in JSON encoded format", + } TraceDisableMemoryFlag = &cli.BoolFlag{ Name: "trace.nomemory", Value: true, diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 90136879434b..4c995bd9731a 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -125,10 +125,13 @@ func Transition(ctx *cli.Context) error { } if ctx.Bool(TraceFlag.Name) { if ctx.IsSet(TraceTracerFlag.Name) { - config := &tracers.TraceConfig{} - tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config.TracerConfig) + var config json.RawMessage + if ctx.IsSet(TraceTracerConfigFlag.Name) { + config = []byte(ctx.String(TraceTracerConfigFlag.Name)) + } + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) if err != nil { - return NewError(ErrorConfig, fmt.Errorf("%w unknown value of --%s", err, TraceTracerFlag)) + return NewError(ErrorConfig, fmt.Errorf("can't instantiate a trace instance: %w", err)) } getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 8a1c88699017..f82b2d1e446e 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -148,6 +148,7 @@ var stateTransitionCommand = &cli.Command{ Flags: []cli.Flag{ t8ntool.TraceFlag, t8ntool.TraceTracerFlag, + t8ntool.TraceTracerConfigFlag, t8ntool.TraceDisableMemoryFlag, t8ntool.TraceEnableMemoryFlag, t8ntool.TraceDisableStackFlag, From aea5fe0ebb0471eb162e2520c42bc2daceb57140 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 04:55:18 +0000 Subject: [PATCH 05/18] cmd/evm/internal: simple Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/transition.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 4c995bd9731a..70183166457c 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -113,10 +113,6 @@ func Transition(ctx *cli.Context) error { glogger.Verbosity(log.Lvl(ctx.Int(VerbosityFlag.Name))) log.Root().SetHandler(glogger) - var ( - err error - tracer vm.EVMLogger - ) var getTracer func(txIndex int, txHash common.Hash) (*traceWriter, error) baseDir, err := createBasedir(ctx) @@ -218,9 +214,7 @@ func Transition(ctx *cli.Context) error { } prestate.Env = *inputData.Env - vmConfig := vm.Config{ - Tracer: tracer, - } + vmConfig := vm.Config{} // Construct the chainconfig var chainConfig *params.ChainConfig if cConf, extraEips, err := tests.GetChainConfig(ctx.String(ForknameFlag.Name)); err != nil { From 17455a1c847d657438b185b0aa58203566ee7fe2 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 08:58:15 +0000 Subject: [PATCH 06/18] cmd/evm/internal: check nil Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/execution.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 41c2913a475d..be737c0da751 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -224,7 +224,9 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, if err != nil { return nil, nil, nil, err } - vmConfig.Tracer = tracer + if tracer != nil { + vmConfig.Tracer = tracer + } statedb.SetTxContext(tx.Hash(), txIndex) var ( @@ -248,8 +250,10 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, return nil, nil, nil, NewError(ErrorMissingBlockhash, hashError) } gasUsed += msgResult.UsedGas - if err := tracer.Write(); err != nil { - return nil, nil, nil, err + if tracer != nil { + if err := tracer.Write(); err != nil { + return nil, nil, nil, err + } } // Receipt: From dce2e9b6bbb83dc496cf8c055259030a6ca1f70b Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 09:19:56 +0000 Subject: [PATCH 07/18] cmd/evm/internal: trace.tracer usage Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/flags.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index c30624ee228b..ce82eb234de8 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -32,11 +32,11 @@ var ( } TraceTracerFlag = &cli.StringFlag{ Name: "trace.tracer", - Usage: "Tracer name", + Usage: "The type of tracer. It could be callTracer or prestateTracer", } TraceTracerConfigFlag = &cli.StringFlag{ Name: "trace.tracer.config", - Usage: "The config of trace.tracer, in JSON encoded format", + Usage: "The configurations of --trace.tracer, in JSON encoded format", } TraceDisableMemoryFlag = &cli.BoolFlag{ Name: "trace.nomemory", From 37f9e5216e96c012047b2f423d32a593ffd3047b Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 20 Nov 2023 09:27:17 +0000 Subject: [PATCH 08/18] cmd/evm/t8n: simple Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/transition.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 70183166457c..f8d07375241d 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -113,12 +113,12 @@ func Transition(ctx *cli.Context) error { glogger.Verbosity(log.Lvl(ctx.Int(VerbosityFlag.Name))) log.Root().SetHandler(glogger) - var getTracer func(txIndex int, txHash common.Hash) (*traceWriter, error) - baseDir, err := createBasedir(ctx) if err != nil { return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) } + + getTracer := func(txIndex int, txHash common.Hash) (*traceWriter, error) { return nil, nil } if ctx.Bool(TraceFlag.Name) { if ctx.IsSet(TraceTracerFlag.Name) { var config json.RawMessage @@ -173,10 +173,6 @@ func Transition(ctx *cli.Context) error { return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), ""}, nil } } - } else { - getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { - return nil, nil - } } // We need to load three things: alloc, env and transactions. May be either in // stdin input or in files. From 583fb9bff8fa0fe61a38ca3e9511a71c4e1c1d75 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Thu, 23 Nov 2023 10:25:06 +0100 Subject: [PATCH 09/18] cmd/evm: remove deprecated flags, refactor tracewriter --- cmd/evm/internal/t8ntool/execution.go | 11 +--- cmd/evm/internal/t8ntool/flags.go | 10 --- cmd/evm/internal/t8ntool/tracewriter.go | 81 +++++++++++++++++++++++++ cmd/evm/internal/t8ntool/transition.go | 77 +++++------------------ cmd/evm/main.go | 2 - 5 files changed, 98 insertions(+), 83 deletions(-) create mode 100644 cmd/evm/internal/t8ntool/tracewriter.go diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index be737c0da751..a4ffd09e4fef 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -117,7 +117,7 @@ type rejectedTx struct { // Apply applies a set of transactions to a pre-state func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, txIt txIterator, miningReward int64, - getTracerFn func(txIndex int, txHash common.Hash) (*traceWriter, error)) (*state.StateDB, *ExecutionResult, []byte, error) { + getTracerFn func(txIndex int, txHash common.Hash) (vm.EVMLogger, error)) (*state.StateDB, *ExecutionResult, []byte, error) { // Capture errors for BLOCKHASH operation, if we haven't been supplied the // required blockhashes var hashError error @@ -224,9 +224,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, if err != nil { return nil, nil, nil, err } - if tracer != nil { - vmConfig.Tracer = tracer - } + vmConfig.Tracer = tracer statedb.SetTxContext(tx.Hash(), txIndex) var ( @@ -250,11 +248,6 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, return nil, nil, nil, NewError(ErrorMissingBlockhash, hashError) } gasUsed += msgResult.UsedGas - if tracer != nil { - if err := tracer.Write(); err != nil { - return nil, nil, nil, err - } - } // Receipt: { diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index ce82eb234de8..6a8c39159fe6 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -38,11 +38,6 @@ var ( Name: "trace.tracer.config", Usage: "The configurations of --trace.tracer, in JSON encoded format", } - TraceDisableMemoryFlag = &cli.BoolFlag{ - Name: "trace.nomemory", - Value: true, - Usage: "Disable full memory dump in traces (deprecated)", - } TraceEnableMemoryFlag = &cli.BoolFlag{ Name: "trace.memory", Usage: "Enable full memory dump in traces", @@ -51,11 +46,6 @@ var ( Name: "trace.nostack", Usage: "Disable stack output in traces", } - TraceDisableReturnDataFlag = &cli.BoolFlag{ - Name: "trace.noreturndata", - Value: true, - Usage: "Disable return data output in traces (deprecated)", - } TraceEnableReturnDataFlag = &cli.BoolFlag{ Name: "trace.returndata", Usage: "Enable return data output in traces", diff --git a/cmd/evm/internal/t8ntool/tracewriter.go b/cmd/evm/internal/t8ntool/tracewriter.go new file mode 100644 index 000000000000..e4efad112f74 --- /dev/null +++ b/cmd/evm/internal/t8ntool/tracewriter.go @@ -0,0 +1,81 @@ +// Copyright 2020 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package t8ntool + +import ( + "encoding/json" + "io" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" + "github.com/ethereum/go-ethereum/log" +) + +// traceWriter is an vm.EVMLogger which also holds an inner logger/tracer. +// When the TxEnd event happens, the inner tracer result is written to the file, and +// the file is closed. +type traceWriter struct { + inner vm.EVMLogger + f io.WriteCloser +} + +// Compile-time interface check +var _ = vm.EVMLogger((*traceWriter)(nil)) + +func (t *traceWriter) CaptureTxEnd(restGas uint64) { + t.inner.CaptureTxEnd(restGas) + defer t.f.Close() + + if tracer, ok := t.inner.(tracers.Tracer); ok { + result, err := tracer.GetResult() + if err != nil { + log.Warn("Error in tracer", "err", err) + return + } + err = json.NewEncoder(t.f).Encode(result) + if err != nil { + log.Warn("Error writing tracer output", "err", err) + return + } + } +} + +func (t *traceWriter) CaptureTxStart(gasLimit uint64) { t.inner.CaptureTxStart(gasLimit) } +func (t *traceWriter) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.inner.CaptureStart(env, from, to, create, input, gas, value) +} + +func (t *traceWriter) CaptureEnd(output []byte, gasUsed uint64, err error) { + t.inner.CaptureEnd(output, gasUsed, err) +} + +func (t *traceWriter) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + t.inner.CaptureEnter(typ, from, to, input, gas, value) +} + +func (t *traceWriter) CaptureExit(output []byte, gasUsed uint64, err error) { + t.inner.CaptureExit(output, gasUsed, err) +} + +func (t *traceWriter) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + t.inner.CaptureState(pc, op, gas, cost, scope, rData, depth, err) +} +func (t *traceWriter) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + t.inner.CaptureFault(pc, op, gas, cost, scope, depth, err) +} diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index f8d07375241d..819c7eca86d2 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -80,97 +80,50 @@ type input struct { TxRlp string `json:"txsRlp,omitempty"` } -type traceWriter struct { - tracers.Tracer - filename string -} - -func (t *traceWriter) Write() error { - if len(t.filename) == 0 { - return nil - } - file, err := os.Create(t.filename) - if err != nil { - return NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) - } - defer file.Close() - - result, err := t.GetResult() - if err != nil { - return err - } - if result == nil { - return nil - } - encoder := json.NewEncoder(file) - encoder.SetIndent("", " ") - return encoder.Encode(result) -} - func Transition(ctx *cli.Context) error { // Configure the go-ethereum logger glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) glogger.Verbosity(log.Lvl(ctx.Int(VerbosityFlag.Name))) log.Root().SetHandler(glogger) + var getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { return nil, nil } + baseDir, err := createBasedir(ctx) if err != nil { return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) } - getTracer := func(txIndex int, txHash common.Hash) (*traceWriter, error) { return nil, nil } if ctx.Bool(TraceFlag.Name) { if ctx.IsSet(TraceTracerFlag.Name) { var config json.RawMessage if ctx.IsSet(TraceTracerConfigFlag.Name) { config = []byte(ctx.String(TraceTracerConfigFlag.Name)) } - tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) - if err != nil { - return NewError(ErrorConfig, fmt.Errorf("can't instantiate a trace instance: %w", err)) - } - - getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { - traceFile := path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String())) + getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) + if err != nil { + return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) + } + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) + if err != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) + } return &traceWriter{tracer, traceFile}, nil } } else { - if ctx.IsSet(TraceDisableMemoryFlag.Name) && ctx.IsSet(TraceEnableMemoryFlag.Name) { - return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) - } - if ctx.IsSet(TraceDisableReturnDataFlag.Name) && ctx.IsSet(TraceEnableReturnDataFlag.Name) { - return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) - } - if ctx.IsSet(TraceDisableMemoryFlag.Name) { - log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) - } - if ctx.IsSet(TraceDisableReturnDataFlag.Name) { - log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) - } // Configure the EVM logger logConfig := &logger.Config{ DisableStack: ctx.Bool(TraceDisableStackFlag.Name), - EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name) || ctx.Bool(TraceEnableMemoryFlag.Name), - EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name) || ctx.Bool(TraceEnableReturnDataFlag.Name), + EnableMemory: ctx.Bool(TraceEnableMemoryFlag.Name), + EnableReturnData: ctx.Bool(TraceEnableReturnDataFlag.Name), Debug: true, } - var prevFile *os.File - // This one closes the last file - defer func() { - if prevFile != nil { - prevFile.Close() - } - }() - getTracer = func(txIndex int, txHash common.Hash) (*traceWriter, error) { - if prevFile != nil { - prevFile.Close() - } + getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) if err != nil { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } - prevFile = traceFile - return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), ""}, nil + return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), traceFile}, nil } } } diff --git a/cmd/evm/main.go b/cmd/evm/main.go index f82b2d1e446e..26127431a591 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -149,10 +149,8 @@ var stateTransitionCommand = &cli.Command{ t8ntool.TraceFlag, t8ntool.TraceTracerFlag, t8ntool.TraceTracerConfigFlag, - t8ntool.TraceDisableMemoryFlag, t8ntool.TraceEnableMemoryFlag, t8ntool.TraceDisableStackFlag, - t8ntool.TraceDisableReturnDataFlag, t8ntool.TraceEnableReturnDataFlag, t8ntool.OutputBasedir, t8ntool.OutputAllocFlag, From 6be89693839782b46b2e82f1d624bde5dbfc5a68 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Thu, 23 Nov 2023 10:27:56 +0100 Subject: [PATCH 10/18] eth/tracers/logger: revert json-logger change --- eth/tracers/logger/logger_json.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/eth/tracers/logger/logger_json.go b/eth/tracers/logger/logger_json.go index 2f13308a79c4..a2cb4cd9fc59 100644 --- a/eth/tracers/logger/logger_json.go +++ b/eth/tracers/logger/logger_json.go @@ -100,7 +100,3 @@ func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} func (l *JSONLogger) CaptureTxStart(gasLimit uint64) {} func (l *JSONLogger) CaptureTxEnd(restGas uint64) {} - -func (l *JSONLogger) GetResult() (json.RawMessage, error) { return nil, nil } - -func (l *JSONLogger) Stop(err error) {} From 931c8141f8b4d4ea3cbf647a214e6a1607ae7fb4 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 14:04:32 +0800 Subject: [PATCH 11/18] cm/evm: initialize tracer before getTracer Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/transition.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 819c7eca86d2..4af201abe338 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -99,15 +99,15 @@ func Transition(ctx *cli.Context) error { if ctx.IsSet(TraceTracerConfigFlag.Name) { config = []byte(ctx.String(TraceTracerConfigFlag.Name)) } + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) + if err != nil { + return NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) + } getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) if err != nil { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } - tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) - if err != nil { - return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) - } return &traceWriter{tracer, traceFile}, nil } } else { From 2d1f7eb19e1e312cdce968be14c7115af93a553b Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 14:04:56 +0800 Subject: [PATCH 12/18] json -> jsonl Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/transition.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 4af201abe338..8c677f56b280 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -104,7 +104,7 @@ func Transition(ctx *cli.Context) error { return NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) } getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { - traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) if err != nil { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } From 7c406dbce58f2567402a4cb8b0ebc9c59340142f Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 14:13:22 +0800 Subject: [PATCH 13/18] cmd/evm: flag description Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/flags.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 6a8c39159fe6..52b641bce503 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -28,14 +28,14 @@ import ( var ( TraceFlag = &cli.BoolFlag{ Name: "trace", - Usage: "Output full trace logs to files .jsonl", + Usage: "Output full trace logs to files trace--.jsonl", } TraceTracerFlag = &cli.StringFlag{ Name: "trace.tracer", - Usage: "The type of tracer. It could be callTracer or prestateTracer", + Usage: "The type of tracer. It could be native or js tracers, eg: callTracer,4byteTracer", } TraceTracerConfigFlag = &cli.StringFlag{ - Name: "trace.tracer.config", + Name: "trace.jsonconfig", Usage: "The configurations of --trace.tracer, in JSON encoded format", } TraceEnableMemoryFlag = &cli.BoolFlag{ From a290bab86c3925b14480acba54eace4bcf43b033 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 14:15:10 +0800 Subject: [PATCH 14/18] cmd/evm: file Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 52b641bce503..72d255bcd301 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -28,7 +28,7 @@ import ( var ( TraceFlag = &cli.BoolFlag{ Name: "trace", - Usage: "Output full trace logs to files trace--.jsonl", + Usage: "Output full trace logs to a file named: trace--.jsonl", } TraceTracerFlag = &cli.StringFlag{ Name: "trace.tracer", From 3adc0c46eb181f2e33a952472830de0a859681eb Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 15:15:00 +0800 Subject: [PATCH 15/18] cmd/evm: keep json Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/flags.go | 2 +- cmd/evm/internal/t8ntool/transition.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 72d255bcd301..7465011a04d2 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -28,7 +28,7 @@ import ( var ( TraceFlag = &cli.BoolFlag{ Name: "trace", - Usage: "Output full trace logs to a file named: trace--.jsonl", + Usage: "Output full trace logs to a file named: trace--.json or trace--.jsonl", } TraceTracerFlag = &cli.StringFlag{ Name: "trace.tracer", diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 8c677f56b280..4af201abe338 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -104,7 +104,7 @@ func Transition(ctx *cli.Context) error { return NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) } getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { - traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) if err != nil { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } From 2133961a841ea297ce0a271d0ac18076c397bfcd Mon Sep 17 00:00:00 2001 From: jsvisa Date: Fri, 15 Dec 2023 15:17:26 +0800 Subject: [PATCH 16/18] Revert "cm/evm: initialize tracer before getTracer" This reverts commit 931c8141f8b4d4ea3cbf647a214e6a1607ae7fb4. Signed-off-by: jsvisa --- cmd/evm/internal/t8ntool/transition.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 4af201abe338..819c7eca86d2 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -99,15 +99,15 @@ func Transition(ctx *cli.Context) error { if ctx.IsSet(TraceTracerConfigFlag.Name) { config = []byte(ctx.String(TraceTracerConfigFlag.Name)) } - tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) - if err != nil { - return NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) - } getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) if err != nil { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) + if err != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) + } return &traceWriter{tracer, traceFile}, nil } } else { From dc790099255fbeead2f3e006ab2a264d2f7b5d66 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 18 Dec 2023 10:44:42 +0100 Subject: [PATCH 17/18] cmd/evm: polishes re tracer flags --- cmd/evm/internal/t8ntool/flags.go | 6 +-- cmd/evm/internal/t8ntool/transition.go | 57 +++++++++++++------------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 7465011a04d2..c2eca8cc217d 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -28,15 +28,15 @@ import ( var ( TraceFlag = &cli.BoolFlag{ Name: "trace", - Usage: "Output full trace logs to a file named: trace--.json or trace--.jsonl", + Usage: "Configures the use of the JSON opcode tracer. This tracer emits traces to files as trace--.jsonl", } TraceTracerFlag = &cli.StringFlag{ Name: "trace.tracer", - Usage: "The type of tracer. It could be native or js tracers, eg: callTracer,4byteTracer", + Usage: "Configures the use of a custom tracer, e.g native or js tracers. Examples are callTracer and 4byteTracer. These tracers emit results into files as trace--.json", } TraceTracerConfigFlag = &cli.StringFlag{ Name: "trace.jsonconfig", - Usage: "The configurations of --trace.tracer, in JSON encoded format", + Usage: "The configurations for the custom tracer specified by --trace.tracer. If provided, must be in JSON format", } TraceEnableMemoryFlag = &cli.BoolFlag{ Name: "trace.memory", diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 819c7eca86d2..65ac231a06c7 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -93,39 +93,38 @@ func Transition(ctx *cli.Context) error { return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) } - if ctx.Bool(TraceFlag.Name) { - if ctx.IsSet(TraceTracerFlag.Name) { - var config json.RawMessage - if ctx.IsSet(TraceTracerConfigFlag.Name) { - config = []byte(ctx.String(TraceTracerConfigFlag.Name)) - } - getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { - traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) - if err != nil { - return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) - } - tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) - if err != nil { - return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) - } - return &traceWriter{tracer, traceFile}, nil + if ctx.Bool(TraceFlag.Name) { // JSON opcode tracing + // Configure the EVM logger + logConfig := &logger.Config{ + DisableStack: ctx.Bool(TraceDisableStackFlag.Name), + EnableMemory: ctx.Bool(TraceEnableMemoryFlag.Name), + EnableReturnData: ctx.Bool(TraceEnableReturnDataFlag.Name), + Debug: true, + } + getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) + if err != nil { + return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } - } else { - // Configure the EVM logger - logConfig := &logger.Config{ - DisableStack: ctx.Bool(TraceDisableStackFlag.Name), - EnableMemory: ctx.Bool(TraceEnableMemoryFlag.Name), - EnableReturnData: ctx.Bool(TraceEnableReturnDataFlag.Name), - Debug: true, + return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), traceFile}, nil + } + } else if ctx.IsSet(TraceTracerFlag.Name) { + var config json.RawMessage + if ctx.IsSet(TraceTracerConfigFlag.Name) { + config = []byte(ctx.String(TraceTracerConfigFlag.Name)) + } + getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { + traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String()))) + if err != nil { + return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } - getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { - traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String()))) - if err != nil { - return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) - } - return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), traceFile}, nil + tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config) + if err != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err)) } + return &traceWriter{tracer, traceFile}, nil } + } // We need to load three things: alloc, env and transactions. May be either in // stdin input or in files. From a9cbeb7dd5612a31fd9faa14c08f353e1edb3b49 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 18 Dec 2023 13:25:38 +0100 Subject: [PATCH 18/18] cmd/evm/internal: lint nits --- cmd/evm/internal/t8ntool/transition.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 65ac231a06c7..ff0d48483ce1 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -124,7 +124,6 @@ func Transition(ctx *cli.Context) error { } return &traceWriter{tracer, traceFile}, nil } - } // We need to load three things: alloc, env and transactions. May be either in // stdin input or in files.