mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
eth/tracers: Add optional call frame enter print
This commit is contained in:
parent
e31709db65
commit
eaced5e80e
3 changed files with 127 additions and 0 deletions
72
eth/tracers/logger/gen_callframelog.go
Normal file
72
eth/tracers/logger/gen_callframelog.go
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
// Code generated by github.com/fjl/gencodec. DO NOT EDIT.
|
||||||
|
|
||||||
|
package logger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = (*callFrameLogMarshaling)(nil)
|
||||||
|
|
||||||
|
// MarshalJSON marshals as JSON.
|
||||||
|
func (c CallFrameLog) MarshalJSON() ([]byte, error) {
|
||||||
|
type CallFrameLog struct {
|
||||||
|
Op *vm.OpCode `json:"op,omitempty"`
|
||||||
|
From common.Address `json:"from"`
|
||||||
|
To common.Address `json:"to"`
|
||||||
|
Input hexutil.Bytes `json:"input,omitempty"`
|
||||||
|
Gas math.HexOrDecimal64 `json:"gas"`
|
||||||
|
Value *hexutil.Big `json:"value"`
|
||||||
|
OpName *string `json:"opName,omitempty"`
|
||||||
|
}
|
||||||
|
var enc CallFrameLog
|
||||||
|
enc.Op = c.Op
|
||||||
|
enc.From = c.From
|
||||||
|
enc.To = c.To
|
||||||
|
enc.Input = c.Input
|
||||||
|
enc.Gas = math.HexOrDecimal64(c.Gas)
|
||||||
|
enc.Value = (*hexutil.Big)(c.Value)
|
||||||
|
enc.OpName = c.OpName()
|
||||||
|
return json.Marshal(&enc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON unmarshals from JSON.
|
||||||
|
func (c *CallFrameLog) UnmarshalJSON(input []byte) error {
|
||||||
|
type CallFrameLog struct {
|
||||||
|
Op *vm.OpCode `json:"op,omitempty"`
|
||||||
|
From *common.Address `json:"from"`
|
||||||
|
To *common.Address `json:"to"`
|
||||||
|
Input *hexutil.Bytes `json:"input,omitempty"`
|
||||||
|
Gas *math.HexOrDecimal64 `json:"gas"`
|
||||||
|
Value *hexutil.Big `json:"value"`
|
||||||
|
}
|
||||||
|
var dec CallFrameLog
|
||||||
|
if err := json.Unmarshal(input, &dec); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if dec.Op != nil {
|
||||||
|
c.Op = dec.Op
|
||||||
|
}
|
||||||
|
if dec.From != nil {
|
||||||
|
c.From = *dec.From
|
||||||
|
}
|
||||||
|
if dec.To != nil {
|
||||||
|
c.To = *dec.To
|
||||||
|
}
|
||||||
|
if dec.Input != nil {
|
||||||
|
c.Input = *dec.Input
|
||||||
|
}
|
||||||
|
if dec.Gas != nil {
|
||||||
|
c.Gas = uint64(*dec.Gas)
|
||||||
|
}
|
||||||
|
if dec.Value != nil {
|
||||||
|
c.Value = (*big.Int)(dec.Value)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -52,6 +52,7 @@ type Config struct {
|
||||||
DisableStack bool // disable stack capture
|
DisableStack bool // disable stack capture
|
||||||
DisableStorage bool // disable storage capture
|
DisableStorage bool // disable storage capture
|
||||||
EnableReturnData bool // enable return data capture
|
EnableReturnData bool // enable return data capture
|
||||||
|
EnableCallFrame bool // enable call frame enter capture
|
||||||
Debug bool // print output during capture end
|
Debug bool // print output during capture end
|
||||||
Limit int // maximum length of output, but zero means unlimited
|
Limit int // maximum length of output, but zero means unlimited
|
||||||
// Chain overrides, can be used to execute a trace using future fork rules
|
// Chain overrides, can be used to execute a trace using future fork rules
|
||||||
|
|
@ -101,6 +102,35 @@ func (s *StructLog) ErrorString() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:generate go run github.com/fjl/gencodec -type CallFrameLog -field-override callFrameLogMarshaling -out gen_callframelog.go
|
||||||
|
|
||||||
|
// CallFrameLog is emitted every call frame entered.
|
||||||
|
type CallFrameLog struct {
|
||||||
|
Op *vm.OpCode `json:"op,omitempty"`
|
||||||
|
From common.Address `json:"from"`
|
||||||
|
To common.Address `json:"to"`
|
||||||
|
Input []byte `json:"input,omitempty"`
|
||||||
|
Gas uint64 `json:"gas"`
|
||||||
|
Value *big.Int `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// overrides for gencodec
|
||||||
|
type callFrameLogMarshaling struct {
|
||||||
|
Input hexutil.Bytes
|
||||||
|
Gas math.HexOrDecimal64
|
||||||
|
Value *hexutil.Big
|
||||||
|
OpName *string `json:"opName,omitempty"` // adds call to OpName() in MarshalJSON
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpName formats the operand name in a human-readable format.
|
||||||
|
func (c *CallFrameLog) OpName() *string {
|
||||||
|
if c.Op != nil {
|
||||||
|
op := c.Op.String()
|
||||||
|
return &op
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// StructLogger is an EVM state logger and implements EVMLogger.
|
// StructLogger is an EVM state logger and implements EVMLogger.
|
||||||
//
|
//
|
||||||
// StructLogger can capture state based on the given Log configuration and also keeps
|
// StructLogger can capture state based on the given Log configuration and also keeps
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,18 @@ func NewJSONLogger(cfg *Config, writer io.Writer) *JSONLogger {
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureStart(env *vm.EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
func (l *JSONLogger) CaptureStart(env *vm.EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
||||||
l.env = env
|
l.env = env
|
||||||
|
if l.cfg.EnableCallFrame {
|
||||||
|
log := CallFrameLog{
|
||||||
|
From: from,
|
||||||
|
To: to,
|
||||||
|
Gas: gas,
|
||||||
|
Value: value,
|
||||||
|
}
|
||||||
|
if l.cfg.EnableMemory {
|
||||||
|
log.Input = input
|
||||||
|
}
|
||||||
|
l.encoder.Encode(log)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureFault(pc uint64, op vm.OpCode, gas uint64, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
func (l *JSONLogger) CaptureFault(pc uint64, op vm.OpCode, gas uint64, cost uint64, scope *vm.ScopeContext, depth int, err error) {
|
||||||
|
|
@ -93,6 +105,19 @@ func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
||||||
|
if l.cfg.EnableCallFrame {
|
||||||
|
log := CallFrameLog{
|
||||||
|
Op: &typ,
|
||||||
|
From: from,
|
||||||
|
To: to,
|
||||||
|
Gas: gas,
|
||||||
|
Value: value,
|
||||||
|
}
|
||||||
|
if l.cfg.EnableMemory {
|
||||||
|
log.Input = input
|
||||||
|
}
|
||||||
|
l.encoder.Encode(log)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue