From ff5b3ef0877978699235d20b3caa9890b35ec6f8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 10 Jun 2015 10:59:44 +0200 Subject: [PATCH] core/vm: added structured logging --- core/execution.go | 4 ---- core/vm/vm.go | 26 ++++++++++++++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/core/execution.go b/core/execution.go index 522c90449..9fb0210de 100644 --- a/core/execution.go +++ b/core/execution.go @@ -2,7 +2,6 @@ package core import ( "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" @@ -49,8 +48,6 @@ func (self *Execution) Create(caller vm.ContextRef) (ret []byte, err error, acco } func (self *Execution) exec(contextAddr *common.Address, code []byte, caller vm.ContextRef) (ret []byte, err error) { - start := time.Now() - env := self.env evm := self.evm if env.Depth() > int(params.CallCreateDepth.Int64()) { @@ -96,7 +93,6 @@ func (self *Execution) exec(contextAddr *common.Address, code []byte, caller vm. context.SetCallCode(contextAddr, code) ret, err = evm.Run(context, self.input) - evm.Printf("message call took %v", time.Since(start)).Endl() if err != nil { env.State().Set(snapshot) } diff --git a/core/vm/vm.go b/core/vm/vm.go index ed4157178..e6d4c8df2 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -11,10 +11,18 @@ import ( "github.com/ethereum/go-ethereum/params" ) +type log struct { + op OpCode + gas *big.Int + memory []byte + stack []*big.Int +} + type Vm struct { env Environment - logTy byte + // structured logging + Logs []log logStr string err error @@ -32,9 +40,7 @@ type Vm struct { } func New(env Environment) *Vm { - lt := LogTyPretty - - return &Vm{debug: Debug, env: env, logTy: lt, Recoverable: true} + return &Vm{env: env, Recoverable: true} } func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) { @@ -106,6 +112,8 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) { // Get the memory location of pc op = context.GetOp(pc) + self.Log(op, context.Gas, mem, stack) + self.Printf("(pc) %-3d -o- %-14s (m) %-4d (s) %-4d ", pc, op.String(), mem.Len(), stack.len()) newMemSize, gas, err := self.calculateGasAndSize(context, caller, op, statedb, mem, stack) if err != nil { @@ -855,6 +863,16 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo return newMemSize, gas, nil } +func (vm *Vm) Log(op OpCode, gas *big.Int, memory *Memory, stack *stack) { + if vm.debug { + mem := make([]byte, len(memory.store)) + copy(mem, memory.store) + stck := make([]*big.Int, len(stack.data)) + copy(stck, stack.data) + vm.Logs = append(vm.Logs, log{op, new(big.Int).Set(gas), mem, stck}) + } +} + func (self *Vm) RunPrecompiled(p *PrecompiledAccount, callData []byte, context *Context) (ret []byte, err error) { gas := p.Gas(len(callData)) if context.UseGas(gas) {