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
延伸閱讀: 查看 GitHub 上的完整 BIP-143 文件
已複製連結