隔離見證 (SegWit) 技術解析

解決比特幣延展性問題的關鍵升級。

隔離見證(SegWit)完整指南:比特幣最關鍵的協定升級

隔離見證(Segregated Witness,簡稱 SegWit)是比特幣歷史上最重要的軟分叉升級之一。2017 年 8 月激活的 SegWit 解決了比特幣長期的交易延展性問題,並為後續的閃電網路等第二層解決方案奠定了基礎。本文將深入探討 SegWit 的技術原理、實施細節與實際影響。

SegWit 誕生的背景

比特幣的交易延展性問題

比特幣交易延展性(Transaction Malleability)是指攻擊者可以在交易被確認之前修改交易的數位簽名,從而改變交易的 TXID(交易 ID),但不改變交易的實質內容。

問題根源:比特幣使用 ECDSA 簽名,簽名格式允許在不失效的情況下進行非密碼學修改。

原始交易 TXID:abc123...
修改後 TXID:def456...(攻擊者生成)

為什麼這是問題

  1. 第二層解決方案的障礙:閃電網路等需要知道交易的確定 ID
  2. 交易所風險:如果用戶提現的交易被修改,交易所可能錯誤地認為原始交易失敗
  3. 錢包體驗:用戶可能看到「交易失敗」但實際上資金已經轉出

區塊大小限制的困境

比特幣原始區塊大小上限為 1 MB,這在 2015-2017 年間造成了嚴重的網路擁塞。社區提出了多種擴容方案:

最終,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 MB1 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 地址格式

P2WSH 地址格式

地址轉換示例

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(P2SH-P2WPKH/P2SH-P2WSH)

# 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 交易佔比:

區塊空間利用

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 的設計考慮了未來:

閃電網路與 SegWit

Taproot 之前的基礎

SegWit 是閃電網路的必要基礎:

  1. HTLC 腳本:閃電網路使用哈希時間鎖合約(HTLC)
  2. SIGHASH_ANYONECANPAY:允許部分簽名
  3. 交易延展性修復:確保雙方可以安全地構建交易
# 閃電網路 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 基礎上:

常見問題解答

SegWit 與比特幣現金的關係?

比特幣現金(BCH)在 2017 年 8 月從比特幣分叉,選擇直接將區塊大小增加到 8 MB,而非採用 SegWit。兩個網路現在是獨立的區塊鏈。

我的比特幣是否需要在 SegWit 地址上?

不需要。舊地址仍然完全可用,只是費用較高。建議新交易使用 SegWit 地址以節省費用。

SegWit 是否安全?

SegWit 已經過多年運行驗證,沒有發現重大安全問題。它被認為是比特幣最成功的軟分叉升級之一。

為什麼有些錢包不支持 SegWit?

某些錢包可能因為以下原因不支持 SegWit:

結論

SegWit 是比特幣歷史上最具影響力的協定升級之一:

  1. 解決延展性:為閃電網路等第二層解決方案鋪平道路
  2. 降低費用:平均節省 30-50% 的交易費用
  3. 增加容量:理論最大區塊從 1 MB 增加到 ~2 MB
  4. 提升安全:修復延展性攻擊向量
  5. 準備未來:為 Taproot 等後續升級奠定基礎

理解 SegWit 的技術原理對於比特幣開發者、節點運營者和進階用戶都至關重要。隨著比特幣網路的不斷發展,SegWit 將繼續發揮其關鍵作用。


相關文章

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!