Skip to content
10 changes: 7 additions & 3 deletions cmd/evm/internal/t8ntool/execution.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package t8ntool

import (
"fmt"
"io"
"math/big"
"os"

Expand All @@ -32,6 +33,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"
Expand Down Expand Up @@ -98,7 +100,7 @@ type rejectedTx struct {
// Apply applies a set of transactions to a pre-state
func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
txs types.Transactions, miningReward int64,
getTracerFn func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error),
getTracerFn func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error),
) (*state.StateDB, *ExecutionResult, error) {
// Capture errors for BLOCKHASH operation, if we haven't been supplied the
// required blockhashes
Expand Down Expand Up @@ -155,11 +157,13 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()})
continue
}
tracer, err := getTracerFn(txIndex, tx.Hash())
tracer, _, err := getTracerFn(txIndex, tx.Hash())
if err != nil {
return nil, nil, err
}
vmConfig.Tracer = tracer
if tracer != nil {
vmConfig.Tracer = tracer.Hooks
}
vmConfig.Debug = (tracer != nil)
statedb.SetTxContext(tx.Hash(), txIndex)
txContext := core.NewEVMTxContext(msg)
Expand Down
36 changes: 17 additions & 19 deletions cmd/evm/internal/t8ntool/transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ import (
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"math/big"
"os"
"path"
"path/filepath"
"strings"

"github.com/ethereum/go-ethereum/eth/tracers"
"github.com/ethereum/go-ethereum/eth/tracers/logger"

"github.com/ethereum/go-ethereum/common"
Expand Down Expand Up @@ -91,10 +94,9 @@ func Transition(ctx *cli.Context) error {
log.Root().SetHandler(glogger)

var (
err error
tracer vm.EVMLogger
err error
)
var getTracer func(txIndex int, txHash common.Hash) (vm.EVMLogger, error)
var getTracer = func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error) { return nil, nil, nil }

baseDir, err := createBasedir(ctx)
if err != nil {
Expand Down Expand Up @@ -127,20 +129,19 @@ func Transition(ctx *cli.Context) error {
prevFile.Close()
}
}()
getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) {
if prevFile != nil {
prevFile.Close()
}
traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String())))
getTracer = func(txIndex int, txHash common.Hash) (*tracers.Tracer, io.WriteCloser, error) {
traceFile, err := os.Create(filepath.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 nil, nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err))
}
prevFile = traceFile
return logger.NewJSONLogger(logConfig, traceFile), nil
}
} else {
getTracer = func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error) {
return nil, nil
logger := logger.NewJSONLogger(logConfig, traceFile)
tracer := &tracers.Tracer{
Hooks: logger,
// jsonLogger streams out result to file.
GetResult: func() (json.RawMessage, error) { return nil, nil },
Stop: func(err error) {},
}
return tracer, traceFile, nil
}
}
// We need to load three things: alloc, env and transactions. May be either in
Expand Down Expand Up @@ -179,10 +180,7 @@ func Transition(ctx *cli.Context) error {
}
prestate.Env = *inputData.Env

