附录B、交易脚本语言操作符,常量和符号
以下的表和描述参见https://en.bitcoin.it/wiki/Script
表1.脚本压入堆栈
OP_0 or OP_FALSE
0x00
一个字节空串被压入堆栈中
1-75
0x01-0x4b
把接下来的N 个字节压入堆栈中,N 的取值在1 到75 之间
OP_PUSHDATA1
0x4c
下一个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA2
0x4d
下两个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_PUSHDATA4
0x4e
下四个脚本字节包括N,会将接下来的N 个字节压入堆栈
OP_1NEGATE
0x4f
将脚本-1 压入堆栈
OP_RESERVED
0x50
终止- 交易无效(除非在未执行的OP_IF语句中)
OP_1 or OP_TRUE
0x51
将脚本1 压入堆栈
OP_2 to OP_16
0x52 to 0x60
将脚本N 压入堆栈,例如OP_2 压入脚本“2”
表2.有条件的流控制的操作符
OP_NOP
0x61
无操作
OP_VER
0x62
终止- 交易无效(除非在未执行的OP_IF 语句中)
OP_IF
0x63
如果栈项元素值为0,语句将被执行
OP_NOTIF
0x64
如果栈项元素值不为0,语句将被执行
OP_VERIF
0x65
终止- 交易无效
OP_VERNOTIF
0x66
终止- 交易无效
OP_ELSE
0x67
如果前述的OP_IF 或OP_NOTIF 或OP_ELSE 未被执行,这些语句就会被执行
OP_ENDIF
0x68
终止OP_IF, OP_NOTIF, OP_ELSE 区块
OP_VERIFY
0x69
如果栈项元素值非真,则标记交易无效
OP_RETURN
0x6a
标记交易无效
表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_TOALTSTACK
0x6b
从主堆栈中取出元素,推入辅堆栈。
OP_FROMALTSTACK
0x6c
从辅堆栈中取出元素,推入主堆栈
OP_2DROP
0x6d
移除栈顶两个元素
OP_2DUP
0x6e
复制栈顶两个元素
OP_3DUP
0x6f
复制栈顶三个元素
OP_2OVER
0x70
把栈底的第三、第四个元素拷贝到栈顶
OP_2ROT
0x71
移动第五、第六元素到栈顶
OP_2SWAP
0x72
将栈顶的两个元素进行交换
OP_IFDUP
0x73
如果栈项元素值不为0,复制该元素值
OP_DEPTH
0x74
Count the items on the stack and push the resulting count
OP_DROP
0x75
删除栈顶元素
OP_DUP
0x76
复制栈顶元素
OP_NIP
0x77
删除栈顶的下一个元素
OP_OVER
0x78
复制栈顶的下一个元素到栈顶
OP_PICK
0x79
把堆栈的第n 个元素拷贝到栈顶
OP_ROLL
0x7a
把堆栈的第n 个元素移动到栈顶
OP_ROT
0x7b
翻转栈顶的三个元素
OP_SWAP
0x7c
栈顶的三个元素交换
OP_TUCK
0x7d
拷贝栈顶元素并插入到栈顶第二个元素之后
表5.字符串接操作
OP_CAT
0x7e
连接两个字符串,已禁用
OP_SUBSTR
0x7f
返回字符串的一部分,已禁用
OP_LEFT
0x80
在一个字符串中保留左边指定长度的子串,已禁用
OP_RIGHT
0x81
在一个字符串中保留右边指定长度的子串,已禁用
OP_SIZE
0x82
把栈顶元素的字符串长度压入堆栈
表6.二进制算术和条件
OP_INVERT
0x83
所有输入的位取反,已禁用
OP_AND
0x84
对输入的所有位进行布尔与运算,已禁用
OP_OR
0x85
对输入的每一位进行布尔或运算,已禁用
OP_XOR
0x86
对输入的每一位进行布尔异或运算,已禁用
OP_EQUAL
0x87
如果输入的两个数相等,返回1,否则返回0
OP_EQUALVERIFY
0x88
与OP_EQUAL 一样,如结果为0,之后运行OP_VERIFY
OP_RESERVED1
0x89
终止- 无效交易(除非在未执行的OP_IF 语句中)
OP_RESERVED2
0x8a
终止-无效交易(除非在未执行的OP_IF 语句中)
表7.数值操作
OP_1ADD
0x8b
栈顶值加1
OP_1SUB
0x8c
栈顶值减1
OP_2MUL
0x8d
无效(栈顶值乘2)
OP_2DIV
0x8e
无效(栈顶值除2)
OP_NEGATE
0x8f
栈顶值符号取反
OP_ABS
0x90
栈顶值符号取正
OP_NOT
0x91
如果栈顶值为0 或1,则输出1或0;否则输出0
OP_0NOTEQUAL
0x92
输入值为0 输出0;否则输出1
OP_ADD
0x93
弹出栈顶的两个元素,压入二者相加结果
OP_SUB
0x94
弹出栈顶的两个元素,压入二者相减(第二项减去第一项)结果
OP_MUL
0x95
禁用(栈顶两项的积)
OP_DIV
0x96
禁用(输出用第二项除以第一项的倍数)
OP_MOD
0x97
禁用(输出用第二项除以第一项得到的余数)
OP_LSHIFT
0x98
禁用(左移第二项,移动位数为第一项的二进制位数)
OP_RSHIFT
0x99
禁用(右移第二项,移动位数为第一项的二进制位数)
OP_BOOLAND
0x9a
布尔与运算,两项都不为0,输出1,否则输出0
OP_BOOLOR
0x9b
布尔或运算,两项有一个不为0,输出1,否则输出0
OP_NUMEQUAL
0x9c
两项相等则输出1,否则输出为0
OP_NUMEQUALVERIFY
0x9d
与NUMEQUAL 相同,如结果为0运行OP_VERIFY
OP_NUMNOTEQUAL
0x9e
如果栈顶两项不是相等数的话,则输出1
OP_LESSTHAN
0x9f
如果第二项小于栈顶项,则输出1
OP_GREATERTHAN
0xa0
如果第二项大于栈顶项,则输出1
OP_LESSTHANOREQUAL
0xa1
如果第二项小于或等于第一项,则输出1
OP_GREATERTHANOREQUAL
0xa2
如果第二项大于或等于第一项,则输出1
OP_MIN
0xa3
输出栈顶两项中较小的一项
OP_MAX
0xa4
输出栈顶两项中较大的一项
OP_WITHIN
0xa5
如果第三项的数值介于前两项之间,则输出1
表8.加密和散列操作
OP_RIPEMD160
0xa6
返回栈顶项的RIPEMD160 哈希值
OP_SHA1
0xa7
返回栈顶项SHA1 哈希值
OP_SHA256
0xa8
返回栈顶项SHA256 哈希值
OP_HASH160
0xa9
栈顶项进行两次HASH,先用SHA-256,再用RIPEMD-160
OP_HASH256
0xaa
栈顶项用SHA-256 算法HASH 两次
OP_CODESEPARATOR
0xab
标记已进行签名验证的数据
OP_CHECKSIG
0xac
交易所用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1
OP_CHECKSIGVERIFY
0xad
与CHECKSIG 一样,但之后运行OP_VERIFY
OP_CHECKMULTISIG
0xae
对于每对签名和公钥运行CHECKSIG。所有的签名要与公钥匹配。实现中存在一个BUG,会从堆栈中弹出一个前缀为OP_0的值。
OP_CHECKMULTISIGVERIFY
0xaf
与CHECKMULTISIG 一样,但之后运行OP_VERIFY
表9.非操作符
OP_NOP1-OP_NOP10
0xb0-0xb9
无操作忽略
表10.仅供内部使用的保留关键字
OP_SMALLDATA
0xf9
代表小数据域
OP_SMALLINTEGER
0xfa
代表小整数数据域
OP_PUBKEYS
0xfb
代表公钥域
OP_PUBKEYHASH
0xfd
代表公钥哈希域
OP_PUBKEY
0xfe
代表公钥域
OP_INVALIDOPCODE
0xff
代表当前未指定的操作码