func (vm *Engine) Execute(program []byte) error {
	return vm.execute(program, true)
}
Execute -- execute the scripts.
package xvm
import (
	"fmt"
	"os"
	"text/tabwriter"
	"github.com/keyfuse/tokucore/xerror"
)
type SigHashFn func(hashType byte) ([]byte, error)
type SigVerifyFn func(pubkey []byte, hash []byte, signature []byte) error
type Engine struct {
	pc          uint64  
	debug       bool
	dstack      *Stack  
	cstack      []int   
	sigHasher   SigHashFn
	sigVerifier SigVerifyFn
	reader      *ScriptReader
	instruction *Instruction  
	traces      []Trace
	lastStack   string  
	lastOp      string  
}
func NewEngine() *Engine {
	return &Engine{
		dstack: NewStack(),
	}
}
func (vm *Engine) EnableDebug() {
	vm.debug = true
}
func (vm *Engine) DisableDebug() {
	vm.debug = false
}
func (vm *Engine) SetSigHashFn(fn SigHashFn) {
	vm.sigHasher = fn
}
func (vm *Engine) SetSigVerifyFn(fn SigVerifyFn) {
	vm.sigVerifier = fn
}
func (vm *Engine) Step() (bool, error) {
	var err error
	vm.pc++
	if vm.instruction, err = vm.reader.NextInstruction(); err != nil || vm.instruction == nil {
		return true, err
	}
	if vm.branchShouldSkip() && !vm.instruction.isConditional() {
		return false, nil
	}
	if err = vm.instruction.op.opfunc(vm); err != nil {
		return true, err
	}
	return false, nil
}