Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

比特币交易脚本语言操作符,常量和符号

下面的内容是读懂比特币脚本的关键

原内容来源于Opcodes used in Bitcoin Script - Bitcoin WikiScript - Bitcoin Wiki 基于CC3.0在原作的基础上已经被修订和更新。中文翻译来自MasterBitcoin2CN 基于 CC BY-SA 4.0 做了修订和更新

这里是所有 比特币脚本操作符,也称为关键词、命令或函数。False 是零或负零(使用了任意数量的字节)或空数组,而 True 是其他任何东西。

常量

符号值 (十六进制)输入输出描述
OP_0 or OP_FALSE0x00Nothing(empty value)把一个空的字节压入堆栈
1-750x01-0x4b(special)data把接下来的N 个字节压入堆栈中,N 的取值在1 到75 之间
OP_PUSHDATA10x4c(special)data下一个字节包括数字N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA20x4d(special)data下面两个字节包括数字N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA40x4e(special)data下面四个字节包括数字N,会将接下来的N 个字节压入堆栈
OP_1NEGATE0x4fNothing-1将数字-1 压入堆栈
OP_1 or OP_TRUE0x51Nothing1将数字1 压入堆栈
OP_2 to OP_160x52 to 0x60Nothing2-16将数字N 压入堆栈,例如OP_2 压入数字2

程序流控制操作符

