跳至主要內容
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

已複製連結
已複製到剪貼簿