github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/evm/json_logger.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2017 Go Ethereum作者 10 //此文件是Go以太坊的一部分。 11 // 12 //Go以太坊是免费软件:您可以重新发布和/或修改它 13 //根据GNU通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊的分布希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU通用公共许可证了解更多详细信息。 21 // 22 //你应该已经收到一份GNU通用公共许可证的副本 23 //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package main 26 27 import ( 28 "encoding/json" 29 "io" 30 "math/big" 31 "time" 32 33 "github.com/ethereum/go-ethereum/common" 34 "github.com/ethereum/go-ethereum/common/math" 35 "github.com/ethereum/go-ethereum/core/vm" 36 ) 37 38 type JSONLogger struct { 39 encoder *json.Encoder 40 cfg *vm.LogConfig 41 } 42 43 //newjsonLogger创建了一个新的EVM跟踪程序,它将执行步骤作为JSON对象打印出来。 44 //进入提供的流。 45 func NewJSONLogger(cfg *vm.LogConfig, writer io.Writer) *JSONLogger { 46 return &JSONLogger{json.NewEncoder(writer), cfg} 47 } 48 49 func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { 50 return nil 51 } 52 53 //CaptureState在记录器上输出状态信息。 54 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 { 55 log := vm.StructLog{ 56 Pc: pc, 57 Op: op, 58 Gas: gas, 59 GasCost: cost, 60 MemorySize: memory.Len(), 61 Storage: nil, 62 Depth: depth, 63 Err: err, 64 } 65 if !l.cfg.DisableMemory { 66 log.Memory = memory.Data() 67 } 68 if !l.cfg.DisableStack { 69 log.Stack = stack.Data() 70 } 71 return l.encoder.Encode(log) 72 } 73 74 //CaptureFault在记录器上输出状态信息。 75 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 { 76 return nil 77 } 78 79 //CaptureEnd在执行结束时触发。 80 func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { 81 type endLog struct { 82 Output string `json:"output"` 83 GasUsed math.HexOrDecimal64 `json:"gasUsed"` 84 Time time.Duration `json:"time"` 85 Err string `json:"error,omitempty"` 86 } 87 if err != nil { 88 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) 89 } 90 return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) 91 }