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  }