比特币中的脚本用于定义和验证花费 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 | 无效操作码, 执行到时会抛出错误 |