script 总结
废话不多说,直接上干货,每一个脚本的中文翻译,可以当个词典查阅:
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_0,OP_FALSE |
0 |
0×00 |
无 |
空 |
一个字节空串被推到堆栈中(并非no-op操作,有一个元素压入堆栈) |
N/A |
1-75 |
0×01-0x4b |
(特殊) |
数据 |
下一个操作码字节是要被压入堆栈的数据 |
OP_PUSHDATA1 |
76 |
0x4c |
(特殊) |
数据 |
下一字节是要被压入堆栈的数据的长度 |
OP_PUSHDATA2 |
77 |
0x4d |
(特殊) |
数据 |
下两个字节是要被压入堆栈的数据的长度 |
OP_PUSHDATA4 |
78 |
0x4e |
(特殊) |
数据 |
下四个字节是要被压入堆栈的数据的长度 |
OP_1NEGATE |
79 |
0x4f |
无 |
-1 |
数字-1被压入堆栈 |
OP_1,OP_TRUE |
81 |
0×51 |
无 |
1 |
数字1被压入堆栈 |
OP_2-OP_16 |
82-96 |
0×52-0×60 |
无 |
2-16 |
与关键名相对应的数字被压入堆栈 |
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_NOP |
97 |
0×61 |
无 |
无 |
无任何操作 |
OP_IF |
99 |
0×63 |
<expression> if [statements] [else [statements]]* endif |
|
如果栈项元素值不为0,语句将被执行,栈项元素值被删除。 |
OP_NOTIF |
100 |
0×64 |
<expression> if [statements] [else [statements]]* endif |
|
如果栈项元素值为0,语句将被执行,栈项元素值被删除。 |
OP_ELSE |
103 |
0×67 |
<expression> if [statements] [else [statements]]* endif |
|
如果前述的OP_IF或 OP_NOTIF或OP_ELSE 未被执行,这些语句就会被执行;如果前述的OP_IF或 OP_NOTIF或OP_ELSE被执行,这些语句就不会被执行 |
OP_ENDIF |
104 |
0×68 |
<expression> if [statements] [else [statements]]* endif |
|
结束if/else语言块 |
OP_VERIFY |
105 |
0×69 |
True / false |
无 / False |
如果栈项元素值非真,则标记交易无效。True会被删除,False不会被删除。 |
OP_RETURN |
106 |
0x6a |
无 |
无 |
标记交易无效 |
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_TOALTSTACK |
107 |
0x6b |
x1 |
(alt)x1 |
把输入压入辅堆栈的项部,从主堆栈删除。 |
OP_FROMALTSTACK |
108 |
0x6c |
(alt)x1 |
x1 |
把输入压入主堆栈的项部,从辅堆栈删除。 |
OP_IFDUP |
115 |
0×73 |
x |
x / x x |
如果栈项元素值不为0,复制该元素值 |
OP_DEPTH |
116 |
0×74 |
无 |
<堆栈大小> |
把堆栈元素个数压入堆栈 |
OP_DROP |
117 |
0×75 |
x |
无 |
删除栈顶元素 |
OP_DUP |
118 |
0×76 |
x |
x x |
复制栈顶元素 |
OP_NIP |
119 |
0×77 |
x1 |
x2 x2 |
删除栈顶的下一个元素 |
OP_OVER |
120 |
0×78 |
x1 x2 |
x1 x2 x1 |
复制栈顶的下一个元素到栈顶 |
OP_PICK |
121 |
0×79 |
xn … x2 x1 x0 <n> |
xn … x2 x1 x0 xn |
把堆栈的第n个元素拷贝到栈顶 |
OP_ROLL |
122 |
0x7a |
xn … x2 x1 x0 <n> |
… x2 x1 x0 xn |
把堆栈的第n个元素移动到栈顶 |
OP_ROT |
123 |
0x7b |
x1 x2 x3 |
x2 x3 x1 |
栈顶的三个元素向左翻转 |
OP_SWAP |
124 |
0x7c |
x1 x2 |
x2 x1 |
栈顶的两个元素交换 |
OP_TUCK |
125 |
0x7d |
x1 x2 |
x2 x1 x2 |
把栈顶元素拷贝并插入到栈顶下一个元素之后。注意:原文为“插入到栈顶下一个元素之前”,可能有误,翻译时改为“之后” |
OP_2DROP |
109 |
0x6d |
x1 x2 |
无 |
删除栈顶两个元素 |
OP_2DUP |
110 |
0x6e |
x1 x2 |
x1 x2 x1 x2 |
复制栈顶两个元素 |
OP_3DUP |
111 |
0x6f |
x1 x2 x3 |
x1 x2 x3 x1 x2 x3 |
复制栈顶三个元素 |
OP_2OVER |
112 |
0×70 |
x1 x2 x3 x4 |
x1 x2 x3 x4 x1 x2 |
把栈底的两个元素拷贝到栈顶 |
OP_2ROT |
113 |
0×71 |
x1 x2 x3 x4 x5 x6 |
x3 x4 x5 x6 x1 x2 |
以一对元素为单位,向左翻转。注意:原文大意“把第五和第六元素移动到栈顶”,明显有误 |
OP_2SWAP |
114 |
0×72 |
x1 x2 x3 x4 |
x3 x4 x1 x2 |
以一对元素为单位,交换栈顶的两对元素的位置。 |
如果标记为已禁用的操作码出现在交易中,必须终止和失败返回。
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_CAT |
126 |
0x7e |
x1 x2 |
out |
连接两个字符串,已禁用 |
OP_SUBSTR |
127 |
0x7f |
in begin size |
out |
返回字符串的一部分,已禁用 |
OP_LEFT |
128 |
0×80 |
in size |
out |
在一个字符串中保留左边指定长度的子串,已禁用 |
OP_RIGHT |
129 |
0×81 |
in size |
out |
在一个字符串中保留右边指定长度的子串,已禁用 |
OP_SIZE |
130 |
0×82 |
in |
in size |
把栈顶元素的字符串长度压入堆栈(无需弹出元素) |
如果标记为已禁用的操作码出现在交易中,必须终止和失败返回。
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_INVERT |
131 |
0×83 |
in |
out |
所有输入的位取反,已禁用. |
OP_AND |
132 |
0×84 |
x1 x2 |
out |
对输入的所有位进行布尔与运算,已禁用 |
OP_OR |
133 |
0×85 |
x1 x2 |
out |
对输入的每一位进行布尔或运算,已禁用 |
OP_XOR |
134 |
0×86 |
x1 x2 |
out |
对输入的每一位进行布尔异或运算,已禁用 |
OP_EQUAL |
135 |
0×87 |
x1 x2 |
True/false |
如果输入的两个数相等,返回1,否则返回0。 |
OP_EQUALVERIFY |
136 |
0×88 |
x1 x2 |
True/false |
与OP_EQUAL一样,之后运行OP_VERIFY 。 |
注意:算术逻辑的输入限于有符号32位长整数,但输出有可能会溢出。
如果任何命令的输入值长度超过4字节,脚本必须中止和失败返回。如果标记为已禁用的操作码出现在交易中,也必须终止和失败返回
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_1ADD |
139 |
0x8b |
in |
out |
输入值加1 |
OP_1SUB |
140 |
0x8c |
in |
out |
输入值减1 |
OP_2MUL |
141 |
0x8d |
in |
out |
输入值乘2,已禁用 |
OP_2DIV |
142 |
0x8e |
in |
out |
输入值除2,已禁用 |
OP_NEGATE |
143 |
0x8f |
in |
out |
输入值符号取反 |
OP_ABS |
144 |
0×90 |
in |
out |
输入值符号取正 |
OP_NOT |
145 |
0×91 |
in |
out |
如果输入值为0或1,则输出1或0;否则输出0。I |
OP_0NOTEQUAL |
146 |
0×92 |
in |
out |
输入值为0输出0;否则输出1。 |
OP_ADD |
147 |
0×93 |
a b |
out |
输出a+b |
OP_SUB |
148 |
0×94 |
a b |
out |
输出a-b |
OP_MUL |
149 |
0×95 |
a b |
out |
输出a*b,已禁用 |
OP_DIV |
150 |
0×96 |
a b |
out |
输出a/b, 已禁用 |
OP_MOD |
151 |
0×97 |
a b |
out |
输出a/b的余数,已禁用 |
OP_LSHIFT |
152 |
0×98 |
a b |
out |
把a向左移动b位,保留符号,已禁用 |
OP_RSHIFT |
153 |
0×99 |
a b |
out |
把a向右移动b位,保留符号,已禁用 |
OP_BOOLAND |
154 |
0x9a |
a b |
out |
如果a和b都不为0,输出1,否则输出0 |
OP_BOOLOR |
155 |
0x9b |
a b |
out |
如果a或b不为0,输出1,否则输出0 |
OP_NUMEQUAL |
156 |
0x9c |
a b |
out |
如果a=b则输出1,否则输出0。 |
OP_NUMEQUALVERIFY |
157 |
0x9d |
a b |
out |
与OP_NUMEQUAL一样,之后要运行OP_VERIFY |
OP_NUMNOTEQUAL |
158 |
0x9e |
a b |
out |
如果a!=b则输出1,否则输出0。 |
OP_LESSTHAN |
159 |
0x9f |
a b |
out |
如果a<b则输出1,否则输出0。 |
OP_GREATERTHAN |
160 |
0xa0 |
a b |
out |
如果a>b则输出1,否则输出0。 |
OP_LESSTHANOREQUAL |
161 |
0xa1 |
a b |
out |
如果a<=b则输出1,否则输出0 |
OP_GREATERTHANOREQUAL |
162 |
0xa2 |
a b |
out |
如果a>=b则输出1,否则输出0 |
OP_MIN |
163 |
0xa3 |
a b |
out |
输出a,b中的最小值 |
OP_MAX |
164 |
0xa4 |
a b |
out |
输出a,b中的最大值 |
OP_WITHIN |
165 |
0xa5 |
x min max |
out |
如果x在min和max之间,则输出1,否则输出 |
关键字 |
操作码 |
十六进制 |
输入 |
输出 |
描述 |
OP_RIPEMD160 |
166 |
0xa6 |
in |
hash |
输入用RIPEMD-160算法HASH |
OP_SHA1 |
167 |
0xa7 |
in |
hash |
输入用SHA-1算法HASH. |
OP_SHA256 |
168 |
0xa8 |
in |
hash |
输入用SHA-256算法HASH. |
OP_HASH160 |
169 |
0xa9 |
in |
hash |
输入被HASH两次,先用 SHA-256,再用 RIPEMD-160. |
OP_HASH256 |
170 |
0xaa |
in |
hash |
输入用SHA-256算法HASH两次. |
OP_CODESEPARATOR |
171 |
0xab |
无 |
无 |
所有签名检查只需匹配最近一次执行的OP_CODESEPARATOR 操作数据的签名即可。 |
OP_CHECKSIG |
172 |
0xac |
sig pubkey |
True / false |
全部交易的输出、输入和脚本(从最近执行的OP_CODESEPARATOR操作到最)都被HASH,OP_CHECKSIG使用的签名必须是该HASH值和公钥的有效签名,如果是真则返回1,否则返回0。 |
OP_CHECKSIGVERIFY |
173 |
0xad |
sig pubkey |
True / false |
与OP_CHECKSIG一样,但之后执行 OP_VERIFY |
OP_CHECKMULTISIG |
174 |
0xae |
x sig1 sig2 … <number of signatures> pub1 pub2 <number of public keys> |
True / False |
对于每个签名和公钥对,OP_CHECKSIG 都会被执行,如果公钥列得比签名多,一些公钥/签名对会失败。所有的签名要与公钥匹配。如果所有签名有效,输出1,否则返回0。因为存在BUG,一个未使用的外部值会从堆栈中删除。 |
OP_CHECKMULTISIGVERIFY |
175 |
0xaf |
x sig1 sig2 … <number of signatures> pub1 pub2 … <number of public keys> |
True / False |
与 OP_CHECKMULTISIG,一样,但是之后运行 OP_VERIFY。 |
这些关键字仅供内部使用,用辅助进行交易匹配,如果使用在实际的交易中则是无效的。
关键字 |
操作码 |
十六进制 |
描述 |
OP_PUBKEYHASH |
253 |
0xfd |
表示公钥用OP_HASH160操作码HASH |
OP_PUBKEY |
254 |
0xfe |
表示与OP_CHECKSIG.兼容的一个公钥 |
OP_INVALIDOPCODE |
255 |
0xff |
匹配任何未指定的操作码 |
关键字 |
操作码 |
十六进制 |
描述 |
OP_RESERVED |
80 |
0×50 |
交易无效,除非发生在未执行的OP_IF 分支 |
OP_VER |
98 |
0×62 |
交易无效,除非发生在未执行的OP_IF 分支 |
OP_VERIF |
101 |
0×65 |
交易无效,即使发生在未执行的OP_IF 分支 |
OP_VERNOTIF |
102 |
0×66 |
交易无效,即使发生在未执行的OP_IF 分支 |
OP_RESERVED1 |
137 |
0×89 |
交易无效,除非发生在未执行的OP_IF 分支 |
OP_RESERVED2 |
138 |
0x8a |
交易无效,除非发生在未执行的OP_IF 分支 |
OP_NOP1-OP_NOP10 |
176-185 |
0xb0-0xb9 |
这些关键字被忽略 |
本文由Copernicus 团队 冉小龙
总结,转载无需授权。