Module: Bitcoin::Opcodes

Included in:
Descriptor, Multisig, Script, ScriptInterpreter, Taproot::SimpleBuilder
Defined in:
lib/bitcoin/opcodes.rb

Overview

Constant Summary collapse

OP_0 =
0x00
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_PUSHDATA1 =
0x4c
OP_PUSHDATA2 =
0x4d
OP_PUSHDATA4 =
0x4e
OP_1NEGATE =
0x4f
OP_NOP =
0x61
OP_IF =
0x63
OP_NOTIF =
0x64
OP_ELSE =
0x67
OP_ENDIF =
0x68
OP_VERIFY =
0x69
OP_RETURN =
0x6a
OP_TOALTSTACK =
0x6b
OP_FROMALTSTACK =
0x6c
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_2DROP =
0x6d
OP_2DUP =
0x6e
OP_3DUP =
0x6f
OP_2OVER =
0x70
OP_2ROT =
0x71
OP_2SWAP =
0x72
OP_CAT =
0x7e
OP_SUBSTR =

disabled

0x7f
OP_LEFT =

disabled

0x80
OP_RIGHT =

disabled

0x81
OP_SIZE =

disabled

0x82
OP_INVERT =
0x83
OP_AND =

disabled

0x84
OP_OR =

disabled

0x85
OP_XOR =

disabled

0x86
OP_EQUAL =

disabled

0x87
OP_EQUALVERIFY =
0x88
OP_1ADD =
0x8b
OP_1SUB =
0x8c
OP_2MUL =

disabled

0x8d
OP_2DIV =

disabled

0x8e
OP_NEGATE =
0x8f
OP_ABS =
0x90
OP_NOT =
0x91
OP_0NOTEQUAL =
0x92
OP_ADD =
0x93
OP_SUB =
0x94
OP_MUL =

disabled

0x95
OP_DIV =

disabled

0x96
OP_MOD =

disabled

0x97
OP_LSHIFT =

disabled

0x98
OP_RSHIFT =

disabled

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 =
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_NOP2 =
OP_CHECKLOCKTIMEVERIFY = OP_CLTV = 0xb1
OP_NOP3 =
OP_CHECKSEQUENCEVERIFY = OP_CSV = 0xb2
OP_RESERVED =
0x50
OP_VER =
0x62
OP_VERIF =
0x65
OP_VERNOTIF =
0x66
OP_RESERVED1 =
0x89
OP_RESERVED2 =
0x8a
OP_NOP1 =
0xb0
OP_NOP4 =
0xb3
OP_NOP5 =
0xb4
OP_NOP6 =
0xb5
OP_NOP7 =
0xb6
OP_NOP8 =
0xb7
OP_NOP9 =
0xb8
OP_NOP10 =
0xb9
OP_CHECKSIGADD =

BIP 342 opcodes (Tapscript)

0xba
OP_PUBKEYHASH =
0xfd
OP_PUBKEY =
0xfe
OP_INVALIDOPCODE =
0xff
DUPLICATE_KEY =
[:OP_NOP2, :OP_NOP3]
OPCODES_MAP =
NAME_MAP =
OP_SUCCESSES =
[0x50, 0x62, 0x89, 0x8a, 0x8d, 0x8e, (0x7e..0x81).to_a,
(0x83..0x86).to_a, (0x95..0x99).to_a, (0xbb..0xfe).to_a].flatten

Class Method Summary collapse

Class Method Details

.defined?(opcode, allow_success = false) ⇒ Boolean

whether opcode is predefined opcode

Returns:

  • (Boolean)


164
165
166
167
# File 'lib/bitcoin/opcodes.rb', line 164

def defined?(opcode, allow_success = false)
  return true if allow_success && op_success?(opcode)
  !opcode_to_name(opcode).nil?
end

.name_to_opcode(name) ⇒ Object



158
159
160
161
# File 'lib/bitcoin/opcodes.rb', line 158

def name_to_opcode(name)
  return NAME_MAP['OP_' + name] if name =~ /^\d/ && name.to_i < 17 && name.to_i > -1
  NAME_MAP[name]
end

.op_success?(opcode) ⇒ Boolean

Check whether opcode is OP_SUCCESSx or not?

Parameters:

Returns:

  • (Boolean)

    if opcode is OP_SUCCESSx return true, otherwise false.



186
187
188
# File 'lib/bitcoin/opcodes.rb', line 186

def op_success?(opcode)
  OP_SUCCESSES.include?(opcode)
end

.opcode_to_name(opcode) ⇒ Object



153
154
155
156
# File 'lib/bitcoin/opcodes.rb', line 153

def opcode_to_name(opcode)
  return OPCODES_MAP[opcode].delete('OP_') if opcode == OP_0 || (opcode <= OP_16 && opcode >= OP_1)
  OPCODES_MAP[opcode]
end

.opcode_to_small_int(opcode) ⇒ Object



176
177
178
179
180
181
# File 'lib/bitcoin/opcodes.rb', line 176

def opcode_to_small_int(opcode)
  return 0 if opcode == ''.b || opcode == OP_0
  return -1 if opcode == OP_1NEGATE
  return opcode - (OP_1 - 1) if opcode >= OP_1 && opcode <= OP_16
  nil
end

.small_int_to_opcode(int) ⇒ Object



169
170
171
172
173
174
# File 'lib/bitcoin/opcodes.rb', line 169

def small_int_to_opcode(int)
  return OP_0 if int == 0
  return OP_1NEGATE if int == -1
  return OP_1 + (int - 1) if int >= 1 && int <= 16
  nil
end