深入技术
脚本

脚本

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