github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/evm/json_logger.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:27</date> 10 //</624342589956427776> 11 12 13 package main 14 15 import ( 16 "encoding/json" 17 "io" 18 "math/big" 19 "time" 20 21 "github.com/ethereum/go-ethereum/common" 22 "github.com/ethereum/go-ethereum/common/math" 23 "github.com/ethereum/go-ethereum/core/vm" 24 ) 25 26 type JSONLogger struct { 27 encoder *json.Encoder 28 cfg *vm.LogConfig 29 } 30 31 //newjsonLogger创建了一个新的EVM跟踪程序,它将执行步骤作为JSON对象打印出来。 32 //进入提供的流。 33 func NewJSONLogger(cfg *vm.LogConfig, writer io.Writer) *JSONLogger { 34 return &JSONLogger{json.NewEncoder(writer), cfg} 35 } 36 37 func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { 38 return nil 39 } 40 41 //CaptureState在记录器上输出状态信息。 42 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 { 43 log := vm.StructLog{ 44 Pc: pc, 45 Op: op, 46 Gas: gas, 47 GasCost: cost, 48 MemorySize: memory.Len(), 49 Storage: nil, 50 Depth: depth, 51 Err: err, 52 } 53 if !l.cfg.DisableMemory { 54 log.Memory = memory.Data() 55 } 56 if !l.cfg.DisableStack { 57 log.Stack = stack.Data() 58 } 59 return l.encoder.Encode(log) 60 } 61 62 //CaptureFault在记录器上输出状态信息。 63 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 { 64 return nil 65 } 66 67 //CaptureEnd在执行结束时触发。 68 func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { 69 type endLog struct { 70 Output string `json:"output"` 71 GasUsed math.HexOrDecimal64 `json:"gasUsed"` 72 Time time.Duration `json:"time"` 73 Err string `json:"error,omitempty"` 74 } 75 if err != nil { 76 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) 77 } 78 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) 79 } 80