# 附錄2、交易腳本語言操作符,常量和符號
以下的表和描述參見<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_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 | 代表當前未指定的操作碼 |