Browse Source

core/vm: added structured logging

obscuren 10 years ago
parent
commit
ff5b3ef087
2 changed files with 22 additions and 8 deletions
  1. 0 4
      core/execution.go
  2. 22 4
      core/vm/vm.go

+ 0 - 4
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)
 	}

+ 22 - 4
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) {