scriptBuilder

package
v0.0.0-...-d447769 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 22, 2018 License: MIT Imports: 7 Imported by: 0

README

#Script builder notes

This example was taken from neo docs and deconstructed to see the OPCODES:

00 - PUSHF

c1 - PACK

04 - PUSHBYTES 4

6e616d65 - name

67 - APPCALL

11c4d1f4fba619f2628870d36e3a9773e874705b - This is the scriptHash in reverse (5b7074e873973a6ed3708862f219a6fbf4d1c411)

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type GasCost

type GasCost int64
const (
	PUSH16Cost        GasCost = 0
	NOPCost           GasCost = 0
	APPCALLCost       GasCost = 1000000
	TAILCALLCost      GasCost = 1000000
	SHA1Cost          GasCost = 1000000
	SHA256Cost        GasCost = 1000000
	HASH160Cost       GasCost = 2000000
	HASH256Cost       GasCost = 2000000
	CHECKSIGCost      GasCost = 10000000
	CHECKMULTISIGCost GasCost = 10000000
	DEFAULTCost       GasCost = 100000
)

In fixed 8

type OpCode

type OpCode byte
const (
	// Constants
	PUSH0       OpCode = 0x00 // An empty array of bytes is pushed onto the stack.
	PUSHF       OpCode = PUSH0
	PUSHBYTES1  OpCode = 0x01 // 0x01-0x4B The next opcode bytes is data to be pushed onto the stack
	PUSHBYTES75 OpCode = 0x4B
	PUSHDATA1   OpCode = 0x4C // The next byte contains the number of bytes to be pushed onto the stack.
	PUSHDATA2   OpCode = 0x4D // The next two bytes contain the number of bytes to be pushed onto the stack.
	PUSHDATA4   OpCode = 0x4E // The next four bytes contain the number of bytes to be pushed onto the stack.
	PUSHM1      OpCode = 0x4F // The number -1 is pushed onto the stack.
	PUSH1       OpCode = 0x51 // The number 1 is pushed onto the stack.
	PUSHT       OpCode = PUSH1
	PUSH2       OpCode = 0x52 // The number 2 is pushed onto the stack.
	PUSH3       OpCode = 0x53 // The number 3 is pushed onto the stack.
	PUSH4       OpCode = 0x54 // The number 4 is pushed onto the stack.
	PUSH5       OpCode = 0x55 // The number 5 is pushed onto the stack.
	PUSH6       OpCode = 0x56 // The number 6 is pushed onto the stack.
	PUSH7       OpCode = 0x57 // The number 7 is pushed onto the stack.
	PUSH8       OpCode = 0x58 // The number 8 is pushed onto the stack.
	PUSH9       OpCode = 0x59 // The number 9 is pushed onto the stack.
	PUSH10      OpCode = 0x5A // The number 10 is pushed onto the stack.
	PUSH11      OpCode = 0x5B // The number 11 is pushed onto the stack.
	PUSH12      OpCode = 0x5C // The number 12 is pushed onto the stack.
	PUSH13      OpCode = 0x5D // The number 13 is pushed onto the stack.
	PUSH14      OpCode = 0x5E // The number 14 is pushed onto the stack.
	PUSH15      OpCode = 0x5F // The number 15 is pushed onto the stack.
	PUSH16      OpCode = 0x60 // The number 16 is pushed onto the stack.

	// Flow control
	NOP      OpCode = 0x61 // Does nothing.
	JMP      OpCode = 0x62
	JMPIF    OpCode = 0x63
	JMPIFNOT OpCode = 0x64
	CALL     OpCode = 0x65
	RET      OpCode = 0x66
	APPCALL  OpCode = 0x67
	SYSCALL  OpCode = 0x68
	TAILCALL OpCode = 0x69

	// Stack
	DUPFROMALTSTACK OpCode = 0x6A
	TOALTSTACK      OpCode = 0x6B // Puts the input onto the top of the alt stack. Removes it from the main stack.
	FROMALTSTACK    OpCode = 0x6C // Puts the input onto the top of the main stack. Removes it from the alt stack.
	XDROP           OpCode = 0x6D
	XSWAP           OpCode = 0x72
	XTUCK           OpCode = 0x73
	DEPTH           OpCode = 0x74 // Puts the number of stack items onto the stack.
	DROP            OpCode = 0x75 // Removes the top stack item.
	DUP             OpCode = 0x76 // Duplicates the top stack item.
	NIP             OpCode = 0x77 // Removes the second-to-top stack item.
	OVER            OpCode = 0x78 // Copies the second-to-top stack item to the top.
	PICK            OpCode = 0x79 // The item n back in the stack is copied to the top.
	ROLL            OpCode = 0x7A // The item n back in the stack is moved to the top.
	ROT             OpCode = 0x7B // The top three items on the stack are rotated to the left.
	SWAP            OpCode = 0x7C // The top two items on the stack are swapped.
	TUCK            OpCode = 0x7D // The item at the top of the stack is copied and inserted before the second-to-top item.

	// Splice
	CAT    OpCode = 0x7E // Concatenates two strings.
	SUBSTR OpCode = 0x7F // Returns a section of a string.
	LEFT   OpCode = 0x80 // Keeps only characters left of the specified point in a string.
	RIGHT  OpCode = 0x81 // Keeps only characters right of the specified point in a string.
	SIZE   OpCode = 0x82 // Returns the length of the input string.

	// Bitwise logic
	INVERT OpCode = 0x83 // Flips all of the bits in the input.
	AND    OpCode = 0x84 // Boolean and between each bit in the inputs.
	OR     OpCode = 0x85 // Boolean or between each bit in the inputs.
	XOR    OpCode = 0x86 // Boolean exclusive or between each bit in the inputs.
	EQUAL  OpCode = 0x87 // Returns 1 if the inputs are exactly equal 0 otherwise.

	// Arithmetic
	// Note: Arithmetic inputs are limited to signed 32-bit integers but may overflow their output.
	INC         OpCode = 0x8B // 1 is added to the input.
	DEC         OpCode = 0x8C // 1 is subtracted from the input.
	SIGN        OpCode = 0x8D
	NEGATE      OpCode = 0x8F // The sign of the input is flipped.
	ABS         OpCode = 0x90 // The input is made positive.
	NOT         OpCode = 0x91 // If the input is 0 or 1 it is flipped. Otherwise the output will be 0.
	NZ          OpCode = 0x92 // Returns 0 if the input is 0. 1 otherwise.
	ADD         OpCode = 0x93 // a is added to b.
	SUB         OpCode = 0x94 // b is subtracted from a.
	MUL         OpCode = 0x95 // a is multiplied by b.
	DIV         OpCode = 0x96 // a is divided by b.
	MOD         OpCode = 0x97 // Returns the remainder after dividing a by b.
	SHL         OpCode = 0x98 // Shifts a left b bits preserving sign.
	SHR         OpCode = 0x99 // Shifts a right b bits preserving sign.
	BOOLAND     OpCode = 0x9A // If both a and b are not 0 the output is 1. Otherwise 0.
	BOOLOR      OpCode = 0x9B // If a or b is not 0 the output is 1. Otherwise 0.
	NUMEQUAL    OpCode = 0x9C // Returns 1 if the numbers are equal 0 otherwise.
	NUMNOTEQUAL OpCode = 0x9E // Returns 1 if the numbers are not equal 0 otherwise.
	LT          OpCode = 0x9F // Returns 1 if a is less than b 0 otherwise.
	GT          OpCode = 0xA0 // Returns 1 if a is greater than b 0 otherwise.
	LTE         OpCode = 0xA1 // Returns 1 if a is less than or equal to b 0 otherwise.
	GTE         OpCode = 0xA2 // Returns 1 if a is greater than or equal to b 0 otherwise.
	MIN         OpCode = 0xA3 // Returns the smaller of a and b.
	MAX         OpCode = 0xA4 // Returns the larger of a and b.
	WITHIN      OpCode = 0xA5 // Returns 1 if x is within the specified range (left-inclusive) 0 otherwise.

	// Crypto
	//RIPEMD160 OpCode = 0xA6 // The input is hashed using RIPEMD-160.
	SHA1          OpCode = 0xA7 // The input is hashed using SHA-1.
	SHA256        OpCode = 0xA8 // The input is hashed using SHA-256.
	HASH160       OpCode = 0xA9
	HASH256       OpCode = 0xAA
	CHECKSIG      OpCode = 0xAC
	CHECKMULTISIG OpCode = 0xAE

	// Array
	ARRAYSIZE OpCode = 0xC0
	PACK      OpCode = 0xC1
	UNPACK    OpCode = 0xC2
	PICKITEM  OpCode = 0xC3
	SETITEM   OpCode = 0xC4
	NEWARRAY  OpCode = 0xC5 //用作引用類型
	NEWSTRUCT OpCode = 0xC6 //用作值類型
	APPEND    OpCode = 0xC8
	REVERSE   OpCode = 0xC9
	REMOVE    OpCode = 0xCA

	// Exceptions
	THROW      OpCode = 0xF0
	THROWIFNOT OpCode = 0xF1
)

