Documentation
¶
Index ¶
- func Emit(w *bytes.Buffer, op Instruction, b []byte) error
- func EmitAppCall(w *bytes.Buffer, scriptHash util.Uint160, tailCall bool) error
- func EmitAppCallWithOperation(w *bytes.Buffer, scriptHash util.Uint160, operation string) error
- func EmitAppCallWithOperationAndData(w *bytes.Buffer, scriptHash util.Uint160, operation string, data []byte) error
- func EmitBool(w io.ByteWriter, ok bool) error
- func EmitBytes(w *bytes.Buffer, b []byte) error
- func EmitCall(w *bytes.Buffer, op Instruction, label int16) error
- func EmitInt(w *bytes.Buffer, i int64) error
- func EmitJmp(w *bytes.Buffer, op Instruction, label int16) error
- func EmitOpcode(w io.ByteWriter, op Instruction) error
- func EmitString(w *bytes.Buffer, s string) error
- func EmitSyscall(w *bytes.Buffer, api string) error
- type ArrayItem
- type BigIntegerItem
- type BoolItem
- type ByteArrayItem
- type Context
- type Element
- type Instruction
- type InteropFunc
- type Mode
- type Stack
- func (s *Stack) Back() *Element
- func (s *Stack) Clear()
- func (s *Stack) Dup(n int) *Element
- func (s *Stack) InsertAt(e *Element, n int) *Element
- func (s *Stack) InsertBefore(e, mark *Element) *Element
- func (s *Stack) Iter(f func(*Element))
- func (s *Stack) Len() int
- func (s *Stack) Peek(n int) *Element
- func (s *Stack) Pop() *Element
- func (s *Stack) Push(e *Element)
- func (s *Stack) PushVal(v interface{})
- func (s *Stack) Remove(e *Element) *Element
- func (s *Stack) RemoveAt(n int) *Element
- func (s *Stack) Top() *Element
- type StackItem
- type State
- type StructItem
- type VM
- func (v *VM) AddBreakPoint(n int)
- func (v *VM) AddBreakPointRel(n int)
- func (v *VM) Astack() *Stack
- func (v *VM) Context() *Context
- func (v *VM) Estack() *Stack
- func (v *VM) Istack() *Stack
- func (v *VM) Load(prog []byte)
- func (v *VM) LoadArgs(method []byte, args []StackItem)
- func (v *VM) LoadFile(path string) error
- func (v *VM) LoadScript(b []byte)
- func (v *VM) PopResult() interface{}
- func (v *VM) PrintOps()
- func (v *VM) Ready() bool
- func (v *VM) RegisterInteropFunc(name string, f InteropFunc)
- func (v *VM) Run()
- func (v *VM) Stack(n string) string
- func (v *VM) Step()
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Emit ¶
func Emit(w *bytes.Buffer, op Instruction, b []byte) error
Emit a VM Instruction with data to the given buffer.
func EmitAppCall ¶
EmitAppCall emits an appcall, if tailCall is true, tailCall opcode will be emitted instead.
func EmitAppCallWithOperation ¶
EmitAppCallWithOperation emits an appcall with the given operation.
func EmitAppCallWithOperationAndData ¶
func EmitAppCallWithOperationAndData(w *bytes.Buffer, scriptHash util.Uint160, operation string, data []byte) error
EmitAppCallWithOperationAndData emits an appcall with the given operation and data.
func EmitBool ¶
func EmitBool(w io.ByteWriter, ok bool) error
EmitBool emits a bool type the given buffer.
func EmitCall ¶
func EmitCall(w *bytes.Buffer, op Instruction, label int16) error
EmitCall emits a call Instruction with label to the given buffer.
func EmitJmp ¶
func EmitJmp(w *bytes.Buffer, op Instruction, label int16) error
EmitJmp emits a jump Instruction along with label to the given buffer.
func EmitOpcode ¶
func EmitOpcode(w io.ByteWriter, op Instruction) error
EmitOpcode emits a single VM Instruction the given buffer.
func EmitString ¶
EmitString emits a string to the given buffer.
Types ¶
type ArrayItem ¶
type ArrayItem struct {
// contains filtered or unexported fields
}
ArrayItem represents a new ArrayItem object.
func NewArrayItem ¶
NewArrayItem returns a new ArrayItem object.
func (*ArrayItem) MarshalJSON ¶
MarshalJSON implements the json.Marshaler interface.
type BigIntegerItem ¶
type BigIntegerItem struct {
// contains filtered or unexported fields
}
BigIntegerItem represents a big integer on the stack.
func NewBigIntegerItem ¶
func NewBigIntegerItem(value int) *BigIntegerItem
NewBigIntegerItem returns an new BigIntegerItem object.
func (*BigIntegerItem) MarshalJSON ¶
func (i *BigIntegerItem) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface.
func (*BigIntegerItem) String ¶
func (i *BigIntegerItem) String() string
func (*BigIntegerItem) Value ¶
func (i *BigIntegerItem) Value() interface{}
Value implements StackItem interface.
type BoolItem ¶
type BoolItem struct {
// contains filtered or unexported fields
}
func (*BoolItem) MarshalJSON ¶
MarshalJSON implements the json.Marshaler interface.
type ByteArrayItem ¶
type ByteArrayItem struct {
// contains filtered or unexported fields
}
ByteArrayItem represents a byte array on the stack.
func NewByteArrayItem ¶
func NewByteArrayItem(b []byte) *ByteArrayItem
NewByteArrayItem returns an new ByteArrayItem object.
func (*ByteArrayItem) MarshalJSON ¶
func (i *ByteArrayItem) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface.
func (*ByteArrayItem) String ¶
func (i *ByteArrayItem) String() string
func (*ByteArrayItem) Value ¶
func (i *ByteArrayItem) Value() interface{}
Value implements StackItem interface.
type Context ¶
type Context struct {
// contains filtered or unexported fields
}
Context represent the current execution context of the VM.
func (*Context) CurrInstr ¶
func (c *Context) CurrInstr() (int, Instruction)
CurrInstr returns the current instruction and opcode.
func (*Context) IP ¶
IP returns the absolute instruction without taking 0 into account. If that program starts the ip = 0 but IP() will return 1, cause its the first instruction.
func (*Context) Next ¶
func (c *Context) Next() Instruction
Next return the next instruction to execute.
type Element ¶
type Element struct {
// contains filtered or unexported fields
}
Element represents an element in the double linked list (the stack), which will hold the underlying StackItem.
func NewElement ¶
func NewElement(v interface{}) *Element
NewElement returns a new Element object, with its underlying value inferred to the corresponding type.
func (*Element) BigInt ¶
BigInt attempts to get the underlying value of the element as a big integer. Will panic if the assertion failed which will be caught by the VM.
func (*Element) Bool ¶
Bool attempts to get the underlying value of the element as a boolean. Will panic if the assertion failed which will be caught by the VM.
func (*Element) Bytes ¶
Bytes attempts to get the underlying value of the element as a byte array. Will panic if the assertion failed which will be caught by the VM.
type Instruction ¶
type Instruction byte
Instruction represents an single operation for the NEO virtual machine.
const ( // Constants PUSH0 Instruction = 0x00 PUSHF Instruction = PUSH0 PUSHBYTES1 Instruction = 0x01 PUSHBYTES75 Instruction = 0x4B PUSHDATA1 Instruction = 0x4C PUSHDATA2 Instruction = 0x4D PUSHDATA4 Instruction = 0x4E PUSHM1 Instruction = 0x4F PUSH1 Instruction = 0x51 PUSHT Instruction = PUSH1 PUSH2 Instruction = 0x52 PUSH3 Instruction = 0x53 PUSH4 Instruction = 0x54 PUSH5 Instruction = 0x55 PUSH6 Instruction = 0x56 PUSH7 Instruction = 0x57 PUSH8 Instruction = 0x58 PUSH9 Instruction = 0x59 PUSH10 Instruction = 0x5A PUSH11 Instruction = 0x5B PUSH12 Instruction = 0x5C PUSH13 Instruction = 0x5D PUSH14 Instruction = 0x5E PUSH15 Instruction = 0x5F PUSH16 Instruction = 0x60 // Flow control NOP Instruction = 0x61 JMP Instruction = 0x62 JMPIF Instruction = 0x63 JMPIFNOT Instruction = 0x64 CALL Instruction = 0x65 RET Instruction = 0x66 APPCALL Instruction = 0x67 SYSCALL Instruction = 0x68 TAILCALL Instruction = 0x69 // Stack DUPFROMALTSTACK Instruction = 0x6A TOALTSTACK Instruction = 0x6B FROMALTSTACK Instruction = 0x6C XDROP Instruction = 0x6D XSWAP Instruction = 0x72 XTUCK Instruction = 0x73 DEPTH Instruction = 0x74 DROP Instruction = 0x75 DUP Instruction = 0x76 NIP Instruction = 0x77 OVER Instruction = 0x78 PICK Instruction = 0x79 ROLL Instruction = 0x7A ROT Instruction = 0x7B SWAP Instruction = 0x7C TUCK Instruction = 0x7D // Splice CAT Instruction = 0x7E SUBSTR Instruction = 0x7F LEFT Instruction = 0x80 RIGHT Instruction = 0x81 SIZE Instruction = 0x82 // Bitwise logic INVERT Instruction = 0x83 AND Instruction = 0x84 OR Instruction = 0x85 XOR Instruction = 0x86 EQUAL Instruction = 0x87 // Arithmetic INC Instruction = 0x8B DEC Instruction = 0x8C SIGN Instruction = 0x8D NEGATE Instruction = 0x8F ABS Instruction = 0x90 NOT Instruction = 0x91 NZ Instruction = 0x92 ADD Instruction = 0x93 SUB Instruction = 0x94 MUL Instruction = 0x95 DIV Instruction = 0x96 MOD Instruction = 0x97 SHL Instruction = 0x98 SHR Instruction = 0x99 BOOLAND Instruction = 0x9A BOOLOR Instruction = 0x9B NUMEQUAL Instruction = 0x9C NUMNOTEQUAL Instruction = 0x9E LT Instruction = 0x9F GT Instruction = 0xA0 LTE Instruction = 0xA1 GTE Instruction = 0xA2 MIN Instruction = 0xA3 MAX Instruction = 0xA4 WITHIN Instruction = 0xA5 // Crypto SHA1 Instruction = 0xA7 SHA256 Instruction = 0xA8 HASH160 Instruction = 0xA9 HASH256 Instruction = 0xAA CHECKSIG Instruction = 0xAC CHECKMULTISIG Instruction = 0xAE // Array ARRAYSIZE Instruction = 0xC0 PACK Instruction = 0xC1 UNPACK Instruction = 0xC2 PICKITEM Instruction = 0xC3 SETITEM Instruction = 0xC4 NEWARRAY Instruction = 0xC5 NEWSTRUCT Instruction = 0xC6 APPEND Instruction = 0xC8 REVERSE Instruction = 0xC9 REMOVE Instruction = 0xCA // Exceptions THROW Instruction = 0xF0 THROWIFNOT Instruction = 0xF1 )
Viable list of supported instruction constants.
func (Instruction) String ¶
func (i Instruction) String() string
type Mode ¶
type Mode uint
Mode configures behaviour of the VM.
var (
ModeMute Mode = 1 << 0
)
Available VM Modes.
type Stack ¶
type Stack struct {
// contains filtered or unexported fields
}
Stack represents a Stack backed by a double linked list.
func (*Stack) Clear ¶
func (s *Stack) Clear()
Clear will clear all elements on the stack and set its length to 0.
func (*Stack) Dup ¶
Dup will duplicate and return the element at position n. Dup is used for copying elements on to the top of its own stack.
s.Push(s.Peek(0)) // will result in unexpected behaviour. s.Push(s.Dup(0)) // is the correct approach.
func (*Stack) InsertBefore ¶
InsertBefore will insert the element before the mark on the stack.
func (*Stack) Iter ¶
Iter will iterate over all the elements int the stack, starting from the top of the stack.
s.Iter(func(elem *Element) { // do something with the element. })
func (*Stack) Peek ¶
Peek returns the element (n) far in the stack beginning from the top of the stack.
n = 0 => will return the element on top of the stack.
func (*Stack) PushVal ¶
func (s *Stack) PushVal(v interface{})
PushVal will push the given value on the stack. It will infer the underlying StackItem to its corresponding type.
type State ¶
type State uint8
State of the VM.
func StateFromString ¶
func (State) MarshalJSON ¶
func (*State) UnmarshalJSON ¶
type StructItem ¶
type StructItem struct {
// contains filtered or unexported fields
}
StructItem represents a struct on the stack.
func NewStructItem ¶
func NewStructItem(items []StackItem) *StructItem
NewStructItem returns an new StructItem object.
func (*StructItem) String ¶
func (i *StructItem) String() string
func (*StructItem) Value ¶
func (i *StructItem) Value() interface{}
Value implements StackItem interface.
type VM ¶
type VM struct {
// contains filtered or unexported fields
}
VM represents the virtual machine.
func (*VM) AddBreakPoint ¶
AddBreakPoint adds a breakpoint to the current context.
func (*VM) AddBreakPointRel ¶
AddBreakPointRel adds a breakpoint relative to the current instruction pointer.
func (*VM) Context ¶
Context returns the current executed context. Nil if there is no context, which implies no program is loaded.
func (*VM) LoadScript ¶
LoadScript will load a script from the internal script table. It will immediately push a new context created from this script to the invocation stack and starts executing it.
func (*VM) PopResult ¶
func (v *VM) PopResult() interface{}
PopResult is used to pop the first item of the evaluation stack. This allows us to test compiler and vm in a bi-directional way.
func (*VM) PrintOps ¶
func (v *VM) PrintOps()
PrintOps will print the opcodes of the current loaded program to stdout.
func (*VM) Ready ¶
Ready return true if the VM ready to execute the loaded program. Will return false if no program is loaded.
func (*VM) RegisterInteropFunc ¶
func (v *VM) RegisterInteropFunc(name string, f InteropFunc)
RegisterInteropFunc will register the given InteropFunc to the VM.