Module: BSV::Script::Opcodes

Defined in:
lib/bsv/script/opcodes.rb

Overview

All Bitcoin script opcodes as integer constants.

Includes data push operations, flow control, stack manipulation, splice, bitwise, arithmetic, and cryptographic opcodes. Also provides Opcodes.name_for for reverse lookup (opcode byte → name).

Constant Summary collapse

OP_0 =

Push value

0x00
OP_FALSE =
OP_0
OP_PUSHDATA1 =
0x4c
OP_PUSHDATA2 =
0x4d
OP_PUSHDATA4 =
0x4e
OP_1NEGATE =
0x4f
OP_RESERVED =
0x50
OP_1 =
0x51
OP_TRUE =
OP_1
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 =

Flow control

0x61
OP_VER =
0x62
OP_IF =
0x63
OP_NOTIF =
0x64
OP_VERIF =
0x65
OP_VERNOTIF =
0x66
OP_ELSE =
0x67
OP_ENDIF =
0x68
OP_VERIFY =
0x69
OP_RETURN =
0x6a
OP_TOALTSTACK =

Stack

0x6b
OP_FROMALTSTACK =
0x6c
OP_2DROP =
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

0x7e
OP_SPLIT =
0x7f
OP_NUM2BIN =
0x80
OP_BIN2NUM =
0x81
OP_SIZE =
0x82
OP_INVERT =

Bitwise logic

0x83
OP_AND =
0x84
OP_OR =
0x85
OP_XOR =
0x86
OP_EQUAL =
0x87
OP_EQUALVERIFY =
0x88
OP_RESERVED1 =
0x89
OP_RESERVED2 =
0x8a
OP_1ADD =

Arithmetic

0x8b
OP_1SUB =
0x8c
OP_2MUL =
0x8d
OP_2DIV =
0x8e
OP_NEGATE =
0x8f
OP_ABS =
0x90
OP_NOT =
0x91
OP_0NOTEQUAL =
0x92
OP_ADD =
0x93
OP_SUB =
0x94
OP_MUL =
0x95
OP_DIV =
0x96
OP_MOD =
0x97
OP_LSHIFT =
0x98
OP_RSHIFT =
0x99
OP_BOOLAND =
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 =
0xab
OP_CHECKSIG =
0xac
OP_CHECKSIGVERIFY =
0xad
OP_CHECKMULTISIG =
0xae
OP_CHECKMULTISIGVERIFY =
0xaf
OP_NOP1 =

Expansion / NOP upgrades

0xb0
OP_CHECKLOCKTIMEVERIFY =
0xb1
OP_CHECKSEQUENCEVERIFY =
0xb2
OP_SUBSTR =

Chronicle slots (0xb3–0xb7): string-splice and numeric-shift opcodes re-enabled in BSV Chronicle. Fully implemented in the interpreter.

0xb3
OP_LEFT =
0xb4
OP_RIGHT =
0xb5
OP_LSHIFTNUM =
0xb6
OP_RSHIFTNUM =
0xb7
OP_NOP4 =

NOP aliases for the Chronicle slots (preserved for compatibility)

OP_SUBSTR
OP_NOP5 =
OP_LEFT
OP_NOP6 =
OP_RIGHT
OP_NOP7 =
OP_LSHIFTNUM
OP_NOP8 =
OP_RSHIFTNUM
OP_NOP9 =
0xb8
OP_NOP10 =
0xb9
OP_NOP11 =

Extended NOP range (0xba–0xfc) — unnamed, reserved for future use. Defined so that to_asm/from_asm can round-trip scripts containing them.

0xba
OP_NOP12 =
0xbb
OP_NOP13 =
0xbc
OP_NOP14 =
0xbd
OP_NOP15 =
0xbe
OP_NOP16 =
0xbf
OP_NOP17 =
0xc0
OP_NOP18 =
0xc1
OP_NOP19 =
0xc2
OP_NOP20 =
0xc3
OP_NOP21 =
0xc4
OP_NOP22 =
0xc5
OP_NOP23 =
0xc6
OP_NOP24 =
0xc7
OP_NOP25 =
0xc8
OP_NOP26 =
0xc9
OP_NOP27 =
0xca
OP_NOP28 =
0xcb
OP_NOP29 =
0xcc
OP_NOP30 =
0xcd
OP_NOP31 =
0xce
OP_NOP32 =
0xcf
OP_NOP33 =
0xd0
OP_NOP34 =
0xd1
OP_NOP35 =
0xd2
OP_NOP36 =
0xd3
OP_NOP37 =
0xd4
OP_NOP38 =
0xd5
OP_NOP39 =
0xd6
OP_NOP40 =
0xd7
OP_NOP41 =
0xd8
OP_NOP42 =
0xd9
OP_NOP43 =
0xda
OP_NOP44 =
0xdb
OP_NOP45 =
0xdc
OP_NOP46 =
0xdd
OP_NOP47 =
0xde
OP_NOP48 =
0xdf
OP_NOP49 =
0xe0
OP_NOP50 =
0xe1
OP_NOP51 =
0xe2
OP_NOP52 =
0xe3
OP_NOP53 =
0xe4
OP_NOP54 =
0xe5
OP_NOP55 =
0xe6
OP_NOP56 =
0xe7
OP_NOP57 =
0xe8
OP_NOP58 =
0xe9
OP_NOP59 =
0xea
OP_NOP60 =
0xeb
OP_NOP61 =
0xec
OP_NOP62 =
0xed
OP_NOP63 =
0xee
OP_NOP64 =
0xef
OP_NOP65 =
0xf0
OP_NOP66 =
0xf1
OP_NOP67 =
0xf2
OP_NOP68 =
0xf3
OP_NOP69 =
0xf4
OP_NOP70 =
0xf5
OP_NOP71 =
0xf6
OP_NOP72 =
0xf7
OP_NOP73 =
0xf8
OP_NOP74 =
0xf9
OP_NOP75 =
0xfa
OP_NOP76 =
0xfb
OP_NOP77 =
0xfc
OP_PUBKEYHASH =

Pseudo-words (not used in scripts)

0xfd
OP_PUBKEY =
0xfe
OP_INVALIDOPCODE =
0xff
NAME =

Reverse lookup: opcode byte → name string. Sorted so canonical names (OP_0, OP_1) win over aliases (OP_FALSE, OP_TRUE) regardless of Module#constants enumeration order.

constants
.select { |c| c.to_s.start_with?('OP_') }
.sort
.each_with_object({}) { |c, h| h[const_get(c)] ||= c.to_s }
.freeze

Class Method Summary collapse

Class Method Details

.name_for(opcode) ⇒ String?

Look up the canonical name for an opcode byte.

Parameters:

  • opcode (Integer)

    the opcode byte value

Returns:

  • (String, nil)

    the opcode name (e.g. “OP_DUP”), or nil if unknown



241
242
243
# File 'lib/bsv/script/opcodes.rb', line 241

def name_for(opcode)
  NAME[opcode]
end