type Script

type Script struct {
	Operation  string
	Args       []interface{}
	ScriptHash string // This is the scriptHash of contract we want to invoke
	// contains filtered or unexported fields
}

func (*Script) AddArgument

func (s *Script) AddArgument(arg interface{})

func (*Script) Bytes

func (s *Script) Bytes(w io.Writer)

func (*Script) EmitAppCall

func (s *Script) EmitAppCall(w io.Writer)

func (*Script) EmitArr

func (s *Script) EmitArr(w io.Writer, arr []interface{})

func (*Script) EmitBool

func (s *Script) EmitBool(w io.Writer, isTrue bool)

func (*Script) EmitBytes

func (s *Script) EmitBytes(w io.Writer, bAppend []byte)

func (*Script) EmitFloat

func (s *Script) EmitFloat(w io.Writer, f float64)

func (*Script) EmitInt

func (s *Script) EmitInt(w io.Writer, i int64)

func (*Script) EmitIntLiteral

func (s *Script) EmitIntLiteral(w io.Writer, i int64)

This is to emit the literal values of numbers. E.g. input = 10, output =PUSH10 upto PUSH16

func (*Script) EmitOpCode

func (s *Script) EmitOpCode(w io.Writer, op OpCode)

func (*Script) EmitScriptHash

func (s *Script) EmitScriptHash(w io.Writer, script string)

func (*Script) EmitString

func (s *Script) EmitString(w io.Writer, str string)

func (*Script) GasCost

func (s *Script) GasCost() int64

TODO: use the gas cost file, to add up the gas cost whenever an operation is done

func (*Script) GetLength

func (s *Script) GetLength() uint64

func (*Script) Hex

func (s *Script) Hex() string

func (*Script) SerialiseScript

func (s *Script) SerialiseScript(w io.Writer)

func (*Script) SetOperation

func (s *Script) SetOperation(operation string)

func (*Script) SetScriptHash

func (s *Script) SetScriptHash(scriptHash string)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL