diff --git a/core/state_transition.go b/core/state_transition.go index 3dbc789f8..fedea8021 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -224,7 +224,7 @@ func (self *StateTransition) transitionState() (ret []byte, usedGas *big.Int, er } if vm.Debug { - VmStdErrFormat(vmenv.StructLogs()) + vm.StdErrFormat(vmenv.StructLogs()) } self.refundGas() diff --git a/core/vm/environment.go b/core/vm/environment.go index e61676409..5c04e7022 100644 --- a/core/vm/environment.go +++ b/core/vm/environment.go @@ -41,6 +41,7 @@ type StructLog struct { Pc uint64 Op OpCode Gas *big.Int + GasCost *big.Int Memory []byte Stack []*big.Int Storage map[common.Hash][]byte diff --git a/core/vm_logger.go b/core/vm/logger.go similarity index 85% rename from core/vm_logger.go rename to core/vm/logger.go index d0742380e..6d08cbebe 100644 --- a/core/vm_logger.go +++ b/core/vm/logger.go @@ -1,4 +1,4 @@ -package core +package vm import ( "fmt" @@ -6,13 +6,12 @@ import ( "unicode/utf8" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" ) -func VmStdErrFormat(logs []vm.StructLog) { +func StdErrFormat(logs []StructLog) { fmt.Fprintf(os.Stderr, "VM Stats %d ops\n", len(logs)) for _, log := range logs { - fmt.Fprintf(os.Stderr, "PC %08d: %s\n", log.Pc, log.Op) + fmt.Fprintf(os.Stderr, "PC %08d: %s GAS: %v COST: %v\n", log.Pc, log.Op, log.Gas, log.GasCost) fmt.Fprintln(os.Stderr, "STACK =", len(log.Stack)) for i, item := range log.Stack { fmt.Fprintf(os.Stderr, "%04d: %x\n", i, common.LeftPadBytes(item.Bytes(), 32)) @@ -41,6 +40,6 @@ func VmStdErrFormat(logs []vm.StructLog) { for h, item := range log.Storage { fmt.Fprintf(os.Stderr, "%x: %x\n", h, common.LeftPadBytes(item, 32)) } - + fmt.Fprintln(os.Stderr) } } diff --git a/core/vm/vm.go b/core/vm/vm.go index fe380d79d..117331389 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -100,14 +100,14 @@ func (self *Vm) Run(context *Context, input []byte) (ret []byte, err error) { // Get the memory location of pc op = context.GetOp(pc) - self.log(pc, op, context.Gas, mem, stack, context) - // calculate the new memory size and gas price for the current executing opcode newMemSize, gas, err := self.calculateGasAndSize(context, caller, op, statedb, mem, stack) if err != nil { return nil, err } + self.log(pc, op, context.Gas, gas, mem, stack, context) + // Use the calculated gas. When insufficient gas is present, use all gas and return an // Out Of Gas error if !context.UseGas(gas) { @@ -789,7 +789,7 @@ func (self *Vm) RunPrecompiled(p *PrecompiledAccount, input []byte, context *Con // log emits a log event to the environment for each opcode encountered. This is not to be confused with the // LOG* opcode. -func (self *Vm) log(pc uint64, op OpCode, gas *big.Int, memory *Memory, stack *stack, context *Context) { +func (self *Vm) log(pc uint64, op OpCode, gas, cost *big.Int, memory *Memory, stack *stack, context *Context) { if Debug { mem := make([]byte, len(memory.Data())) copy(mem, memory.Data()) @@ -802,7 +802,7 @@ func (self *Vm) log(pc uint64, op OpCode, gas *big.Int, memory *Memory, stack *s storage[common.BytesToHash(k)] = v }) - self.env.AddStructLog(StructLog{pc, op, new(big.Int).Set(gas), mem, stck, storage}) + self.env.AddStructLog(StructLog{pc, op, new(big.Int).Set(gas), cost, mem, stck, storage}) } }