diff options
author | Martin Holst Swende <martin@swende.se> | 2018-10-15 18:28:44 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-12-10 18:33:50 +0800 |
commit | 42a914a84ffcc5d123af400c2cbcd34b05e2b0b3 (patch) | |
tree | 268f1b8388608016babcc11c84a37d22638f33c5 /core/vm | |
parent | 09d588e0da77c1ed150d7274f66a67dcaecab80c (diff) | |
download | dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar.gz dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar.bz2 dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar.lz dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar.xz dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.tar.zst dexon-42a914a84ffcc5d123af400c2cbcd34b05e2b0b3.zip |
cmd/evm, core/vm, eth: implement api methods to do stdjson dump to local filesystem
Diffstat (limited to 'core/vm')
-rw-r--r-- | core/vm/logger_json.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/core/vm/logger_json.go b/core/vm/logger_json.go new file mode 100644 index 000000000..ac3c40759 --- /dev/null +++ b/core/vm/logger_json.go @@ -0,0 +1,83 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. + +package vm + +import ( + "encoding/json" + "io" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" +) + +type JSONLogger struct { + encoder *json.Encoder + cfg *LogConfig +} + +// NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects +// into the provided stream. +func NewJSONLogger(cfg *LogConfig, writer io.Writer) *JSONLogger { + return &JSONLogger{json.NewEncoder(writer), cfg} +} + +func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { + return nil +} + +// CaptureState outputs state information on the logger. +func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { + log := StructLog{ + Pc: pc, + Op: op, + Gas: gas, + GasCost: cost, + MemorySize: memory.Len(), + Storage: nil, + Depth: depth, + RefundCounter: env.StateDB.GetRefund(), + Err: err, + } + if !l.cfg.DisableMemory { + log.Memory = memory.Data() + } + if !l.cfg.DisableStack { + log.Stack = stack.Data() + } + return l.encoder.Encode(log) +} + +// CaptureFault outputs state information on the logger. +func (l *JSONLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { + return nil +} + +// CaptureEnd is triggered at end of execution. +func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { + type endLog struct { + Output string `json:"output"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` + Time time.Duration `json:"time"` + Err string `json:"error,omitempty"` + } + if err != nil { + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) + } + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) +} |