github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/cmd/evm/json_logger.go (about) 1 2 package main 3 4 import ( 5 "encoding/json" 6 "io" 7 "math/big" 8 "time" 9 10 "github.com/quickchainproject/quickchain/common" 11 "github.com/quickchainproject/quickchain/common/math" 12 "github.com/quickchainproject/quickchain/core/vm" 13 ) 14 15 type JSONLogger struct { 16 encoder *json.Encoder 17 cfg *vm.LogConfig 18 } 19 20 func NewJSONLogger(cfg *vm.LogConfig, writer io.Writer) *JSONLogger { 21 return &JSONLogger{json.NewEncoder(writer), cfg} 22 } 23 24 func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { 25 return nil 26 } 27 28 // CaptureState outputs state information on the logger. 29 func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error { 30 log := vm.StructLog{ 31 Pc: pc, 32 Op: op, 33 Gas: gas, 34 GasCost: cost, 35 MemorySize: memory.Len(), 36 Storage: nil, 37 Depth: depth, 38 Err: err, 39 } 40 if !l.cfg.DisableMemory { 41 log.Memory = memory.Data() 42 } 43 if !l.cfg.DisableStack { 44 log.Stack = stack.Data() 45 } 46 return l.encoder.Encode(log) 47 } 48 49 // CaptureFault outputs state information on the logger. 50 func (l *JSONLogger) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error { 51 return nil 52 } 53 54 // CaptureEnd is triggered at end of execution. 55 func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { 56 type endLog struct { 57 Output string `json:"output"` 58 GasUsed math.HexOrDecimal64 `json:"gasUsed"` 59 Time time.Duration `json:"time"` 60 Err string `json:"error,omitempty"` 61 } 62 if err != nil { 63 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) 64 } 65 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) 66 }