Module: BTC::Opcodes
- Included in:
- BTC, Address, AssetMarker, Opcode, Script, ScriptChunk, ScriptInterpreter, ScriptInterpreterExtension, TransactionBuilder
- Defined in:
- lib/btcruby/script/opcode.rb
Overview
All opcodes are defined in Opcodes module so they can be included in a different namespace without the baggage of other BTC identifiers.
Constant Summary collapse
- OP_FALSE =
Push 1 byte 0x00 on the stack
0x00- OP_0 =
0x00- OP_PUSHDATA1 =
PUSHDATA
opcode is followed by N-byte length of the string that follows. 0x4c- OP_PUSHDATA2 =
followed by a 1-byte length of the string to push (allows pushing 0..255 bytes).
0x4d- OP_PUSHDATA4 =
followed by a 2-byte length of the string to push (allows pushing 0..65535 bytes).
0x4e- OP_1NEGATE =
followed by a 4-byte length of the string to push (allows pushing 0..4294967295 bytes).
0x4f- OP_RESERVED =
pushes -1 number on the stack
0x50- OP_TRUE =
OP_
pushes number on the stack 0x51- OP_1 =
0x51- OP_2 =
0x52- OP_3 =
0x53- OP_4 =
0x54- OP_5 =
0x55- OP_6 =
0x56- OP_7 =
0x57- OP_8 =
0x58- OP_9 =
0x59- OP_10 =
0x5a- OP_11 =
0x5b- OP_12 =
0x5c- OP_13 =
0x5d- OP_14 =
0x5e- OP_15 =
0x5f- OP_16 =
0x60- OP_NOP =
- Control flow operators
0x61- OP_VER =
Does nothing
0x62- OP_IF =
BitcoinQT executes all operators from OP_IF to OP_ENDIF even inside "non-executed" branch (to keep track of nesting). Since OP_VERIF and OP_VERNOTIF are not assigned, even inside a non-executed branch they will fall in "default:" switch case and cause the script to fail. Some other ops like OP_VER can be present inside non-executed branch because they'll be skipped.
0x63- OP_NOTIF =
If the top stack value is not 0, the statements are executed. The top stack value is removed.
0x64- OP_VERIF =
If the top stack value is 0, the statements are executed. The top stack value is removed.
0x65- OP_VERNOTIF =
Not assigned. Script is invalid with that opcode (even if inside non-executed branch).
0x66- OP_ELSE =
Not assigned. Script is invalid with that opcode (even if inside non-executed branch).
0x67- OP_ENDIF =
Executes code if the previous OP_IF or OP_NOTIF was not executed.
0x68- OP_VERIFY =
Finishes if/else block
0x69- OP_RETURN =
Removes item from the stack if it's not 0x00 or 0x80 (negative zero). Otherwise, marks script as invalid.
0x6a- OP_TOALTSTACK =
Stack ops
0x6b- OP_FROMALTSTACK =
Moves item from the stack to altstack
0x6c- OP_2DROP =
Moves item from the altstack to stack
0x6d- OP_2DUP =
0x6e- OP_3DUP =
0x6f- OP_2OVER =
0x70- OP_2ROT =
0x71- OP_2SWAP =
0x72- OP_IFDUP =
0x73- OP_DEPTH =
0x74- OP_DROP =
0x75- OP_DUP =
0x76- OP_NIP =
0x77- OP_OVER =
0x78- OP_PICK =
0x79- OP_ROLL =
0x7a- OP_ROT =
0x7b- OP_SWAP =
0x7c- OP_TUCK =
0x7d- OP_CAT =
Splice ops
0x7e- OP_SUBSTR =
Disabled opcode. If executed, transaction is invalid.
0x7f- OP_LEFT =
Disabled opcode. If executed, transaction is invalid.
0x80- OP_RIGHT =
Disabled opcode. If executed, transaction is invalid.
0x81- OP_SIZE =
Disabled opcode. If executed, transaction is invalid.
0x82- OP_INVERT =
Bit logic
0x83- OP_AND =
Disabled opcode. If executed, transaction is invalid.
0x84- OP_OR =
Disabled opcode. If executed, transaction is invalid.
0x85- OP_XOR =
Disabled opcode. If executed, transaction is invalid.
0x86- OP_EQUAL =
Disabled opcode. If executed, transaction is invalid.
0x87- OP_EQUALVERIFY =
Last two items are removed from the stack and compared. Result (true or false) is pushed to the stack.
0x88- OP_RESERVED1 =
Same as OP_EQUAL, but removes the result from the stack if it's true or marks script as invalid.
0x89- OP_RESERVED2 =
Disabled opcode. If executed, transaction is invalid.
0x8a- OP_1ADD =
Numeric
0x8b- OP_1SUB =
adds 1 to last item, pops it from stack and pushes result.
0x8c- OP_2MUL =
substracts 1 to last item, pops it from stack and pushes result.
0x8d- OP_2DIV =
Disabled opcode. If executed, transaction is invalid.
0x8e- OP_NEGATE =
Disabled opcode. If executed, transaction is invalid.
0x8f- OP_ABS =
negates the number, pops it from stack and pushes result.
0x90- OP_NOT =
replaces number with its absolute value
0x91- OP_0NOTEQUAL =
replaces number with True if it's zero, False otherwise.
0x92- OP_ADD =
replaces number with True if it's not zero, False otherwise.
0x93- OP_SUB =
(x y -- x+y)
0x94- OP_MUL =
(x y -- x-y)
0x95- OP_DIV =
Disabled opcode. If executed, transaction is invalid.
0x96- OP_MOD =
Disabled opcode. If executed, transaction is invalid.
0x97- OP_LSHIFT =
Disabled opcode. If executed, transaction is invalid.
0x98- OP_RSHIFT =
Disabled opcode. If executed, transaction is invalid.
0x99- OP_BOOLAND =
Disabled opcode. If executed, transaction is invalid.
0x9a- OP_BOOLOR =
0x9b- OP_NUMEQUAL =
0x9c- OP_NUMEQUALVERIFY =
0x9d- OP_NUMNOTEQUAL =
0x9e- OP_LESSTHAN =
0x9f- OP_GREATERTHAN =
0xa0- OP_LESSTHANOREQUAL =
0xa1- OP_GREATERTHANOREQUAL =
0xa2- OP_MIN =
0xa3- OP_MAX =
0xa4- OP_WITHIN =
0xa5- OP_RIPEMD160 =
Crypto
0xa6- OP_SHA1 =
0xa7- OP_SHA256 =
0xa8- OP_HASH160 =
0xa9- OP_HASH256 =
0xaa- OP_CODESEPARATOR =
This opcode is rarely used because it's useless, but we need to support it anyway.
0xab- OP_CHECKSIG =
0xac- OP_CHECKSIGVERIFY =
0xad- OP_CHECKMULTISIG =
0xae- OP_CHECKMULTISIGVERIFY =
0xaf- OP_NOP1 =
Expansion
0xb0- OP_NOP2 =
0xb1- OP_CHECKLOCKTIMEVERIFY =
See BIP65
OP_NOP2- OP_NOP3 =
0xb2- OP_NOP4 =
0xb3- OP_NOP5 =
0xb4- OP_NOP6 =
0xb5- OP_NOP7 =
0xb6- OP_NOP8 =
0xb7- OP_NOP9 =
0xb8- OP_NOP10 =
0xb9- OP_INVALIDOPCODE =
0xff- OPCODE_NAME_TO_VALUE =
Hash[*constants.grep(/^OP_/).map{|c| [c.to_s, const_get(c)]
- OPCODE_VALUE_TO_NAME =