比特币中的脚本用于定义和验证花费 UTXO 的条件。主要由操作码(Opcode)和数据组成。
以下是所有 Opcode 的列表:
入栈 (97)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 00 | OP_0 | 将 0 入栈 | |
| 01 | OP_PUSHBYTES_1 | 入栈其后 1 字节数据 | |
| 02 | OP_PUSHBYTES_2 | 入栈其后 2 字节数据 | |
| 03 | OP_PUSHBYTES_3 | 入栈其后 3 字节数据 | |
| 04 | OP_PUSHBYTES_4 | - | |
| 05 | OP_PUSHBYTES_5 | - | |
| 06 | OP_PUSHBYTES_6 | - | |
| 07 | OP_PUSHBYTES_7 | - | |
| 08 | OP_PUSHBYTES_8 | - | |
| 09 | OP_PUSHBYTES_9 | - | |
| 0a | OP_PUSHBYTES_10 | - | |
| 0b | OP_PUSHBYTES_11 | - | |
| 0c | OP_PUSHBYTES_12 | - | |
| 0d | OP_PUSHBYTES_13 | - | |
| 0e | OP_PUSHBYTES_14 | - | |
| 0f | OP_PUSHBYTES_15 | - | |
| 10 | OP_PUSHBYTES_16 | - | |
| 11 | OP_PUSHBYTES_17 | - | |
| 12 | OP_PUSHBYTES_18 | - | |
| 13 | OP_PUSHBYTES_19 | - | |
| 14 | OP_PUSHBYTES_20 | - | |
| 15 | OP_PUSHBYTES_21 | - | |
| 16 | OP_PUSHBYTES_22 | - | |
| 17 | OP_PUSHBYTES_23 | - | |
| 18 | OP_PUSHBYTES_24 | - | |
| 19 | OP_PUSHBYTES_25 | - | |
| 1a | OP_PUSHBYTES_26 | - | |
| 1b | OP_PUSHBYTES_27 | - | |
| 1c | OP_PUSHBYTES_28 | - | |
| 1d | OP_PUSHBYTES_29 | - | |
| 1e | OP_PUSHBYTES_30 | - | |
| 1f | OP_PUSHBYTES_31 | - | |
| 20 | OP_PUSHBYTES_32 | - | |
| 21 | OP_PUSHBYTES_33 | - | |
| 22 | OP_PUSHBYTES_34 | - | |
| 23 | OP_PUSHBYTES_35 | - | |
| 24 | OP_PUSHBYTES_36 | - | |
| 25 | OP_PUSHBYTES_37 | - | |
| 26 | OP_PUSHBYTES_38 | - | |
| 27 | OP_PUSHBYTES_39 | - | |
| 28 | OP_PUSHBYTES_40 | - | |
| 29 | OP_PUSHBYTES_41 | - | |
| 2a | OP_PUSHBYTES_42 | - | |
| 2b | OP_PUSHBYTES_43 | - | |
| 2c | OP_PUSHBYTES_44 | - | |
| 2d | OP_PUSHBYTES_45 | - | |
| 2e | OP_PUSHBYTES_46 | - | |
| 2f | OP_PUSHBYTES_47 | - | |
| 30 | OP_PUSHBYTES_48 | - | |
| 31 | OP_PUSHBYTES_49 | - | |
| 32 | OP_PUSHBYTES_50 | - | |
| 33 | OP_PUSHBYTES_51 | - | |
| 34 | OP_PUSHBYTES_52 | - | |
| 35 | OP_PUSHBYTES_53 | - | |
| 36 | OP_PUSHBYTES_54 | - | |
| 37 | OP_PUSHBYTES_55 | - | |
| 38 | OP_PUSHBYTES_56 | - | |
| 39 | OP_PUSHBYTES_57 | - | |
| 3a | OP_PUSHBYTES_58 | - | |
| 3b | OP_PUSHBYTES_59 | - | |
| 3c | OP_PUSHBYTES_60 | - | |
| 3d | OP_PUSHBYTES_61 | - | |
| 3e | OP_PUSHBYTES_62 | - | |
| 3f | OP_PUSHBYTES_63 | - | |
| 40 | OP_PUSHBYTES_64 | - | |
| 41 | OP_PUSHBYTES_65 | - | |
| 42 | OP_PUSHBYTES_66 | - | |
| 43 | OP_PUSHBYTES_67 | - | |
| 44 | OP_PUSHBYTES_68 | - | |
| 45 | OP_PUSHBYTES_69 | - | |
| 46 | OP_PUSHBYTES_70 | - | |
| 47 | OP_PUSHBYTES_71 | - | |
| 48 | OP_PUSHBYTES_72 | - | |
| 49 | OP_PUSHBYTES_73 | - | |
| 4a | OP_PUSHBYTES_74 | - | |
| 4b | OP_PUSHBYTES_75 | - | |
| 4c | OP_PUSHDATA1 | 其后 1 字节为数据长度, 并将其后数据长度的数据入栈 | |
| 4d | OP_PUSHDATA2 | - | |
| 4e | OP_PUSHDATA4 | - | |
| 4f | OP_1NEGATE | 将 -1 入栈 | |
| 50 | OP_RESERVED | 保留操作码, 执行到时会抛出错误 | |
| 51 | OP_1 | 将 1 入栈 | |
| 52 | OP_2 | 将 2 入栈 | |
| 53 | OP_3 | - | |
| 54 | OP_4 | - | |
| 55 | OP_5 | - | |
| 56 | OP_6 | - | |
| 57 | OP_7 | - | |
| 58 | OP_8 | - | |
| 59 | OP_9 | - | |
| 5a | OP_10 | - | |
| 5b | OP_11 | - | |
| 5c | OP_12 | - | |
| 5d | OP_13 | - | |
| 5e | OP_14 | - | |
| 5f | OP_15 | - | |
| 60 | OP_16 | - |
流程控制 (10)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 61 | OP_NOP | 空操作码, 无任何操作, 执行到此操作码时会被忽略, 继续执行下一个操作码 | |
| 62 | OP_VER | 保留操作码, 执行到时会抛出错误 | |
| 63 | OP_IF | 栈顶元素出栈, 如果栈顶元素非 0, 则执行后续操作 | |
| 64 | OP_NOTIF | 栈顶元素出栈, 如果栈顶元素为 0, 则执行后续操作 | |
| 65 | OP_VERIF | 保留操作码, 执行到时会抛出错误 | |
| 66 | OP_VERNOTIF | 保留操作码, 执行到时会抛出错误 | |
| 67 | OP_ELSE | 配合 OP_IF 或 OP_NOTIF 执行, 相当于条件语句中的 else | |
| 68 | OP_ENDIF | - | |
| 69 | OP_VERIFY | 栈顶元素出栈, 如果栈顶元素非 0, 则继续执行, 否则抛出错误 | |
| 6a | OP_RETURN | 终止脚本执行, 并标记交易无效, 用于存储数据 |
栈操作 (19)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 6b | OP_TOALTSTACK | 栈顶元素出栈, 并入备用栈 | |
| 6c | OP_FROMALTSTACK | 备用栈顶元素出栈, 并入栈 | |
| 6d | OP_2DROP | 栈顶 2 个元素出栈 | |
| 6e | OP_2DUP | 复制栈顶 2 个元素 | |
| 6f | OP_3DUP | 复制栈顶 3 个元素 | |
| 70 | OP_2OVER | 复制栈顶向下的第三和第四个元素, 并放入栈顶 | |
| 71 | OP_2ROT | 将栈顶向下的第五和第六个元素移动到栈顶 | |
| 72 | OP_2SWAP | 将栈顶向下的第三和第四个元素和第一和第二元素交换 | |
| 73 | OP_IFDUP | 如果栈顶元素非 0, 则复制栈顶元素 | |
| 74 | OP_DEPTH | 将栈中的元素数量入栈 | |
| 75 | OP_DROP | 栈顶元素出栈 | |
| 76 | OP_DUP | 复制栈顶元素 | |
| 77 | OP_NIP | 将栈顶元素下面的一个元素出栈 | |
| 78 | OP_OVER | 复制栈顶元素下面的一个元素并入栈 | |
| 79 | OP_PICK | 读取栈顶元素的值 n, 复制第 n + 1 元素到栈顶 | |
| 7a | OP_ROLL | 读取栈顶元素的值 n, 移动第 n + 1 元素到栈顶 | |
| 7b | OP_ROT | 栈顶 3 个元素位置轮转, 1 -> 2, 2 -> 3, 3 -> 1 | |
| 7c | OP_SWAP | 交换栈顶 2 个元素 | |
| 7d | OP_TUCK | 复制栈顶元素并插入到第二个元素下面 |
字符串 (5)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 7e | OP_CAT | 出栈 2 个元素, 将其拼接后入栈 | |
| 7f | OP_SUBSTR | 出栈 3 个元素, 分别表示 size、 begin、 string, 将 string 的 begin 位置开始的 size 长度的子串入栈 | |
| 80 | OP_LEFT | 出栈 2 个元素, 分别表示 size、 string, 将 string 的左边 size 长度的子串入栈 | |
| 81 | OP_RIGHT | 出栈 2 个元素, 分别表示 size、 string, 将 string 的右边 size 长度的子串入栈 | |
| 82 | OP_SIZE | 将栈顶元素的长度入栈 |
位运算 (8)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 83 | OP_INVERT | 出栈栈顶元素, 并按位取反后入栈 | |
| 84 | OP_AND | 出栈 2 个元素, 并按位与后入栈 | |
| 85 | OP_OR | 出栈 2 个元素, 并按位或后入栈 | |
| 86 | OP_XOR | 出栈 2 个元素, 并按位异或后入栈 | |
| 87 | OP_EQUAL | 出栈 2 个元素, 如果相等则入栈 1, 否则入栈 0 | |
| 88 | OP_EQUALVERIFY | 出栈 2 个元素, 如果相等则继续执行, 否则抛出错误 | |
| 89 | OP_RESERVED1 | 保留操作码, 执行到时会抛出错误 | |
| 8a | OP_RESERVED2 | 保留操作码, 执行到时会抛出错误 |
数学 (27)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| 8b | OP_1ADD | 出栈栈顶元素, 加 1 后入栈 | |
| 8c | OP_1SUB | 出栈栈顶元素, 减 1 后入栈 | |
| 8d | OP_2MUL | 出栈栈顶元素, 乘 2 后入栈 | |
| 8e | OP_2DIV | 出栈栈顶元素, 除 2 后入栈 | |
| 8f | OP_NEGATE | 出栈栈顶元素, 取反后入栈 | |
| 90 | OP_ABS | 出栈栈顶元素, 取绝对值后入栈 | |
| 91 | OP_NOT | 出栈栈顶元素, 如果为 0 则入栈 1, 否则入栈 0 | |
| 92 | OP_0NOTEQUAL | 出栈栈顶元素, 如果为 0 则入栈 0, 否则入栈 1 | |
| 93 | OP_ADD | 出栈 2 个元素, 相加后入栈 | |
| 94 | OP_SUB | 出栈 2 个元素, 相减后入栈 | |
| 95 | OP_MUL | 出栈 2 个元素, 相乘后入栈 | |
| 96 | OP_DIV | 出栈 2 个元素, 相除后入栈 | |
| 97 | OP_MOD | 出栈 2 个元素, 取模后入栈 | |
| 98 | OP_LSHIFT | 出栈 2 个元素 a 和 b, 将 a 左移 b 位后入栈 | |
| 99 | OP_RSHIFT | 出栈 2 个元素 a 和 b, 将 a 右移 b 位后入栈 | |
| 9a | OP_BOOLAND | 出栈 2 个元素, 如果都非 0 则入栈 1, 否则入栈 0 | |
| 9b | OP_BOOLOR | 出栈 2 个元素, 如果有一个非 0 则入栈 1, 否则入栈 0 | |
| 9c | OP_NUMEQUAL | 出栈 2 个元素, 如果数值相等则入栈 1, 否则入栈 0 | |
| 9d | OP_NUMEQUALVERIFY | - | |
| 9e | OP_NUMNOTEQUAL | 出栈 2 个元素, 如果数值不等则入栈 1, 否则入栈 0 | |
| 9f | OP_LESSTHAN | 出栈 2 个元素, 如果第二个元素小于第一个元素则入栈 1, 否则入栈 0 | |
| a0 | OP_GREATERTHAN | 出栈 2 个元素, 如果第二个元素大于第一个元素则入栈 1, 否则入栈 0 | |
| a1 | OP_LESSTHANOREQUAL | 出栈 2 个元素, 如果第二个元素小于等于第一个元素则入栈 1, 否则入栈 0 | |
| a2 | OP_GREATERTHANOREQUAL | 出栈 2 个元素, 如果第二个元素大于等于第一个元素则入栈 1, 否则入栈 0 | |
| a3 | OP_MIN | 出栈 2 个元素, 取最小值入栈 | |
| a4 | OP_MAX | 出栈 2 个元素, 取最大值入栈 | |
| a5 | OP_WITHIN | 出栈 3 个元素分别为 max、min、x, 如果 min <= x < max 则入栈 1, 否则入栈 0 |
密码学 (10)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| a6 | OP_RIPEMD160 | 出栈栈顶元素, 计算其 RIPEMD160 哈希值后入栈 | |
| a7 | OP_SHA1 | 出栈栈顶元素, 计算其 SHA1 哈希值后入栈 | |
| a8 | OP_SHA256 | 出栈栈顶元素, 计算其 SHA256 哈希值后入栈 | |
| a9 | OP_HASH160 | 出栈栈顶元素, 计算其 HASH160 哈希值后入栈 | |
| aa | OP_HASH256 | 出栈栈顶元素, 计算其 HASH256 哈希值后入栈 | |
| ab | OP_CODESEPARATOR | 将当前执行位置标记为一个分隔点 | |
| ac | OP_CHECKSIG | 出栈 2 个元素分别为签名和公钥, 验证签名是否由公钥签名, 如果验证通过则入栈 1, 否则入栈 0 | |
| ad | OP_CHECKSIGVERIFY | 出栈 2 个元素分别为签名和公钥, 验证签名是否由公钥签名, 验证通过则继续执行, 否则抛出错误 | |
| ae | OP_CHECKMULTISIG | 依次出栈公钥数量 m, m 个公钥、签名数量 n, n 个签名, 额外的值。 验证签名是否由 m 个公钥中的任意 n 个签名, 如果验证通过则入栈 1, 否则入栈 0 | |
| af | OP_CHECKMULTISIGVERIFY | 依次出栈公钥数量 m, m 个公钥、签名数量 n, n 个签名, 额外的值。 验证签名是否由 m 个公钥中的任意 n 个签名, 验证通过则继续执行, 否则抛出错误 |
其他 (80)
| 操作码 | 有效性 | 名称 | 描述 |
|---|---|---|---|
| b0 | OP_NOP1 | 保留操作码, 执行到时会抛出错误 | |
| b1 | OP_CHECKLOCKTIMEVERIFY | 检查栈顶元素是否大于等于交易的 locktime, 如果满足则继续执行, 否则抛出错误 | |
| b2 | OP_CHECKSEQUENCEVERIFY | 检查栈顶元素是否满足对应交易输入 sequence 值, 如果满足则继续执行, 否则抛出错误 | |
| b3 | OP_NOP4 | 保留操作码, 执行到时会抛出错误 | |
| b4 | OP_NOP5 | 保留操作码, 执行到时会抛出错误 | |
| b5 | OP_NOP6 | 保留操作码, 执行到时会抛出错误 | |
| b6 | OP_NOP7 | 保留操作码, 执行到时会抛出错误 | |
| b7 | OP_NOP8 | 保留操作码, 执行到时会抛出错误 | |
| b8 | OP_NOP9 | 保留操作码, 执行到时会抛出错误 | |
| b9 | OP_NOP10 | 保留操作码, 执行到时会抛出错误 | |
| ba | OP_CHECKSIGADD | 出栈 3 个元素分别为公钥、签名和整数 n, 验证签名是否有效, 如果验证通过,则入栈 n + 1, 否则入栈 n + 0 | |
| bb | OP_RETURN_187 | - | |
| bc | OP_RETURN_188 | - | |
| bd | OP_RETURN_189 | - | |
| be | OP_RETURN_190 | - | |
| bf | OP_RETURN_191 | - | |
| c0 | OP_RETURN_192 | - | |
| c1 | OP_RETURN_193 | - | |
| c2 | OP_RETURN_194 | - | |
| c3 | OP_RETURN_195 | - | |
| c4 | OP_RETURN_196 | - | |
| c5 | OP_RETURN_197 | - | |
| c6 | OP_RETURN_198 | - | |
| c7 | OP_RETURN_199 | - | |
| c8 | OP_RETURN_200 | - | |
| c9 | OP_RETURN_201 | - | |
| ca | OP_RETURN_202 | - | |
| cb | OP_RETURN_203 | - | |
| cc | OP_RETURN_204 | - | |
| cd | OP_RETURN_205 | - | |
| ce | OP_RETURN_206 | - | |
| cf | OP_RETURN_207 | - | |
| d0 | OP_RETURN_208 | - | |
| d1 | OP_RETURN_209 | - | |
| d2 | OP_RETURN_210 | - | |
| d3 | OP_RETURN_211 | - | |
| d4 | OP_RETURN_212 | - | |
| d5 | OP_RETURN_213 | - | |
| d6 | OP_RETURN_214 | - | |
| d7 | OP_RETURN_215 | - | |
| d8 | OP_RETURN_216 | - | |
| d9 | OP_RETURN_217 | - | |
| da | OP_RETURN_218 | - | |
| db | OP_RETURN_219 | - | |
| dc | OP_RETURN_220 | - | |
| dd | OP_RETURN_221 | - | |
| de | OP_RETURN_222 | - | |
| df | OP_RETURN_223 | - | |
| e0 | OP_RETURN_224 | - | |
| e1 | OP_RETURN_225 | - | |
| e2 | OP_RETURN_226 | - | |
| e3 | OP_RETURN_227 | - | |
| e4 | OP_RETURN_228 | - | |
| e5 | OP_RETURN_229 | - | |
| e6 | OP_RETURN_230 | - | |
| e7 | OP_RETURN_231 | - | |
| e8 | OP_RETURN_232 | - | |
| e9 | OP_RETURN_233 | - | |
| ea | OP_RETURN_234 | - | |
| eb | OP_RETURN_235 | - | |
| ec | OP_RETURN_236 | - | |
| ed | OP_RETURN_237 | - | |
| ee | OP_RETURN_238 | - | |
| ef | OP_RETURN_239 | - | |
| f0 | OP_RETURN_240 | - | |
| f1 | OP_RETURN_241 | - | |
| f2 | OP_RETURN_242 | - | |
| f3 | OP_RETURN_243 | - | |
| f4 | OP_RETURN_244 | - | |
| f5 | OP_RETURN_245 | - | |
| f6 | OP_RETURN_246 | - | |
| f7 | OP_RETURN_247 | - | |
| f8 | OP_RETURN_248 | - | |
| f9 | OP_RETURN_249 | - | |
| fa | OP_RETURN_250 | - | |
| fb | OP_RETURN_251 | - | |
| fc | OP_RETURN_252 | - | |
| fd | OP_RETURN_253 | - | |
| fe | OP_RETURN_254 | - | |
| ff | OP_INVALIDOPCODE | 无效操作码, 执行到时会抛出错误 |