本文主要是介绍blockchain script 中文描述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 | 这些关键字被忽略 |
作者:wolf4j
链接:https://www.jianshu.com/p/169714d4449b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这篇关于blockchain script 中文描述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!