mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
apply log wrapper chervin’s patch
This commit is contained in:
parent
843aa430ae
commit
ff52ea4c2c
1 changed files with 58 additions and 2 deletions
|
|
@ -99,12 +99,22 @@ func (s *StructLog) ErrorString() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type wrappedLog struct {
|
||||||
|
parent *wrappedLog
|
||||||
|
error error
|
||||||
|
log StructLog
|
||||||
|
children []*wrappedLog
|
||||||
|
}
|
||||||
|
|
||||||
// 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
|
||||||
// a track record of modified storage which is used in reporting snapshots of the
|
// a track record of modified storage which is used in reporting snapshots of the
|
||||||
// contract their storage.
|
// contract their storage.
|
||||||
type StructLogger struct {
|
type StructLogger struct {
|
||||||
|
current *wrappedLog
|
||||||
|
depth int
|
||||||
|
|
||||||
cfg Config
|
cfg Config
|
||||||
env *vm.EVM
|
env *vm.EVM
|
||||||
|
|
||||||
|
|
@ -136,12 +146,36 @@ func (l *StructLogger) Reset() {
|
||||||
// CaptureStart implements the EVMLogger interface to initialize the tracing operation.
|
// CaptureStart implements the EVMLogger interface to initialize the tracing operation.
|
||||||
func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
|
||||||
l.env = env
|
l.env = env
|
||||||
|
l.depth = 0
|
||||||
|
l.current = &wrappedLog{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CaptureState logs a new structured log message and pushes it out to the environment
|
// CaptureState logs a new structured log message and pushes it out to the environment
|
||||||
//
|
//
|
||||||
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
||||||
func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
||||||
|
for ; l.depth > depth-1; l.depth-- {
|
||||||
|
l.current = l.current.parent
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
l.current.error = err
|
||||||
|
}
|
||||||
|
switch op {
|
||||||
|
case vm.CALL, vm.DELEGATECALL, vm.STATICCALL, vm.CALLCODE:
|
||||||
|
l.depth = l.depth + 1
|
||||||
|
wl := &wrappedLog{
|
||||||
|
parent: l.current,
|
||||||
|
error: l.current.error,
|
||||||
|
}
|
||||||
|
l.current.children = append(l.current.children, wl)
|
||||||
|
l.current = wl
|
||||||
|
case vm.REVERT:
|
||||||
|
l.current.error = vm.ErrExecutionReverted
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
memory := scope.Memory
|
memory := scope.Memory
|
||||||
stack := scope.Stack
|
stack := scope.Stack
|
||||||
contract := scope.Contract
|
contract := scope.Contract
|
||||||
|
|
@ -198,7 +232,7 @@ func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, s
|
||||||
}
|
}
|
||||||
// create a new snapshot of the EVM.
|
// create a new snapshot of the EVM.
|
||||||
log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, l.env.StateDB.GetRefund(), err}
|
log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, l.env.StateDB.GetRefund(), err}
|
||||||
l.logs = append(l.logs, log)
|
l.current.log = log
|
||||||
}
|
}
|
||||||
|
|
||||||
// CaptureFault implements the EVMLogger interface to trace an execution fault
|
// CaptureFault implements the EVMLogger interface to trace an execution fault
|
||||||
|
|
@ -208,6 +242,17 @@ func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, s
|
||||||
|
|
||||||
// CaptureEnd is called after the call finishes to finalize the tracing.
|
// CaptureEnd is called after the call finishes to finalize the tracing.
|
||||||
func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {
|
func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {
|
||||||
|
for ; l.depth > 1; l.depth-- {
|
||||||
|
l.current = l.current.parent
|
||||||
|
}
|
||||||
|
l.current.log = StructLog{
|
||||||
|
Op: vm.CALL,
|
||||||
|
GasCost: gasUsed,
|
||||||
|
ReturnData: output,
|
||||||
|
Depth: 0,
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
|
||||||
l.output = output
|
l.output = output
|
||||||
l.err = err
|
l.err = err
|
||||||
if l.cfg.Debug {
|
if l.cfg.Debug {
|
||||||
|
|
@ -223,8 +268,19 @@ func (l *StructLogger) CaptureEnter(typ vm.OpCode, from common.Address, to commo
|
||||||
|
|
||||||
func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) {}
|
||||||
|
|
||||||
|
// Depth first append for all children (stack max depth is 1024)
|
||||||
|
func (l *wrappedLog) getLogs() []StructLog {
|
||||||
|
var logs []StructLog
|
||||||
|
l.log.Err = l.error
|
||||||
|
logs = append(logs, l.log)
|
||||||
|
for _, child := range l.children {
|
||||||
|
logs = append(logs, child.getLogs()...)
|
||||||
|
}
|
||||||
|
return logs
|
||||||
|
}
|
||||||
|
|
||||||
// StructLogs returns the captured log entries.
|
// StructLogs returns the captured log entries.
|
||||||
func (l *StructLogger) StructLogs() []StructLog { return l.logs }
|
func (l *StructLogger) StructLogs() []StructLog { return l.current.getLogs() }
|
||||||
|
|
||||||
// Error returns the VM error captured by the trace.
|
// Error returns the VM error captured by the trace.
|
||||||
func (l *StructLogger) Error() error { return l.err }
|
func (l *StructLogger) Error() error { return l.err }
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue