区块链技术

blockchain script 中文描述

2018-01-08  本文已影响37人  wolf4j

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 团队 冉小龙 总结,转载无需授权。

上一篇下一篇

猜你喜欢

热点阅读