vmConfig := vm.Config{
Tracer: tracer,
Debug: (tracer != nil),
}
vmConfig := vm.Config{}
// Construct the chainconfig
var chainConfig *params.ChainConfig
if cConf, extraEips, err := tests.GetChainConfig(ctx.String(ForknameFlag.Name)); err != nil {
Expand Down
5 changes: 3 additions & 2 deletions cmd/evm/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/tracing"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/core/vm/runtime"
Expand Down Expand Up @@ -122,7 +123,7 @@ func runCmd(ctx *cli.Context) error {
}

var (
tracer vm.EVMLogger
tracer *tracing.Hooks
debugLogger *logger.StructLogger
statedb *state.StateDB
chainConfig *params.ChainConfig
Expand All @@ -134,7 +135,7 @@ func runCmd(ctx *cli.Context) error {
tracer = logger.NewJSONLogger(logconfig, os.Stdout)
} else if ctx.Bool(DebugFlag.Name) {
debugLogger = logger.NewStructLogger(logconfig)
tracer = debugLogger
tracer = debugLogger.Hooks()
} else {
debugLogger = logger.NewStructLogger(logconfig)
}
Expand Down
5 changes: 3 additions & 2 deletions cmd/evm/staterunner.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/state/snapshot"
"github.com/ethereum/go-ethereum/core/tracing"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/tests"
Expand Down Expand Up @@ -68,7 +69,7 @@ func stateTestCmd(ctx *cli.Context) error {
EnableReturnData: !ctx.Bool(DisableReturnDataFlag.Name),
}
var (
tracer vm.EVMLogger
tracer *tracing.Hooks
debugger *logger.StructLogger
)
switch {
Expand All @@ -77,7 +78,7 @@ func stateTestCmd(ctx *cli.Context) error {

case ctx.Bool(DebugFlag.Name):
debugger = logger.NewStructLogger(config)
tracer = debugger
tracer = debugger.Hooks()

default:
debugger = logger.NewStructLogger(config)
Expand Down
2 changes: 1 addition & 1 deletion cmd/utils/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -2436,7 +2436,7 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai
if err != nil {
Fatalf("Failed to create tracer %q: %v", name, err)
}
vmcfg.LiveTracer = t
vmcfg.Tracer = t
}
}
// TODO(rjl493456442) disable snapshot generation/wiping if the chain is read only.
Expand Down
2 changes: 1 addition & 1 deletion core/blockchain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4125,7 +4125,7 @@ func testEIP3651(t *testing.T, scheme string) {

b.AddTx(tx)
})
chain, err := NewBlockChain(db, DefaultCacheConfigWithScheme(scheme), gspec, nil, engine, vm.Config{Tracer: logger.NewMarkdownLogger(&logger.Config{}, os.Stderr)}, nil, nil)
chain, err := NewBlockChain(db, DefaultCacheConfigWithScheme(scheme), gspec, nil, engine, vm.Config{Tracer: logger.NewMarkdownLogger(&logger.Config{}, os.Stderr).Hooks()}, nil, nil)
if err != nil {
t.Fatalf("failed to create tester chain: %v", err)
}
Expand Down
16 changes: 7 additions & 9 deletions core/state_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
return nil, nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err)
}
statedb.SetTxContext(tx.Hash(), i)
receipt, _, err := applyTransaction(msg, p.config, p.bc, nil, gp, statedb, blockNumber, blockHash, tx, usedGas, vmenv, bloomProcessors)
receipt, _, err := ApplyMessageWithEVM(msg, p.config, gp, statedb, blockNumber, blockHash, tx, usedGas, vmenv, bloomProcessors)
if err != nil {
return nil, nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err)
}
Expand All @@ -143,11 +143,9 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
return receipts, allLogs, *blockContext.InternalTransactions, *usedGas, nil
}

