|
|
|
@ -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) { |
|
|
|
|