符号值 (十六进制)输入输出描述
OP_NOP0x61NothingNothing无操作
OP_VER0x62NothingProtocol version将此事务所依据的协议版本放到堆栈上。(此操作码计划在Chronicle版本中重新启用)
OP_IF0x63如果栈项元素值不为FALSE,在IF和ELSE之间的语句将被执行。如果如果栈项元素值为FALSE,在ELSE和ENDIF之间的语句将被执行。栈顶元素被删除。 IF [statements>ELSE [statements]ENDIF
OP_NOTIF0x64如果栈项元素值为FALSE,在IF和ELSE之间的语句将被执行。如果如果栈项元素值不为FALSE,在ELSE和ENDIF之间的语句将被执行。栈顶元素被删除。 IF [statements>ELSE [statements]ENDIF
OP_VERIF0x65如果栈项元素值等于交易执行时的协议版本,在IF和ELSE之间的语句将被执行。如果如果栈项元素值不等于交易执行时的协议版本,在ELSE和ENDIF之间的语句将被执行。栈顶元素被删除。(此操作码计划在Chronicle版本中重新启用)  IF [statements>ELSE [statements]ENDIF
OP_VERNOTIF0x66如果栈项元素值不等于交易执行时的协议版本,在IF和ELSE之间的语句将被执行。如果如果栈项元素值等于交易执行时的协议版本,在ELSE和ENDIF之间的语句将被执行。栈顶元素被删除。(此操作码计划在Chronicle版本中重新启用)  IF [statements>ELSE [statements]ENDIF
OP_ELSE0x67如果前述的OP_IF 或OP_NOTIF 或OP_ELSE 未被执行,这些语句就会被执行
OP_ENDIF0x68终止OP_IF, OP_NOTIF, OP_ELSE 区块
OP_VERIFY0x69True / FalseNothing / Fail如果栈项元素值非真,则标记交易无效。栈顶元素被删除。
OP_RETURN0x6aNothing结束脚本。栈顶元素是脚本最终结果OP_ Return 还可用于创建“ False Return”输出,其中 scriptPubKey 由 OP_FALE OP _RETURN 和数据组成。这样的输出是不可花费的,并且应该给出一个零Satoshi值。可以从 UTXO数据集存储中删除这些输出,从而减小大小。目前BitcoinSV 网络支持在给定交易中包含多个 FALSE RETURN 输出,最初每个输出可以容纳100KB 的数据。在2020年创世升级之后,根据矿工的设置可包含任何大小的数据。

堆栈操作符

符号值 (十六进制)输入输出描述
OP_TOALTSTACK0x6bx1(alt)x1从主堆栈中取出元素,推入辅堆栈。
OP_FROMALTSTACK0x6c(alt)x1x1从辅堆栈中取出元素,推入主堆栈
OP_2DROP0x6dx1 x2Nothing移除栈顶两个元素
OP_2DUP0x6ex1 x2x1 x2 x1 x2复制栈顶两个元素
OP_3DUP0x6fx1 x2 x3x1 x2 x3 x1 x2 x3复制栈顶三个元素
OP_2OVER0x70x1 x2 x3 x4x1 x2 x3 x4 x1 x2把栈底的第三、第四个元素拷贝到栈顶
OP_2ROT0x71x1 x2 x3 x4 x5 x6x3 x4 x5 x6 x1 x2移动第五、第六元素到栈顶
OP_2SWAP0x72x1 x2 x3 x4x3 x4 x1 x2将栈顶的两个元素进行交换
OP_IFDUP0x73xx / x x如果栈项元素值不为0,复制该元素值
OP_DEPTH0x74Nothing计算堆栈元素的数量,并将值放置在堆栈顶部
OP_DROP0x75xNothing删除栈顶元素
OP_DUP0x76xx x复制栈顶元素
OP_NIP0x77x1 x2x2删除栈顶的下一个元素
OP_OVER0x78x1 x2x1 x2 x1复制栈顶的下一个元素到栈顶
OP_PICK0x79xn … x2 x1 x0 xn … x2 x1 x0 xn把堆栈的第n 个元素拷贝到栈顶
OP_ROLL0x7axn … x2 x1 x0 … x2 x1 x0 xn把堆栈的第n 个元素移动到栈顶
OP_ROT0x7bx1 x2 x3x2 x3 x1翻转栈顶的三个元素
OP_SWAP0x7cx1 x2x2 x1栈顶的三个元素交换
OP_TUCK0x7dx1 x2x2 x1 x2拷贝栈顶元素并插入到栈顶第二个元素之后

字符串操作

符号值 (十六进制)输入输出描述
OP_CAT0x7ex1 x2out连接两个字符串
OP_SPLIT0x7fx nx1 x2在位置 n 处拆分字节序列 x
OP_NUM2BIN0x80a bout将数值 a 转换为长度为 b 的字节序列
OP_BIN2NUM0x81xout将字节序列 x 转换为数值
OP_SIZE0x82inin size把栈顶元素的字符串长度压入堆栈(原字符串不出栈)

二进制算术和条件

符号值 (十六进制)输入输出描述
OP_INVERT0x83inout所有输入的位取反,已禁用
OP_AND0x84x1 x2out对输入的所有位进行布尔与运算,已禁用
OP_OR0x85x1 x2out对输入的每一位进行布尔或运算,已禁用
OP_XOR0x86x1 x2out对输入的每一位进行布尔异或运算,已禁用
OP_EQUAL0x87x1 x2True / false如果输入的两个数相等,返回1,否则返回0
OP_EQUALVERIFY0x88x1 x2Nothing / fail与OP_EQUAL 一样,如结果为0,之后运行OP_VERIFY

数值操作

注意: 算术输入仅限于有符号的32位整数,但可能会溢出。如果这些命令的任何输入值超过4字节,脚本必须中止并失败。

符号值 (十六进制)输入输出描述
OP_1ADD0x8binout栈顶值加1
OP_1SUB0x8cinout栈顶值减1
OP_2MUL0x8dinout栈顶值乘2(此操作码计划在Chronicle版本中重新启用)
OP_2DIV0x8einout栈顶值除2
OP_NEGATE0x8finout栈顶值符号取反
OP_ABS0x90inout栈顶值符号取正
OP_NOT0x91inout如果栈顶值为0 或1,则输出1或0;否则输出0
OP_0NOTEQUAL0x92inout输入值为0 输出0;否则输出1
OP_ADD0x93a bout弹出栈顶的两个元素,压入二者相加结果 b+a
OP_SUB0x94a bout弹出栈顶的两个元素,压入二者相减(第二项减去第一项)结果 b-a
OP_MUL0x95a bout栈顶两项的积
OP_DIV0x96a bout输出用第二项除以第一项的倍数
OP_MOD0x97a bout输出用第二项除以第一项得到的余数
OP_LSHIFT0x98a bout左移第二项,移动位数为第一项的二进制位数, 无视符号
OP_RSHIFT0x99a bout右移第二项,移动位数为第一项的二进制位数,无视符号
OP_BOOLAND0x9aa bout布尔与运算,两项都不为0,输出1,否则输出0
OP_BOOLOR0x9ba bout布尔或运算,两项有一个不为0,输出1,否则输出0
OP_NUMEQUAL0x9ca bout两项相等则输出1,否则输出为0
OP_NUMEQUALVERIFY0x9da bNothing / fail与NUMEQUAL 相同,如结果为0, 运行OP_VERIFY
OP_NUMNOTEQUAL0x9ea bout如果栈顶两项不是相等数的话,则输出1,否则输出为0
OP_LESSTHAN0x9fa bout如果第二项小于栈顶项,则输出1,否则输出为0  a<b
OP_GREATERTHAN0xa0a bout如果第二项大于栈顶项,则输出1 a>b
OP_LESSTHANOREQUAL0xa1a bout如果第二项小于或等于第一项,则输出1 a<=b
OP_GREATERTHANOREQUAL0xa2a bout如果第二项大于或等于第一项,则输出1 a>=b
OP_MIN0xa3a bout输出栈顶两项中较小的一项
OP_MAX0xa4a bout输出栈顶两项中较大的一项
OP_WITHIN0xa5a bout如果第三项的数值介于前两项之间,则输出1,否则输出为0

加密和散列操作

符号值 (十六进制)输入输出描述
OP_RIPEMD1600xa6inhash返回栈顶元素的RIPEMD160 哈希值
OP_SHA10xa7inhash返回栈顶元素SHA1 哈希值
OP_SHA2560xa8inhash返回栈顶元素SHA256 哈希值
OP_HASH1600xa9inhash栈顶元素进行两次HASH,先用SHA-256,再用RIPEMD-160
OP_HASH2560xaainhash栈顶元素用SHA-256 算法HASH 两次
OP_CODESEPARATOR0xabNothingNothing标记已进行签名验证的数据。All of the signature checking words will only match signatures to the data after the most recently-executed OP_CODESEPARATOR.
OP_CHECKSIG0xacsig pubkeyTrue / false交易用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1,否则为0。整个事务的输出、输入和脚本(从最近执行的 op_codeseparator 到最后)都取哈希值。Op_checksig 使用的签名必须是此哈希值。
OP_CHECKSIGVERIFY0xadsig pubkeyNothing / fail与CHECKSIG 一样,但之后运行OP_VERIFY
OP_CHECKMULTISIG0xaex sig1 sig2 … pub1 pub2 True / False对于每对签名和公钥运行CHECKSIG。所有的签名要与公钥匹配。实现中存在一个BUG,会从堆栈中弹出一个前缀为OP_0的值。如果公钥无法进行任何签名比较,就不会再次检查它们,所以必须使用与它们相应的公钥在 scriptPubKey 或 redeemScript 中相同的顺序将签名放在 scriptSig 中。如果所有签名都有效,则返回1,否则返回0。
OP_CHECKMULTISIGVERIFY0xafx sig1 sig2 … pub1 pub2 … Nothing / fail与CHECKMULTISIG 一样,但之后运行OP_VERIFY

用过的NOP操作符

在比特币的历史上,有操作码使用过保留的 NO_NOP 操作码标识符。现在这些操作码已经恢复到最初的无操作功能。

符号值 (十六进制)输入输出描述
OP_NOP2(之前是OP_CHECKLOCKTIMEVERIFY)0xb1Nothing(之前是 x)Nothing(之前是 x或fail)无操作忽略 ( 之前的语义在 bip0065中进行了描述)
OP_NOP3(之前是 OP_CHECKSEQUENCEVERIFY)0xb2Nothing(之前是 x)Nothing(之前是 x或fail)无操作忽略( 之前的语义在 bip0112中进行了描述)

伪关键词

这些关键词在内部用于协助交易匹配。如果在实际脚本中使用它们则无效。

符号值 (十六进制)描述
OP_PUBKEYHASH0xfd表示OP_HASH160哈希的公钥
OP_PUBKEY0xfe表示与OP_CHECKSIG兼容的公钥
OP_INVALIDOPCODE0xff代表当前未指定的操作码

保留操作符

未分配的任何操作码也被保留。使用未分配的操作码会导致交易无效。

符号值 (十六进制)描述
OP_RESERVED0x50除非放在未执行的 OP_IF 分支中,否则交易无效
OP_RESERVED10x89除非放在未执行的 OP_IF 分支中,否则交易无效
OP_RESERVED20x8a除非放在未执行的 OP_IF 分支中,否则交易无效
OP_NOP1, OP_NOP4-OP_NOP100xb0, 0xb3-0xb9忽略该操作符。不将交易标记为无效。

中文版BSV WikiBitcoinSV修订版《精通比特币》同步更新中

使用NoteSV体验比特币带来的永世安全

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 喵的Unity游戏开发之路 - 搭便车:移动地面

下一篇: 【数据结构与算法】详解什么是哈希表,并用代码手动实现一个哈希表

精华推荐