Standards Track Final
BIP-342: Taproot 腳本驗證
定義 Tapscript 的驗證規則,支援新的腳本功能。
Pieter Wuille, Jonas Nick, Anthony Towns 2020年1月19日
BIP 編號
342
類型
Standards Track
狀態
Final
創建日期
2020-01-19
摘要
BIP-342 定義了 Tapscript,這是用於 Taproot 腳本路徑花費的腳本驗證規則。 Tapscript 是比特幣原始 Script 語言的升級版本,利用 Schnorr 簽名的優勢, 並為未來的腳本升級提供了更好的擴展機制。
動機
隨著 Taproot(BIP-341)和 Schnorr 簽名(BIP-340)的引入,比特幣需要一個 升級版的腳本系統來充分利用這些新功能。Tapscript 的設計目標是:
- • 利用 Schnorr 簽名的批量驗證能力
- • 提供更乾淨的升級路徑,使用 OP_SUCCESS 操作碼
- • 修復 OP_CHECKMULTISIG 的已知問題
- • 移除不必要的資源限制
主要變更
OP_CHECKSIGADD
新的 OP_CHECKSIGADD
操作碼取代了 OP_CHECKMULTISIG:
# 舊的多簽方式 (OP_CHECKMULTISIG)
OP_0 <sig1> <sig2> OP_2 <pk1> <pk2> <pk3> OP_3 OP_CHECKMULTISIG
# 新的多簽方式 (OP_CHECKSIGADD)
<sig3> <pk3> OP_CHECKSIG
<sig2> <pk2> OP_CHECKSIGADD
<sig1> <pk1> OP_CHECKSIGADD
OP_2 OP_EQUAL
這種方式避免了舊 OP_CHECKMULTISIG 的 "off-by-one" bug,並且支持批量驗證。
OP_SUCCESS 操作碼
Tapscript 將 80 到 254 範圍內未使用的操作碼重新定義為 OP_SUCCESS。 這些操作碼會讓腳本立即成功,為未來的軟分叉升級提供了乾淨的路徑。
注意: OP_SUCCESS 操作碼只在 Tapscript 中有效。 如果腳本中包含任何 OP_SUCCESS,整個腳本會立即返回成功, 這意味著包含未知操作碼的腳本在升級前「任何人都可以花費」。
簽名驗證變更
Tapscript 中的所有簽名操作碼使用 Schnorr 簽名(BIP-340):
- • 簽名大小固定為 64 或 65 字節
- • 空簽名表示簽名驗證失敗(而非跳過)
- • 公鑰必須是 32 字節的 x-only 格式
移除的限制
| 限制 | 傳統 Script | Tapscript |
|---|---|---|
| 操作碼數量 | 201 個 | 無限制 |
| 堆疊元素大小 | 520 字節 | 無限制* |
| 腳本大小 | 10,000 字節 | 無限制* |
* 仍受區塊權重限制約束
簽名哈希 (Signature Hash)
Tapscript 使用與 BIP-341 相同的簽名哈希算法,但包含額外的腳本執行數據:
- • tapleaf_hash:正在執行的腳本的 tapleaf 哈希
- • key_version:公鑰版本(目前為 0)
- • codesep_pos:最後執行的 OP_CODESEPARATOR 位置
相關 BIP
- • BIP-340:Schnorr 簽名標準
- • BIP-341:Taproot 規範
- • Taproot 升級詳解:完整的技術教學
相關 BIP
延伸閱讀: 查看 GitHub 上的完整 BIP-342 文件
已複製連結