1.21 附录B 交易脚本的操作符、常量和符号

优质
小牛编辑
128浏览
2023-12-01

以下的表和描述参见https://en.bitcoin.it/wiki/Script

表1.脚本压入堆栈

符号值 (十六进制)描述
OP_0 or OP_FALSE0x00一个字节空串被压入堆栈中
1-750x01-0x4b把接下来的N 个字节压入堆栈中,N 的取值在1 到75 之间
OP_PUSHDATA10x4c下一个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA20x4d下两个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA40x4e下四个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_1NEGATE0x4f将脚本-1 压入堆栈
OP_RESERVED0x50终止- 交易无效(除非在未执行的OP_IF语句中)
OP_1 or OP_TRUE0x51将脚本1 压入堆栈
OP_2 to OP_160x52 to 0x60将脚本N 压入堆栈,例如OP_2 压入脚本“2”

表2.有条件的流控制的操作符

符号值 (十六进制)描述
OP_NOP0x61无操作
OP_VER0x62终止- 交易无效(除非在未执行的OP_IF 语句中)
OP_IF0x63如果栈项元素值为0,语句将被执行
OP_NOTIF0x64如果栈项元素值不为0,语句将被执行
OP_VERIF0x65终止- 交易无效
OP_VERNOTIF0x66终止- 交易无效
OP_ELSE0x67如果前述的OP_IF 或OP_NOTIF 或OP_ELSE 未被执行,这些语句就会被执行
OP_ENDIF0x68终止OP_IF, OP_NOTIF, OP_ELSE 区块
OP_VERIFY0x69如果栈项元素值非真,则标记交易无效
OP_RETURN0x6a标记交易无效

表3.时间锁操作符

符号值 (十六进制)描述
OP_CHECKLOCKTIMEVERIFY (previously OP_NOP2)0xb1如果栈顶元素比交易锁定时间字段大,则将交易标记为无效。否则脚本评测将像OP_NOP操作一样继续执行。交易在一下4种之一的情况下是无效的:1.堆栈是空的;2.栈顶元素是负数;3.当交易锁定时间字段值少于500000000时,栈顶元素大于等于500000000,反之亦然;4.输入序列字段等于0xffffffff。具体内容详见BIP-65。
OP_CHECKSEQUENCEVERIFY (previously OP_NOP3)0xb2如果输入值(BIP 0068强制规定的顺序)的相对锁定时间不等于或多于栈顶元素值时,将交易标记为无效。具体内容详见BIP-112。

表4.堆栈操作符

符号值 (十六进制)描述
OP_TOALTSTACK0x6b从主堆栈中取出元素,推入辅堆栈。
OP_FROMALTSTACK0x6c从辅堆栈中取出元素,推入主堆栈
OP_2DROP0x6d移除栈顶两个元素
OP_2DUP0x6e复制栈顶两个元素
OP_3DUP0x6f复制栈顶三个元素
OP_2OVER0x70把栈底的第三、第四个元素拷贝到栈顶
OP_2ROT0x71移动第五、第六元素到栈顶
OP_2SWAP0x72将栈顶的两个元素进行交换
OP_IFDUP0x73如果栈项元素值不为0,复制该元素值
OP_DEPTH0x74Count the items on the stack and push the resulting count
OP_DROP0x75删除栈顶元素
OP_DUP0x76复制栈顶元素
OP_NIP0x77删除栈顶的下一个元素
OP_OVER0x78复制栈顶的下一个元素到栈顶
OP_PICK0x79把堆栈的第n 个元素拷贝到栈顶
OP_ROLL0x7a把堆栈的第n 个元素移动到栈顶
OP_ROT0x7b翻转栈顶的三个元素
OP_SWAP0x7c栈顶的三个元素交换
OP_TUCK0x7d拷贝栈顶元素并插入到栈顶第二个元素之后

表5.字符串接操作

符号值 (十六进制)描述
OP_CAT0x7e连接两个字符串,已禁用
OP_SUBSTR0x7f返回字符串的一部分,已禁用
OP_LEFT0x80在一个字符串中保留左边指定长度的子串,已禁用
OP_RIGHT0x81在一个字符串中保留右边指定长度的子串,已禁用
OP_SIZE0x82把栈顶元素的字符串长度压入堆栈

表6.二进制算术和条件