func applyTransaction(
func ApplyMessageWithEVM(
msg *Message,
config *params.ChainConfig,
bc ChainContext,
author *common.Address,
gp *GasPool,
statedb *state.StateDB,
blockNumber *big.Int,
Expand All @@ -156,11 +154,11 @@ func applyTransaction(
usedGas *uint64, evm *vm.EVM,
receiptProcessor ReceiptProcessor,
) (receipt *types.Receipt, result *ExecutionResult, err error) {
if evm.Config.LiveTracer != nil && evm.Config.LiveTracer.OnTxStart != nil {
evm.Config.LiveTracer.OnTxStart(evm.GetVMContext(), tx, msg.From)
if evm.Config.LiveTracer.OnTxEnd != nil {
if evm.Config.Tracer != nil && evm.Config.Tracer.OnTxStart != nil {
evm.Config.Tracer.OnTxStart(evm.GetVMContext(), tx, msg.Payer)
if evm.Config.Tracer.OnTxEnd != nil {
defer func() {
evm.Config.LiveTracer.OnTxEnd(receipt, err)
evm.Config.Tracer.OnTxEnd(receipt, err)
}()
}
}
Expand Down Expand Up @@ -252,5 +250,5 @@ func ApplyTransaction(
// Create a new context to be used in the EVM environment
blockContext := NewEVMBlockContext(header, bc, author, publishEvents...)
vmenv := vm.NewEVM(blockContext, vm.TxContext{}, statedb, config, cfg)
return applyTransaction(msg, config, bc, author, gp, statedb, header.Number, header.Hash(), tx, usedGas, vmenv, receiptProcessors)
return ApplyMessageWithEVM(msg, config, gp, statedb, header.Number, header.Hash(), tx, usedGas, vmenv, receiptProcessors)
}
26 changes: 7 additions & 19 deletions core/state_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,8 @@ func (st *StateTransition) buyGas() error {
return err
}

if st.evm.Config.LiveTracer != nil && st.evm.Config.LiveTracer.OnGasChange != nil {
st.evm.Config.LiveTracer.OnGasChange(0, st.msg.GasLimit, tracing.GasChangeTxInitialBalance)
if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil {
st.evm.Config.Tracer.OnGasChange(0, st.msg.GasLimit, tracing.GasChangeTxInitialBalance)
}
st.gas += msg.GasLimit

Expand Down Expand Up @@ -502,18 +502,6 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
return nil, err
}

if tracer := st.evm.Config.Tracer; tracer != nil {
var payer *common.Address
if st.msg.From != st.msg.Payer {
payerAddr := st.msg.Payer
payer = &payerAddr
}
tracer.CaptureTxStart(st.initialGas, payer)
defer func() {
tracer.CaptureTxEnd(st.gas)
}()
}

msg := st.msg
sender := vm.AccountRef(msg.From)
rules := st.evm.ChainConfig().Rules(st.evm.Context.BlockNumber)
Expand All @@ -528,7 +516,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
if st.gas < gas {
return nil, fmt.Errorf("%w: have %d, want %d", ErrIntrinsicGas, st.gas, gas)
}
if t := st.evm.Config.LiveTracer; t != nil && t.OnGasChange != nil {
if t := st.evm.Config.Tracer; t != nil && t.OnGasChange != nil {
t.OnGasChange(st.gas, st.gas-gas, tracing.GasChangeTxIntrinsicGas)
}
st.gas -= gas
Expand Down Expand Up @@ -609,17 +597,17 @@ func (st *StateTransition) refundGas(refundQuotient uint64) uint64 {
refund = st.state.GetRefund()
}

if st.evm.Config.LiveTracer != nil && st.evm.Config.LiveTracer.OnGasChange != nil && refund > 0 {
st.evm.Config.LiveTracer.OnGasChange(st.gas, st.gas+refund, tracing.GasChangeTxRefunds)
if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil && refund > 0 {
st.evm.Config.Tracer.OnGasChange(st.gas, st.gas+refund, tracing.GasChangeTxRefunds)
}
st.gas += refund

// Return ETH for remaining gas, exchanged at the original rate.
remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gas), st.gasPrice)
st.state.AddBalance(st.msg.Payer, remaining, tracing.BalanceIncreaseGasReturn)

if st.evm.Config.LiveTracer != nil && st.evm.Config.LiveTracer.OnGasChange != nil && st.gas > 0 {
st.evm.Config.LiveTracer.OnGasChange(st.gas, 0, tracing.GasChangeTxLeftOverReturned)
if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil && st.gas > 0 {
st.evm.Config.Tracer.OnGasChange(st.gas, 0, tracing.GasChangeTxLeftOverReturned)
}

// Also return remaining gas to the block gas counter so it is
Expand Down
2 changes: 1 addition & 1 deletion core/tracing/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ type (
// Take note that EnterHook, when in the context of a live tracer, can be invoked
// outside of the `OnTxStart` and `OnTxEnd` hooks when dealing with system calls,
// see [OnSystemCallStartHook] and [OnSystemCallEndHook] for more information.
EnterHook = func(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int)
EnterHook = func(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int, order uint64)

// ExitHook is invoked when the processing of a message ends.
// `revert` is true when there was an error during the execution.
Expand Down
Loading