Documentation
¶
Index ¶
- Constants
- Variables
- func BoolBytes(v bool) []byte
- func DisasmString(script []byte) string
- func RemoveOpcode(buf []byte, opcode byte) []byte
- type Engine
- func (vm *Engine) DisableDebug()
- func (vm *Engine) EnableDebug()
- func (vm *Engine) Execute(program []byte) error
- func (vm *Engine) PrintTrace()
- func (vm *Engine) SetSigHashFn(fn SigHashFn)
- func (vm *Engine) SetSigVerifyFn(fn SigVerifyFn)
- func (vm *Engine) Step() (bool, error)
- func (vm *Engine) Traces() []Trace
- func (vm *Engine) Verify(unlocking []byte, locking []byte) error
- type Instruction
- type ScriptBuilder
- func (b *ScriptBuilder) AddData(data []byte) *ScriptBuilder
- func (b *ScriptBuilder) AddInt64(val int64) *ScriptBuilder
- func (b *ScriptBuilder) AddOp(op byte) *ScriptBuilder
- func (b *ScriptBuilder) Hash160() ([]byte, error)
- func (b *ScriptBuilder) Load(script string) *ScriptBuilder
- func (b *ScriptBuilder) Reset() *ScriptBuilder
- func (b *ScriptBuilder) Script() ([]byte, error)
- type ScriptNum
- type ScriptReader
- type SigHashFn
- type SigVerifyFn
- type Stack
- func (s *Stack) Clean()
- func (s *Stack) Copy() *Stack
- func (s *Stack) Depth() int
- func (s *Stack) DropN(n int32) error
- func (s *Stack) DupN(n int) error
- func (s *Stack) PeekByteArray(idx int) ([]byte, error)
- func (s *Stack) PopBool() (bool, error)
- func (s *Stack) PopByteArray() ([]byte, error)
- func (s *Stack) PopInt() (ScriptNum, error)
- func (s *Stack) PushBool(val bool)
- func (s *Stack) PushByteArray(val []byte)
- func (s *Stack) PushInt(val ScriptNum)
- func (s *Stack) String() string
- func (s *Stack) SwapN(n int32) error
- type Trace
Constants ¶
const ( ER_SCRIPT_INSTRUCTION_UNKNOWN int = 1101 ER_SCRIPT_INSTRUCTION_READ_ERROR int = 1102 ER_SCRIPT_OPCODE_READ_ERROR int = 1103 ER_SCRIPT_OPCODE_SIZE_MALFORMED int = 1104 ER_SCRIPT_STACK_INDEX_INVALID int = 1110 ER_SCRIPT_STACK_OPERATION_INVALID int = 1111 ER_SCRIPTNUM_TOO_BIG int = 1201 ER_SCRIPTNUM_MINIMAL_DATA int = 1202 ER_VM_EXEC_OPCODE_FAILED int = 1300 )
Error type.
const ( OpCondFalse = 0 OpCondTrue = 1 OpCondSkip = 2 )
Conditional execution constants.
const ( OP_0 = 0x00 // 0 OP_FALSE = 0x00 // 0 - AKA OP_0 OP_DATA_1 = 0x01 // 1 OP_DATA_2 = 0x02 // 2 OP_DATA_3 = 0x03 // 3 OP_DATA_4 = 0x04 // 4 OP_DATA_5 = 0x05 // 5 OP_DATA_6 = 0x06 // 6 OP_DATA_7 = 0x07 // 7 OP_DATA_8 = 0x08 // 8 OP_DATA_9 = 0x09 // 9 OP_DATA_10 = 0x0a // 10 OP_DATA_11 = 0x0b // 11 OP_DATA_12 = 0x0c // 12 OP_DATA_13 = 0x0d // 13 OP_DATA_14 = 0x0e // 14 OP_DATA_15 = 0x0f // 15 OP_DATA_16 = 0x10 // 16 OP_DATA_17 = 0x11 // 17 OP_DATA_18 = 0x12 // 18 OP_DATA_19 = 0x13 // 19 OP_DATA_20 = 0x14 // 20 OP_DATA_21 = 0x15 // 21 OP_DATA_22 = 0x16 // 22 OP_DATA_23 = 0x17 // 23 OP_DATA_24 = 0x18 // 24 OP_DATA_25 = 0x19 // 25 OP_DATA_26 = 0x1a // 26 OP_DATA_27 = 0x1b // 27 OP_DATA_28 = 0x1c // 28 OP_DATA_29 = 0x1d // 29 OP_DATA_30 = 0x1e // 30 OP_DATA_31 = 0x1f // 31 OP_DATA_32 = 0x20 // 32 OP_DATA_33 = 0x21 // 33 OP_DATA_34 = 0x22 // 34 OP_DATA_35 = 0x23 // 35 OP_DATA_36 = 0x24 // 36 OP_DATA_37 = 0x25 // 37 OP_DATA_38 = 0x26 // 38 OP_DATA_39 = 0x27 // 39 OP_DATA_40 = 0x28 // 40 OP_DATA_41 = 0x29 // 41 OP_DATA_42 = 0x2a // 42 OP_DATA_43 = 0x2b // 43 OP_DATA_44 = 0x2c // 44 OP_DATA_45 = 0x2d // 45 OP_DATA_46 = 0x2e // 46 OP_DATA_47 = 0x2f // 47 OP_DATA_48 = 0x30 // 48 OP_DATA_49 = 0x31 // 49 OP_DATA_50 = 0x32 // 50 OP_DATA_51 = 0x33 // 51 OP_DATA_52 = 0x34 // 52 OP_DATA_53 = 0x35 // 53 OP_DATA_54 = 0x36 // 54 OP_DATA_55 = 0x37 // 55 OP_DATA_56 = 0x38 // 56 OP_DATA_57 = 0x39 // 57 OP_DATA_58 = 0x3a // 58 OP_DATA_59 = 0x3b // 59 OP_DATA_60 = 0x3c // 60 OP_DATA_61 = 0x3d // 61 OP_DATA_62 = 0x3e // 62 OP_DATA_63 = 0x3f // 63 OP_DATA_64 = 0x40 // 64 OP_DATA_65 = 0x41 // 65 OP_DATA_66 = 0x42 // 66 OP_DATA_67 = 0x43 // 67 OP_DATA_68 = 0x44 // 68 OP_DATA_69 = 0x45 // 69 OP_DATA_70 = 0x46 // 70 OP_DATA_71 = 0x47 // 71 OP_DATA_72 = 0x48 // 72 OP_DATA_73 = 0x49 // 73 OP_DATA_74 = 0x4a // 74 OP_DATA_75 = 0x4b // 75 OP_PUSHDATA1 = 0x4c // 76 OP_PUSHDATA2 = 0x4d // 77 OP_PUSHDATA4 = 0x4e // 78 OP_1NEGATE = 0x4f // 79 OP_RESERVED = 0x50 // 80 OP_1 = 0x51 // 81 - AKA OP_TRUE OP_TRUE = 0x51 // 81 OP_2 = 0x52 // 82 OP_3 = 0x53 // 83 OP_4 = 0x54 // 84 OP_5 = 0x55 // 85 OP_6 = 0x56 // 86 OP_7 = 0x57 // 87 OP_8 = 0x58 // 88 OP_9 = 0x59 // 89 OP_10 = 0x5a // 90 OP_11 = 0x5b // 91 OP_12 = 0x5c // 92 OP_13 = 0x5d // 93 OP_14 = 0x5e // 94 OP_15 = 0x5f // 95 OP_16 = 0x60 // 96 OP_NOP = 0x61 // 97 OP_VER = 0x62 // 98 OP_IF = 0x63 // 99 OP_NOTIF = 0x64 // 100 OP_VERIF = 0x65 // 101 OP_VERNOTIF = 0x66 // 102 OP_ELSE = 0x67 // 103 OP_ENDIF = 0x68 // 104 OP_VERIFY = 0x69 // 105 OP_RETURN = 0x6a // 106 OP_TOALTSTACK = 0x6b // 107 OP_FROMALTSTACK = 0x6c // 108 OP_2DROP = 0x6d // 109 OP_2DUP = 0x6e // 110 OP_3DUP = 0x6f // 111 OP_2OVER = 0x70 // 112 OP_2ROT = 0x71 // 113 OP_2SWAP = 0x72 // 114 OP_IFDUP = 0x73 // 115 OP_DEPTH = 0x74 // 116 OP_DROP = 0x75 // 117 OP_DUP = 0x76 // 118 OP_NIP = 0x77 // 119 OP_OVER = 0x78 // 120 OP_PICK = 0x79 // 121 OP_ROLL = 0x7a // 122 OP_ROT = 0x7b // 123 OP_SWAP = 0x7c // 124 OP_TUCK = 0x7d // 125 OP_CAT = 0x7e // 126 OP_SUBSTR = 0x7f // 127 OP_LEFT = 0x80 // 128 OP_RIGHT = 0x81 // 129 OP_SIZE = 0x82 // 130 OP_INVERT = 0x83 // 131 OP_AND = 0x84 // 132 OP_OR = 0x85 // 133 OP_XOR = 0x86 // 134 OP_EQUAL = 0x87 // 135 OP_EQUALVERIFY = 0x88 // 136 OP_RESERVED1 = 0x89 // 137 OP_RESERVED2 = 0x8a // 138 OP_1ADD = 0x8b // 139 OP_1SUB = 0x8c // 140 OP_2MUL = 0x8d // 141 OP_2DIV = 0x8e // 142 OP_NEGATE = 0x8f // 143 OP_ABS = 0x90 // 144 OP_NOT = 0x91 // 145 OP_0NOTEQUAL = 0x92 // 146 OP_ADD = 0x93 // 147 OP_SUB = 0x94 // 148 OP_MUL = 0x95 // 149 OP_DIV = 0x96 // 150 OP_MOD = 0x97 // 151 OP_LSHIFT = 0x98 // 152 OP_RSHIFT = 0x99 // 153 OP_BOOLAND = 0x9a // 154 OP_BOOLOR = 0x9b // 155 OP_NUMEQUAL = 0x9c // 156 OP_NUMEQUALVERIFY = 0x9d // 157 OP_NUMNOTEQUAL = 0x9e // 158 OP_LESSTHAN = 0x9f // 159 OP_GREATERTHAN = 0xa0 // 160 OP_LESSTHANOREQUAL = 0xa1 // 161 OP_GREATERTHANOREQUAL = 0xa2 // 162 OP_MIN = 0xa3 // 163 OP_MAX = 0xa4 // 164 OP_WITHIN = 0xa5 // 165 OP_RIPEMD160 = 0xa6 // 166 OP_SHA1 = 0xa7 // 167 OP_SHA256 = 0xa8 // 168 OP_HASH160 = 0xa9 // 169 OP_HASH256 = 0xaa // 170 OP_CODESEPARATOR = 0xab // 171 OP_CHECKSIG = 0xac // 172 OP_CHECKSIGVERIFY = 0xad // 173 OP_CHECKMULTISIG = 0xae // 174 OP_CHECKMULTISIGVERIFY = 0xaf // 175 OP_NOP1 = 0xb0 // 176 OP_NOP2 = 0xb1 // 177 OP_CHECKLOCKTIMEVERIFY = 0xb1 // 177 - AKA OP_NOP2 OP_NOP3 = 0xb2 // 178 OP_CHECKSEQUENCEVERIFY = 0xb2 // 178 - AKA OP_NOP3 OP_NOP4 = 0xb3 // 179 OP_NOP5 = 0xb4 // 180 OP_NOP6 = 0xb5 // 181 OP_NOP7 = 0xb6 // 182 OP_NOP8 = 0xb7 // 183 OP_NOP9 = 0xb8 // 184 OP_NOP10 = 0xb9 // 185 OP_UNKNOWN186 = 0xba // 186 OP_UNKNOWN187 = 0xbb // 187 OP_UNKNOWN188 = 0xbc // 188 OP_UNKNOWN189 = 0xbd // 189 OP_UNKNOWN190 = 0xbe // 190 OP_UNKNOWN191 = 0xbf // 191 OP_UNKNOWN192 = 0xc0 // 192 OP_UNKNOWN193 = 0xc1 // 193 OP_UNKNOWN194 = 0xc2 // 194 OP_UNKNOWN195 = 0xc3 // 195 OP_UNKNOWN196 = 0xc4 // 196 OP_UNKNOWN197 = 0xc5 // 197 OP_UNKNOWN198 = 0xc6 // 198 OP_UNKNOWN199 = 0xc7 // 199 OP_UNKNOWN200 = 0xc8 // 200 OP_UNKNOWN201 = 0xc9 // 201 OP_UNKNOWN202 = 0xca // 202 OP_UNKNOWN203 = 0xcb // 203 OP_UNKNOWN204 = 0xcc // 204 OP_UNKNOWN205 = 0xcd // 205 OP_UNKNOWN206 = 0xce // 206 OP_UNKNOWN207 = 0xcf // 207 OP_UNKNOWN208 = 0xd0 // 208 OP_UNKNOWN209 = 0xd1 // 209 OP_UNKNOWN210 = 0xd2 // 210 OP_UNKNOWN211 = 0xd3 // 211 OP_UNKNOWN212 = 0xd4 // 212 OP_UNKNOWN213 = 0xd5 // 213 OP_UNKNOWN214 = 0xd6 // 214 OP_UNKNOWN215 = 0xd7 // 215 OP_UNKNOWN216 = 0xd8 // 216 OP_UNKNOWN217 = 0xd9 // 217 OP_UNKNOWN218 = 0xda // 218 OP_UNKNOWN219 = 0xdb // 219 OP_UNKNOWN220 = 0xdc // 220 OP_UNKNOWN221 = 0xdd // 221 OP_UNKNOWN222 = 0xde // 222 OP_UNKNOWN223 = 0xdf // 223 OP_UNKNOWN224 = 0xe0 // 224 OP_UNKNOWN225 = 0xe1 // 225 OP_UNKNOWN226 = 0xe2 // 226 OP_UNKNOWN227 = 0xe3 // 227 OP_UNKNOWN228 = 0xe4 // 228 OP_UNKNOWN229 = 0xe5 // 229 OP_UNKNOWN230 = 0xe6 // 230 OP_UNKNOWN231 = 0xe7 // 231 OP_UNKNOWN232 = 0xe8 // 232 OP_UNKNOWN233 = 0xe9 // 233 OP_UNKNOWN234 = 0xea // 234 OP_UNKNOWN235 = 0xeb // 235 OP_UNKNOWN236 = 0xec // 236 OP_UNKNOWN237 = 0xed // 237 OP_UNKNOWN238 = 0xee // 238 OP_UNKNOWN239 = 0xef // 239 OP_UNKNOWN240 = 0xf0 // 240 OP_UNKNOWN241 = 0xf1 // 241 OP_UNKNOWN242 = 0xf2 // 242 OP_UNKNOWN243 = 0xf3 // 243 OP_UNKNOWN244 = 0xf4 // 244 OP_UNKNOWN245 = 0xf5 // 245 OP_UNKNOWN246 = 0xf6 // 246 OP_UNKNOWN247 = 0xf7 // 247 OP_UNKNOWN248 = 0xf8 // 248 OP_UNKNOWN249 = 0xf9 // 249 OP_SMALLINTEGER = 0xfa // 250 - bitcoin core internal OP_PUBKEYS = 0xfb // 251 - bitcoin core internal OP_UNKNOWN252 = 0xfc // 252 OP_PUBKEYHASH = 0xfd // 253 - bitcoin core internal OP_PUBKEY = 0xfe // 254 - bitcoin core internal OP_INVALIDOPCODE = 0xff // 255 - bitcoin core internal )
These constants are the values of the official opcodes used on the btc wiki, in bitcoin core and in most if not all other references and software related to handling Unit scripts.
Variables ¶
var Errors = map[int]*xerror.Error{ ER_SCRIPT_INSTRUCTION_UNKNOWN: {Num: ER_SCRIPT_INSTRUCTION_UNKNOWN, State: "TS000", Message: "script.instruction.unknow[%v]"}, ER_SCRIPT_INSTRUCTION_READ_ERROR: {Num: ER_SCRIPT_INSTRUCTION_READ_ERROR, State: "TS000", Message: "script.read.instruction.error.remainning[%v]"}, ER_SCRIPT_OPCODE_READ_ERROR: {Num: ER_SCRIPT_OPCODE_READ_ERROR, State: "TS000", Message: "script.read.opcode[%v].requires[%v].bytes.but.remainning[%v]"}, ER_SCRIPT_OPCODE_SIZE_MALFORMED: {Num: ER_SCRIPT_OPCODE_SIZE_MALFORMED, State: "TS000", Message: "script.opcode[%v].size[%v].invalid"}, ER_SCRIPT_STACK_INDEX_INVALID: {Num: ER_SCRIPT_STACK_INDEX_INVALID, State: "TS000", Message: "script.stack.index[%v].invalid.for.stack.size[%v]"}, ER_SCRIPT_STACK_OPERATION_INVALID: {Num: ER_SCRIPT_STACK_OPERATION_INVALID, State: "TS000", Message: "script.stack.operation[%v][%v].invalid"}, ER_SCRIPTNUM_TOO_BIG: {Num: ER_SCRIPTNUM_TOO_BIG, State: "TS000", Message: "script.num.value.encoded.as[%x].is.[%d]bytes.which.exceeds.the.max.allowed.of.[%d]"}, ER_SCRIPTNUM_MINIMAL_DATA: {Num: ER_SCRIPTNUM_MINIMAL_DATA, State: "TS000", Message: "script.num.value.encoded.as[%x].is.not.minimally.encoded"}, ER_VM_EXEC_OPCODE_FAILED: {Num: ER_VM_EXEC_OPCODE_FAILED, State: "TVM00", Message: "vm.execute.opcode[%v].failed"}, }
Errors -- the jump table of error.
Functions ¶
func DisasmString ¶
DisasmString -- disasming the opcodes to the string instruction.
func RemoveOpcode ¶
RemoveOpcode -- remove the opcode.
Types ¶
type Engine ¶
type Engine struct {
// contains filtered or unexported fields
}
Engine -- the virtual matchine to execute the bitcoin scripts.
func (*Engine) SetSigHashFn ¶
SetSigHashFn -- set hasher function.
func (*Engine) SetSigVerifyFn ¶
func (vm *Engine) SetSigVerifyFn(fn SigVerifyFn)
SetSigVerifyFn -- set verify function.
type Instruction ¶
type Instruction struct {
// contains filtered or unexported fields
}
Instruction -- opcode that has been parsed and includes any potential data associated with it.
func (*Instruction) Data ¶
func (instr *Instruction) Data() []byte
Data -- returns the instruce data.
func (*Instruction) OpCode ¶
func (instr *Instruction) OpCode() byte
OpCode -- returns the opcode value.
type ScriptBuilder ¶
type ScriptBuilder struct {
// contains filtered or unexported fields
}
ScriptBuilder -- for building custom scripts
For example, the following would build a 2-of-3 multisig script for usage in a pay-to-script-hash (although in this situation MultiSigScript() would be a better choice to generate the script):
builder := NewScriptBuilder() builder.AddOp(OP_2).AddData(pubKey1).AddData(pubKey2) builder.AddData(pubKey3).AddOp(OP_3) builder.AddOp(OP_CHECKMULTISIG) script, err := builder.Script()
func NewScriptBuilder ¶
func NewScriptBuilder() *ScriptBuilder
NewScriptBuilder -- creates ScriptBuilder
func (*ScriptBuilder) AddData ¶
func (b *ScriptBuilder) AddData(data []byte) *ScriptBuilder
AddData -- push the passed data to the end of the script
func (*ScriptBuilder) AddInt64 ¶
func (b *ScriptBuilder) AddInt64(val int64) *ScriptBuilder
AddInt64 -- push the passed int64 to the end of script
func (*ScriptBuilder) AddOp ¶
func (b *ScriptBuilder) AddOp(op byte) *ScriptBuilder
AddOp -- push the passed opcode to the end of script
func (*ScriptBuilder) Hash160 ¶
func (b *ScriptBuilder) Hash160() ([]byte, error)
Hash160 -- returns the hash160 of the script bytes.
func (*ScriptBuilder) Load ¶
func (b *ScriptBuilder) Load(script string) *ScriptBuilder
Load -- load the string script and parse to instructions.
func (*ScriptBuilder) Reset ¶
func (b *ScriptBuilder) Reset() *ScriptBuilder
Reset -- resets the script so it has no content
func (*ScriptBuilder) Script ¶
func (b *ScriptBuilder) Script() ([]byte, error)
Script -- returns the currently built script When any errors occurred while building the script, the script will be returned up the point of the first error along with the error.
type ScriptNum ¶
type ScriptNum int64
ScriptNum --
func MakeScriptNum ¶
MakeScriptNum -- convert the byte to script num.
func (ScriptNum) Bytes ¶
Bytes -- returns the number serialized as a little endian with a sign bit Example encodings:
127 -> [0x7f] -127 -> [0xff] 128 -> [0x80 0x00] -128 -> [0x80 0x80] 129 -> [0x81 0x00] -129 -> [0x81 0x80] 256 -> [0x00 0x01] -256 -> [0x00 0x81] 32767 -> [0xff 0x7f] -32767 -> [0xff 0xff] 32768 -> [0x00 0x80 0x00] -32768 -> [0x00 0x80 0x80]
type ScriptReader ¶
type ScriptReader struct {
// contains filtered or unexported fields
}
ScriptReader -- parsing custom script to parsed opcodes.
func NewScriptReader ¶
func NewScriptReader(script []byte) *ScriptReader
NewScriptReader -- creates new ScriptReader.
func (*ScriptReader) AllInstructions ¶
func (r *ScriptReader) AllInstructions() ([]Instruction, error)
AllInstructions -- returns all instructions.
func (*ScriptReader) DisasmRemaining ¶
func (r *ScriptReader) DisasmRemaining() string
DisasmRemaining -- disasming the remaining opcodes in the reader.
func (*ScriptReader) NextInstruction ¶
func (r *ScriptReader) NextInstruction() (*Instruction, error)
NextInstruction -- returns the current instruction.
type SigVerifyFn ¶
SigVerifyFn -- verify function for checksig.
type Stack ¶
type Stack struct {
// contains filtered or unexported fields
}
Stack -- a stack of immutable objects to be used with bitcoin scripts.
func (*Stack) DropN ¶
DropN -- removes the top N items from the stack. Stack: DropN(1): [... x1 x2] -> [... x1] DropN(2): [... x1 x2] -> [...]
func (*Stack) DupN ¶
DupN -- duplicates the top N items on the stack.
Stack: DupN(1): [... x1 x2] -> [... x1 x2 x2] DupN(2): [... x1 x2] -> [... x1 x2 x1 x2]
func (*Stack) PeekByteArray ¶
PeekByteArray -- returns the Nth item on the stack without removing it.
func (*Stack) PopBool ¶
PopBool -- pops the value off the top of the stack, converts it into a bool, and returns it. Stack: [... x1 x2 x3] -> [... x1 x2]
func (*Stack) PopByteArray ¶
PopByteArray -- pops the value off the top of the stack and returns it. Stack: [... x1 x2 x3] -> [... x1 x2]
func (*Stack) PopInt ¶
PopInt -- pops the value off the top of the stack, converts it into a script num, and returns it. The act of converting to a script num enforces the consensus rules imposed on data interpreted as numbers. Stack: [... x1 x2 x3] -> [... x1 x2]
func (*Stack) PushBool ¶
PushBool -- converts the provided boolean to a suitable byte array then pushes it onto the top of the stack. Stack: [... x1 x2] -> [... x1 x2 bool]
func (*Stack) PushByteArray ¶
PushByteArray -- adds the given back array to the top of the stack. Stack: [... x1 x2] -> [... x1 x2 data]
func (*Stack) PushInt ¶
PushInt -- converts the ScriptNum to a suiteable byte array then pushes it onto the top of the stack. Stack: [... x1 x2] -> [... x1 x2 int]