符号值 (十六进制)描述
OP_INVERT0x83所有输入的位取反,已禁用
OP_AND0x84对输入的所有位进行布尔与运算,已禁用
OP_OR0x85对输入的每一位进行布尔或运算,已禁用
OP_XOR0x86对输入的每一位进行布尔异或运算,已禁用
OP_EQUAL0x87如果输入的两个数相等,返回1,否则返回0
OP_EQUALVERIFY0x88与OP_EQUAL 一样,如结果为0,之后运行OP_VERIFY
OP_RESERVED10x89终止- 无效交易(除非在未执行的OP_IF 语句中)
OP_RESERVED20x8a终止-无效交易(除非在未执行的OP_IF 语句中)

表7.数值操作

符号值 (十六进制)描述
OP_1ADD0x8b栈顶值加1
OP_1SUB0x8c栈顶值减1
OP_2MUL0x8d无效(栈顶值乘2)
OP_2DIV0x8e无效(栈顶值除2)
OP_NEGATE0x8f栈顶值符号取反
OP_ABS0x90栈顶值符号取正
OP_NOT0x91如果栈顶值为0 或1,则输出1或0;否则输出0
OP_0NOTEQUAL0x92输入值为0 输出0;否则输出1
OP_ADD0x93弹出栈顶的两个元素,压入二者相加结果
OP_SUB0x94弹出栈顶的两个元素,压入二者相减(第二项减去第一项)结果
OP_MUL0x95禁用(栈顶两项的积)
OP_DIV0x96禁用(输出用第二项除以第一项的倍数)
OP_MOD0x97禁用(输出用第二项除以第一项得到的余数)
OP_LSHIFT0x98禁用(左移第二项,移动位数为第一项的二进制位数)
OP_RSHIFT0x99禁用(右移第二项,移动位数为第一项的二进制位数)
OP_BOOLAND0x9a布尔与运算,两项都不为0,输出1,否则输出0
OP_BOOLOR0x9b布尔或运算,两项有一个不为0,输出1,否则输出0
OP_NUMEQUAL0x9c两项相等则输出1,否则输出为0
OP_NUMEQUALVERIFY0x9d与NUMEQUAL 相同,如结果为0运行OP_VERIFY
OP_NUMNOTEQUAL0x9e如果栈顶两项不是相等数的话,则输出1
OP_LESSTHAN0x9f如果第二项小于栈顶项,则输出1
OP_GREATERTHAN0xa0如果第二项大于栈顶项,则输出1
OP_LESSTHANOREQUAL0xa1如果第二项小于或等于第一项,则输出1
OP_GREATERTHANOREQUAL0xa2如果第二项大于或等于第一项,则输出1
OP_MIN0xa3输出栈顶两项中较小的一项
OP_MAX0xa4输出栈顶两项中较大的一项
OP_WITHIN0xa5如果第三项的数值介于前两项之间,则输出1

表8.加密和散列操作

符号值 (十六进制)描述
OP_RIPEMD1600xa6返回栈顶项的RIPEMD160 哈希值
OP_SHA10xa7返回栈顶项SHA1 哈希值
OP_SHA2560xa8返回栈顶项SHA256 哈希值
OP_HASH1600xa9栈顶项进行两次HASH,先用SHA-256,再用RIPEMD-160
OP_HASH2560xaa栈顶项用SHA-256 算法HASH 两次
OP_CODESEPARATOR0xab标记已进行签名验证的数据
OP_CHECKSIG0xac交易所用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1
OP_CHECKSIGVERIFY0xad与CHECKSIG 一样,但之后运行OP_VERIFY
OP_CHECKMULTISIG0xae对于每对签名和公钥运行CHECKSIG。所有的签名要与公钥匹配。实现中存在一个BUG,会从堆栈中弹出一个前缀为OP_0的值。
OP_CHECKMULTISIGVERIFY0xaf与CHECKMULTISIG 一样,但之后运行OP_VERIFY

表9.非操作符

符号值 (十六进制)描述
OP_NOP1-OP_NOP100xb0-0xb9无操作忽略

表10.仅供内部使用的保留关键字

符号值 (十六进制)描述
OP_SMALLDATA0xf9代表小数据域
OP_SMALLINTEGER0xfa代表小整数数据域
OP_PUBKEYS0xfb代表公钥域
OP_PUBKEYHASH0xfd代表公钥哈希域
OP_PUBKEY0xfe代表公钥域
OP_INVALIDOPCODE0xff代表当前未指定的操作码