隔離見證 (SegWit) 技術解析
解決比特幣延展性問題的關鍵升級。
隔離見證(SegWit)完整指南:比特幣最關鍵的協定升級
隔離見證(Segregated Witness,簡稱 SegWit)是比特幣歷史上最重要的軟分叉升級之一。2017 年 8 月激活的 SegWit 解決了比特幣長期的交易延展性問題,並為後續的閃電網路等第二層解決方案奠定了基礎。本文將深入探討 SegWit 的技術原理、實施細節與實際影響。
SegWit 誕生的背景
比特幣的交易延展性問題
比特幣交易延展性(Transaction Malleability)是指攻擊者可以在交易被確認之前修改交易的數位簽名,從而改變交易的 TXID(交易 ID),但不改變交易的實質內容。
問題根源:比特幣使用 ECDSA 簽名,簽名格式允許在不失效的情況下進行非密碼學修改。
原始交易 TXID:abc123...
修改後 TXID:def456...(攻擊者生成)
為什麼這是問題:
- 第二層解決方案的障礙:閃電網路等需要知道交易的確定 ID
- 交易所風險:如果用戶提現的交易被修改,交易所可能錯誤地認為原始交易失敗
- 錢包體驗:用戶可能看到「交易失敗」但實際上資金已經轉出
區塊大小限制的困境
比特幣原始區塊大小上限為 1 MB,這在 2015-2017 年間造成了嚴重的網路擁塞。社區提出了多種擴容方案:
- 比特幣無限(Bitcoin Unlimited):直接增加區塊大小
- SegWit2x:SegWit + 區塊大小增加到 2 MB
- 隔離見證(SegWit):將見證數據移出基礎區塊
最終,SegWit 以比特幣改進提案 BIP-141 的形式實施。
SegWit 的核心技術原理
隔離見證的概念
SegWit 的核心思想是將交易的簽名數據(Witness Data)從交易中分離出來,存放在獨立的「見證」區塊中。
比特幣傳統交易結構:
├── 版本號(4 bytes)
├── 輸入列表
│ ├── 前置交易 ID(32 bytes)
│ ├── 輸出索引(4 bytes)
│ ├── 解鎖腳本(可變大小)
│ └── 序列號(4 bytes)
├── 輸出列表
│ ├── 金額(8 bytes)
│ └── 鎖定腳本(可變大小)
└── 鎖定時間(4 bytes)
SegWit 交易結構:
├── 版本號(4 bytes)
├── 標記(Marker, 1 byte):0x00
├── 標誌(Flag, 1 byte):0x01
├── 輸入列表(不包含見證數據)
├── 輸出列表
├── 見證數據(獨立部分)
│ ├── 見證項目數
│ └── 每個輸入的見證數據
└── 鎖定時間(4 bytes)
見證數據的結構
在 SegWit 交易中,每個輸入的見證數據包含:
# P2WPKH(Pay to Witness Public Key Hash)的見證數據
witness = [
<signature>, # DER 格式的 ECDSA 簽名
<pubkey> # 未壓縮的公鑰(33 bytes)
]
# P2WSH(Pay to Witness Script Hash)的見證數據
witness = [
<number of items>, # 見證項目數
<item1>, # 例如:OP_DUP OP_HASH160...
<item2>, # 例如:<pubKeyHash>
# ... 更多項目
]
權重與 vbytes
SegWit 引入了「權重」(Weight)的概念來計算區塊容量:
傳統數據權重:1 byte = 4 weight units
見證數據權重:1 byte = 1 weight unit
區塊上限:4,000,000 weight units
計算公式:
- 基礎區塊大小 = (stripped_size * 4) + witness_size
- vbytes = (weight + 3) / 4 (向上取整)
這意味著:
| 交易類型 | 最大大小 | 理論最大 |
|---|---|---|
| 傳統(P2PKH) | 1 MB | 1 MB |
| SegWit(P2WPKH) | 4 MB | ~1.7-2 MB |
| SegWit(P2WSH) | 4 MB | 取決於腳本複雜度 |
交易延展性的解決
SegWit 通過將簽名移出交易輸入來解決延展性問題:
傳統交易:
TXID = SHA256(SHA256(version + inputs + outputs + nLockTime))
SegWit 交易:
TXID = SHA256(SHA256(version + inputs + outputs + nLockTime))
(見證數據不參與 TXID 計算)
WtxID = SHA256(SHA256(version + inputs + outputs + witness + nLockTime))
攻擊者可以修改見證數據,生成不同的 wtxid,但無法改變 txid。
SegWit 地址格式
Bech32 編碼
SegWit 引入了新的地址格式:Bech32(Base32 編碼),使用 32 個字符的字母表:
字母表:qpzry9x8gf2tvdw0s3jn54khce6mua7l
P2WPKH 地址格式:
- hrp(人類可讀部分):bc(比特幣主網)
- 長度:42 個字符
- 範例:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
P2WSH 地址格式:
- hrp:bc
- 長度:62 個字符
- 範例:bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3
地址轉換示例
import hashlib
def pubkey_to_p2wpkh_address(pubkey_hash):
"""
將公鑰哈希轉換為 P2WPKH 地址(Bech32)
"""
# RIPEMD160(SHA256(pubkey))
pubkey_hash = hashlib.new('ripemd160', hashlib.sha256(pubkey).digest()).digest()
# Bech32 編碼(需要使用 bech32 庫)
# from bech32 import bech32_encode
# address = bech32_encode('bc', 0, pubkey_hash)
return address
def script_to_p2wsh_address(script):
"""
將腳本哈希轉換為 P2WSH 地址
"""
# SHA256(script)
script_hash = hashlib.sha256(script).digest()
# Bech32 編碼
# address = bech32_encode('bc', 0, script_hash)
return address
兼容性與過渡
SegWit 設計為向後兼容,支持三種錢包類型:
原生 SegWit(P2WPKH/P2WSH):
- 最優惠的費用
- 最高的安全性
- 需要完整支持 SegWit 的錢包
嵌套 SegWit(P2SH-P2WPKH/P2SH-P2WSH):
- 通過 P2SH 包裝 SegWit 腳本
- 兼容較舊的錢包
- 費用比原生 SegWit 稍高
# P2SH-P2WPKH 示例
# 內部:P2WPKH 腳本
inner_script = OP_0 + OP_PUSHBYTES_20 + pubkey_hash
# 包裝為 P2SH
script_hash = RIPEMD160(SHA256(inner_script))
redeem_script = OP_HASH160 + script_hash + OP_EQUAL
# 地址:Base58Check(P2SH version + script_hash)
SegWit 的實際影響
交易費用變化
SegWit 顯著降低了交易費用:
| 交易類型 | 典型大小 | 費用節省 |
|---|---|---|
| P2PKH → P2WPKH | ~226 vbytes → ~168 vbytes | ~25% |
| P2SH-P2WPKH → P2WPKH | ~365 vbytes → ~168 vbytes | ~54% |
費用計算示例(假設 10 sat/vbyte):
P2PKH 交易(226 vbytes):
費用 = 226 × 10 = 2,260 satoshi
P2WPKH 交易(168 vbytes):
費用 = 168 × 10 = 1,680 satoshi
節省:580 satoshi ≈ 25%
網路採用率
截至 2026 年 2 月,SegWit 交易佔比:
- 整體採用率:約 85-90% 的新交易使用 SegWit
- 礦池支持:幾乎所有主要礦池都支持 SegWit
- 錢包支持:主流錢包(Coinbase、Binance、Kraken、 Ledger、 Trezor)都支持
區塊空間利用
SegWit 區塊的平均空間利用:
平均 Stripped Size:~1.1 MB
平均 Witness Size:~0.6 MB
總權重:~3.5-4.0 MWU(百萬權重單位)
有效大小:~2.5-3 MB
安全性改進
修復的交易延展性
SegWit 修復了第三方延展性攻擊:
def verify_txid_stability(tx):
"""
驗證交易的 TXID 是否穩定
SegWit 交易:TXID 取決於非見證數據,無法被第三方修改
"""
if tx.is_segwit:
# 見證數據不影響 TXID
return True, "TXID is stable"
# 傳統交易可能被修改
return False, "TXID may be malleable"
腳本版本控制
SegWit 引入腳本版本概念:
# 見證程式格式
# OP_0 <version> <witness_program>
# 版本 0(P2WPKH, P2WSH)
OP_0 <20-byte hash> # P2WPKH
OP_0 <32-byte hash> # P2WSH
# 未來版本可以添加新功能
# OP_1 <version> <program>
# OP_2 ...
這允許比特幣在不解硬分叉的情況下引入新的腳本類型。
量子計算威脅的準備
雖然當前量子計算對比特幣的威脅很小,但 SegWit 的設計考慮了未來:
- 公鑰在 P2WPKH 中僅在花費時暴露
- 未来的软分叉可以切换到抗量子签名方案
- P2WSH 使用 SHA256,相比 ECDSA 更能抵抗量子攻击
閃電網路與 SegWit
Taproot 之前的基礎
SegWit 是閃電網路的必要基礎:
- HTLC 腳本:閃電網路使用哈希時間鎖合約(HTLC)
- SIGHASH_ANYONECANPAY:允許部分簽名
- 交易延展性修復:確保雙方可以安全地構建交易
# 閃電網路 HTLC 腳本示例
# 如果知道原像(preimage)且 Alice 簽名,則 Bob 可以索取資金
# 或者,如果超過時間鎖,Alice 可以收回資金
htlc_script = OP_IF
OP_HASH256 <hash-of-preimage> OP_EQUALVERIFY <Bob's pubkey> OP_CHECKSIG
OP_ELSE
<expiry> OP_CHECKSEQUENCEVERIFY OP_DROP <Alice's pubkey> OP_CHECKSIG
OP_ENDIF
與 Taproot 的關係
2021 年 11 月激活的 Taproot 升級(BIP-341/342)建立在 SegWit 基礎上:
- MAST:默克爾化抽象語法樹
- Schnorr 簽名:更簡單、更高效的簽名
- 更強的隱私:所有 Taproot 交易看起來都一樣
常見問題解答
SegWit 與比特幣現金的關係?
比特幣現金(BCH)在 2017 年 8 月從比特幣分叉,選擇直接將區塊大小增加到 8 MB,而非採用 SegWit。兩個網路現在是獨立的區塊鏈。
我的比特幣是否需要在 SegWit 地址上?
不需要。舊地址仍然完全可用,只是費用較高。建議新交易使用 SegWit 地址以節省費用。
SegWit 是否安全?
SegWit 已經過多年運行驗證,沒有發現重大安全問題。它被認為是比特幣最成功的軟分叉升級之一。
為什麼有些錢包不支持 SegWit?
某些錢包可能因為以下原因不支持 SegWit:
- 技術實現複雜
- 舊版本未更新
- 故意不支持(少數情況)
結論
SegWit 是比特幣歷史上最具影響力的協定升級之一:
- 解決延展性:為閃電網路等第二層解決方案鋪平道路
- 降低費用:平均節省 30-50% 的交易費用
- 增加容量:理論最大區塊從 1 MB 增加到 ~2 MB
- 提升安全:修復延展性攻擊向量
- 準備未來:為 Taproot 等後續升級奠定基礎
理解 SegWit 的技術原理對於比特幣開發者、節點運營者和進階用戶都至關重要。隨著比特幣網路的不斷發展,SegWit 將繼續發揮其關鍵作用。
相關文章:
相關文章
- 比特幣腳本語言入門 — 理解 Bitcoin Script 的基本指令與運作原理。
- Taproot 全面解析 — 比特幣最新的腳本升級:MAST、BIP-340/341/342。
- 比特幣密碼學基礎 — 深入理解比特幣核心密碼學技術:SHA-256、RIPEMD-160、secp256k1 橢圓曲線、ECDSA 與 Schnorr 簽章。
- Nakamoto 共識機制 — 深入分析比特幣的革命性共識機制:工作量證明、最長鏈原則、激勵相容性與安全性分析。
- Bitcoin Core 節點運作 — 運行完整節點,理解比特幣網路的運作機制。
延伸閱讀與來源
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!