跳至主要內容
Standards Track Final

BIP-143: SegWit 交易簽章驗證

定義 SegWit 交易的簽章哈希演算法,解決二次哈希問題並修復簽章可塑性。

Johnson Lau, Pieter Wuille 2016年1月3日
BIP 編號

143

類型

Standards Track

狀態

Final

創建日期

2016-01-03

摘要

BIP-143 定義了一種新的交易摘要(digest)演算法,用於 SegWit 交易的簽章生成和驗證。 這個新演算法解決了傳統簽章方案中的幾個重要問題。

解決的問題

1. 二次哈希問題(O(n²) Hashing)

在傳統的簽章方案中,驗證一個包含 n 個輸入的交易需要進行 O(n²) 次哈希運算。 這是因為每個輸入的簽章都需要包含整個交易數據的哈希。 對於大型交易,這會導致驗證時間過長,甚至可以被攻擊者利用來進行 DoS 攻擊。

攻擊場景: 惡意交易包含大量輸入,每個輸入都需要重新計算整個交易的哈希。 一個精心構造的交易可能需要數分鐘甚至更長時間來驗證。

BIP-143 通過預計算可重用的中間值,將複雜度降低到 O(n)。

2. 簽章不包含輸入金額

傳統簽章方案不包含輸入的金額,這對離線簽章設備(如硬體錢包)造成問題。 設備無法驗證用戶支付的手續費是否正確,可能被惡意軟體欺騙支付過高手續費。

3. SIGHASH 簽章可塑性

FindAndDelete 操作可能導致簽章可塑性問題。BIP-143 消除了這個問題。

新的簽章哈希算法

簽章哈希的計算方式如下:

Double SHA256 of:
  1. nVersion (4 bytes)
  2. hashPrevouts (32 bytes)
  3. hashSequence (32 bytes)
  4. outpoint (36 bytes)
  5. scriptCode (var)
  6. value (8 bytes)        ← 新增:輸入金額
  7. nSequence (4 bytes)
  8. hashOutputs (32 bytes)
  9. nLocktime (4 bytes)
  10. sighash type (4 bytes)

中間值說明

欄位 說明
hashPrevouts 所有輸入 outpoint 的雙 SHA256(可重用)
hashSequence 所有輸入 nSequence 的雙 SHA256(可重用)
hashOutputs 所有輸出的雙 SHA256(可重用)
value 當前輸入的金額(聰)

SIGHASH 類型

BIP-143 支援與傳統相同的 SIGHASH 類型:

  • SIGHASH_ALL (0x01):簽署所有輸入和輸出
  • SIGHASH_NONE (0x02):簽署所有輸入,不簽署輸出
  • SIGHASH_SINGLE (0x03):簽署所有輸入和對應索引的輸出
  • SIGHASH_ANYONECANPAY (0x80):只簽署當前輸入(可與上述組合)

對硬體錢包的改進

由於簽章現在包含輸入金額,硬體錢包可以:

  • 驗證手續費:計算 (總輸入 - 總輸出) = 手續費
  • 防止金額欺騙:惡意軟體無法謊報輸入金額
  • 簡化驗證:不需要下載完整的前序交易

效能改進

傳統簽章

n 個輸入 → O(n²) 哈希

100 輸入 ≈ 10,000 次

BIP-143 簽章

n 個輸入 → O(n) 哈希

100 輸入 ≈ 100 次

相關 BIP

  • BIP-141:Segregated Witness
  • BIP-144:SegWit 對等網路序列化
  • BIP-341:Taproot(使用類似但改進的方案)
已複製連結
已複製到剪貼簿