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 =
  1. 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 =