@ -42,6 +42,7 @@ type LogConfig struct {
DisableStack bool // disable stack capture
DisableStack bool // disable stack capture
DisableStorage bool // disable storage capture
DisableStorage bool // disable storage capture
FullStorage bool // show full storage (slow)
FullStorage bool // show full storage (slow)
Limit int // maximum length of output, but zero means unlimited
}
}
// StructLog is emitted to the Environment each cycle and lists information about the current internal state
// StructLog is emitted to the Environment each cycle and lists information about the current internal state
@ -64,7 +65,7 @@ type StructLog struct {
// Note that reference types are actual VM data structures; make copies
// Note that reference types are actual VM data structures; make copies
// if you need to retain them beyond the current call.
// if you need to retain them beyond the current call.
type Tracer interface {
type Tracer interface {
CaptureState ( env Environment , pc uint64 , op OpCode , gas , cost * big . Int , memory * Memory , stack * Stack , contract * Contract , depth int , err error )
CaptureState ( env Environment , pc uint64 , op OpCode , gas , cost * big . Int , memory * Memory , stack * Stack , contract * Contract , depth int , err error ) error
}
}
// StructLogger is an EVM state logger and implements Tracer.
// StructLogger is an EVM state logger and implements Tracer.
@ -93,7 +94,12 @@ func NewStructLogger(cfg *LogConfig) *StructLogger {
// 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 SSTORE ops to track dirty values.
// captureState also tracks SSTORE ops to track dirty values.
func ( l * StructLogger ) CaptureState ( env Environment , pc uint64 , op OpCode , gas , cost * big . Int , memory * Memory , stack * Stack , contract * Contract , depth int , err error ) {
func ( l * StructLogger ) CaptureState ( env Environment , pc uint64 , op OpCode , gas , cost * big . Int , memory * Memory , stack * Stack , contract * Contract , depth int , err error ) error {
// check if already accumulated the specified number of logs
if l . cfg . Limit != 0 && l . cfg . Limit <= len ( l . logs ) {
return TraceLimitReachedError
}
// initialise new changed values storage container for this contract
// initialise new changed values storage container for this contract
// if not present.
// if not present.
if l . changedValues [ contract . Address ( ) ] == nil {
if l . changedValues [ contract . Address ( ) ] == nil {
@ -152,6 +158,7 @@ func (l *StructLogger) CaptureState(env Environment, pc uint64, op OpCode, gas,
log := StructLog { pc , op , new ( big . Int ) . Set ( gas ) , cost , mem , stck , storage , env . Depth ( ) , err }
log := StructLog { pc , op , new ( big . Int ) . Set ( gas ) , cost , mem , stck , storage , env . Depth ( ) , err }
l . logs = append ( l . logs , log )
l . logs = append ( l . logs , log )
return nil
}
}
// StructLogs returns a list of captured log entries
// StructLogs returns a list of captured log entries