Eltoo 通道機制

理解 Eltoo 協議設計與閃電網路升級機制。

Eltoo 通道機制:閃電網路的狀態管理革新

Eltoo(發音為 "ell-too")是閃電網路通道管理的一種提議機制,旨在解決當前 LN 實現中的一些技術挑戰。這個名字來自「Layer 2」的比特幣愛好者社群的幽默命名創意。本文將深入分析 Eltoo 的設計原理、與傳統 LN 通道的比較、以及其實現所需的比特幣腳本升級。

當前閃電通道的問題

懲罰模型的複雜性

目前閃電網路使用的通道管理機制基於「懲罰模型」(Penalty Model):

  1. 狀態欺騙風險:通道參與者可能嘗試發布舊的通道狀態
  2. 懲罰機制:如果一方作弊,另一方可以「懲罰」作弊者,沒收其資金
  3. 複雜的安全假設:參與者必須監控區塊鏈以發現作弊行為

這種設計雖然安全性高,但帶來了複雜性:

# 當前 LN 通道的懲罰邏輯概念

class LNChannelPenalty:
    def __init__(self, channel_state):
        self.state = channel_state  # 當前通道狀態
        self.local_balance = channel_state.local_balance
        self.remote_balance = channel_state.remote_balance

    def handle_breach(self, breached_state, breaker_pubkey):
        """
        處理作弊行為:實施懲罰
        """
        # 計算懲罰:獲得作弊者的全部資金
        penalty_amount = (
            breached_state.local_balance +
            breached_state.remote_balance
        )

        # 廣播懲罰交易
        penalty_tx = self.create_penalty_tx(
            breaker_pubkey,
            penalty_amount
        )

        # 等待確認
        self.broadcast_and_wait(penalty_tx)
        # 懲罰完成後,通道關閉

狀態管理的困難

在懲罰模型下,通道參與者必須:

  1. 持續監控:隨時監控區塊鏈上是否有舊狀態被發布
  2. 保存所有舊狀態:需要保存通道的完整歷史以應對作弊
  3. 處理多個 UTXO:每個狀態對應一個獨立的commitment交易

這導致:

Eltoo 的設計原理

核心概念:狀態序列覆蓋

Eltoo 採用了一種完全不同的方法:最新的通道狀態優先

┌─────────────────────────────────────────────────────────────┐
│                    Eltoo 核心思想                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  懲罰模型:                                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  舊狀態發布 → 另一方可以懲罰                         │   │
│  │  狀態 N: 發布 → 被發現 → 資金被沒收                 │   │
│  │  狀態 N+1: 新狀態                                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Eltoo 模型:                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  舊狀態被新狀態覆蓋                                  │   │
│  │  狀態 N: 發布 → 被狀態 N+1 覆蓋 → 無效              │   │
│  │  狀態 N+1: 最新狀態 → 有效                          │   │
│  │  狀態 N+2: 更新的狀態 → 覆蓋 N+1                    │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  結果:                                                     │
│  - 不需要保存舊狀態                                         │
│  - 不需要持續監控區塊鏈                                     │
│  - 只需要知道「最新的狀態」                                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

為什麼叫 Eltoo

Eltoo 的名稱來自錨定輸出(OP_CHECKTEMPLATEVERIFYOP_CTV)的比特幣改進提案 BIP-119。雖然 Eltoo 最終不需要 CTV,但這個名字在設計早期被採用並沿用至今。

Eltoo 的技術實現

狀態序列

Eltoo 使用遞增的序列號來標識通道狀態:

# Eltoo 狀態結構
class EltooState:
    def __init__(self, sequence_number, local_balance, remote_balance):
        self.sequence = sequence_number  # 狀態序列號
        self.local_balance = local_balance
        self.remote_balance = remote_balance
        self.update_public_keys = {
            "local": generate_key(),
            "remote": generate_key()
        }

    def to_script(self):
        """生成 Eltoo 狀態腳本"""
        return f"""
        OP_IF
            # 路徑 1: 序列號檢查 + 延遲 + 雙方簽名
            <self.sequence> OP_CHECKSEQUENCEVERIFY OP_DROP
            {self.update_public_keys['local']} OP_CHECKSIG
            OP_IF
                {self.update_public_keys['remote']} OP_CHECKSIG
            OP_ENDIF
        OP_ELSE
            # 路徑 2: 相對時間鎖 + 單方簽名(結算)
            144 OP_CSV OP_DROP
            {self.update_public_keys['local']} OP_CHECKSIG
        OP_ENDIF
        """

覆蓋機制

Eltoo 的核心機制是使用比特幣的 SIGHASH_ANYPREVOUT(APO)簽名類型:

┌─────────────────────────────────────────────────────────────┐
│                    Eltoo 覆蓋機制                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  SIGHASH_ANYPREVOUT 特性:                                  │
│  - 簽名不綁定到特定的 UTXO                                  │
│  - 同一個簽名可以用於多個不同的輸出                         │
│  - 新狀態的簽名「覆蓋」舊狀態的輸出                         │
│                                                             │
│  實際運作:                                                 │
│                                                             │
│  狀態 N 交易:                                              │
│  Input: 通道 UTXO                                           │
│  Output: {balance_A} → A, {balance_B} → B                   │
│  簽名: SIGHASH_ANYPREVOUT                                   │
│                                                             │
│  狀態 N+1 交易:                                            │
│  Input: 同一個通道 UTXO(!)                               │
│  Output: {balance_A'} → A, {balance_B'} → B                │
│  簽名: SIGHASH_ANYPREVOUT                                   │
│                                                             │
│  區塊鏈驗證:                                               │
│  - 兩筆交易都引用同一個 UTXO                               │
│  - Bitcoin Core 會接受「序列號更大的那個」                   │
│  - 較舊的交易被「覆蓋」                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

更新公鑰

Eltoo 為每個狀態生成一對「更新公鑰」(Update Keys):

class EltooChannel:
    def __init__(self, initial_balances):
        self.states = {}
        self.current_sequence = 0

        # 生成初始狀態
        self.add_state(initial_balances)

    def add_state(self, balances):
        """添加新的通道狀態"""
        self.current_sequence += 1

        # 生成新的更新公鑰對
        local_update_key = generate_key()
        remote_update_key = generate_key()

        state = {
            "sequence": self.current_sequence,
            "balances": balances,
            "local_update_key": local_update_key,
            "remote_update_key": remote_update_key,
            # 生成settlement key(用於最終結算)
            "settlement_key": generate_settlement_key(
                local_update_key,
                remote_update_key
            )
        }

        self.states[self.current_sequence] = state
        return state

結算流程

Eltoo 的通道關閉(結算)過程非常簡單:

class EltooSettlement:
    def __init__(self, final_state):
        self.final_state = final_state

    def create_settlement_tx(self, channel_utxo):
        """
        創建結算交易

        使用 SIGHASH_ANYPREVOUT,簽名不綁定特定輸出
        """
        tx = {
            "version": 2,
            "input": {
                "outpoint": channel_utxo,
                "sequence": self.final_state["sequence"],
                "sig": generate_anyprevout_sig(
                    self.final_state["settlement_key"],
                    self.final_state["balances"]
                )
            },
            "output": [
                {"amount": self.final_state["balances"]["local"],
                 "address": "local_address"},
                {"amount": self.final_state["balances"]["remote"],
                 "address": "remote_address"}
            ]
        }

        return tx

    def broadcast_settlement(self, tx):
        """廣播結算交易"""
        # 由於使用 ANYPREVOUT,這個交易可以
        # 覆蓋任何之前的 commitment 交易
        broadcast_to_network(tx)

Eltoo 與 LN 懲罰模型的比較

安全模型比較

特性LN 懲罰模型Eltoo
狀態處理保存所有舊狀態只保存最新狀態
監控需求需要持續監控區塊鏈可選監控
懲罰機制有懲罰交易無懲罰,舊狀態自然失效
數據存儲隨使用時間增長恆定大小
恢復複雜度

資金效率

Eltoo 可以提供更好的資金效率:

┌─────────────────────────────────────────────────────────────┐
│                    資金效率比較                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  LN 懲罰模型:                                              │
│  - 每個 commitment 交易都是獨立的                            │
│  - 雙方都需要預留資金作為「擔保」                            │
│  - 關閉通道時,無法立即使用資金                             │
│                                                             │
│  Eltoo:                                                    │
│  - 只有最新的狀態有效                                        │
│  - 不需要預留擔保資金                                       │
│  - 可以立即結算並使用資金                                   │
│                                                             │
│  結果:                                                     │
│  - Eltoo 通道的實際吞吐量可能更高                          │
│  - 資金_lock時間減少                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

實現複雜度

組件LN 懲罰模型Eltoo
比特幣腳本較複雜較簡單
簽名處理標準 BIP-69需要 ANYPREVOUT
狀態管理需要保存歷史只需要當前狀態
離線處理需要 Watchtower可選
錢包實現成熟需要新開發

實現 Eltoo 所需的比特幣升級

SIGHASH_ANYPREVOUT

Eltoo 的核心依賴比特幣的 SIGHASH_ANYPREVOUT(APO)簽名類型。

這個簽名類型允許簽名「不綁定」到特定的 UTXO,而是只綁定到輸出本身。這使得新的交易可以「覆蓋」舊的交易,因為它們可以花費同一個 UTXO。

比特幣腳本升級需求:

OP_CHECKSIG 的升級版本,允許 ANYPREVOUT:

升級前:
OP_CHECKSIG         # 標準簽名驗證

升級後:
OP_CHECKSIGVERIFY   # 可選的 ANYPREVOUT 模式
(通過 SIGHASH 標誌啟用)

當前狀態

截至 2025 年,SIGHASH_ANYPREVOUT 仍然是一個比特幣改進提案(BIP),尚未激活。社區正在積極討論這個提案:

Eltoo 的實作準備

模擬環境測試

在比特幣主網上實現 Eltoo 之前,應該在測試環境中進行全面測試:

class EltooSimulator:
    def __init__(self):
        self.channel = None
        self.blockchain = []

    def test_basic_update(self):
        """測試基本的狀態更新"""
        # 1. 創建初始狀態
        self.channel = EltooChannel({"local": 1_000_000, "remote": 0})

        # 2. 創建第一次更新
        self.channel.add_state({"local": 800_000, "remote": 200_000})

        # 3. 創建第二次更新
        self.channel.add_state({"local": 600_000, "remote": 400_000})

        # 4. 模擬區塊鏈廣播最新狀態
        latest_tx = self.create_settlement_tx(self.channel.states[3])
        self.blockchain.append(latest_tx)

        # 5. 驗證舊狀態被覆蓋
        old_tx = self.create_settlement_tx(self.channel.states[2])
        assert not self.is_valid(old_tx), "舊狀態應該無效"

    def test_dispute_scenario(self):
        """測試爭議場景"""
        # 1. 創建通道並進行多次更新
        # 2. 一方試圖發布舊狀態
        # 3. 驗證新狀態覆蓋舊狀態
        pass

安全性測試

需要進行以下安全性測試:

  1. 狀態覆蓋測試:確保新狀態確實覆蓋舊狀態
  2. 簽名有效性測試:確保只有有效簽名才能覆蓋
  3. 時序攻擊測試:測試各種時間相關的攻擊場景
  4. 離線場景測試:一方離線時的行為

Eltoo 的應用場景

閃電網路通道

Eltoo 最直接的應用是作為 LN 通道管理機制的替代:

  1. 新通道:可以直接使用 Eltoo 創建
  2. 現有通道遷移:複雜,需要雙方協調
  3. 混用模式:可以同時支持舊版和新版通道

雙向支付通道

Eltoo 的簡單性使其非常適合雙向支付場景:

┌─────────────────────────────────────────────────────────────┐
│                    Eltoo 雙向通道                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  優勢:                                                     │
│  - 簡化的關閉流程                                           │
│  - 更低的資金 Lock 要求                                     │
│  - 更容易的狀態恢復                                         │
│                                                             │
│  適用場景:                                                 │
│  - 經常雙向支付的用戶(如商家-顧客)                       │
│  - 長期穩定關係                                             │
│  - 需要快速結算的場景                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

其他 L2 應用

Eltoo 的設計原則也可以應用於其他比特幣 L2 解決方案:

  1. BitVM:樂觀 Rollup 實現
  2. Statechains:比特幣狀態通道
  3. Drivechain:側鏈提議

挑戰與限制

比特幣升級依賴

Eltoo 需要比特幣腳本升級才能實現。這意味著:

  1. 不確定性:升級可能永遠不會激活
  2. 時間跨度:即使激活,也需要數年時間才能被廣泛採用
  3. 生態過渡:現有 LN 節點需要升級

與現有 LN 的兼容性

Eltoo 與當前 LN 實現不完全兼容:

  1. 無法直接通信:需要新的協議消息
  2. 路由兼容性:可以與舊節點路由
  3. 錢包升級:需要錢包開發者支持

經濟激勵

Eltoo 的經濟模型需要進一步驗證:

  1. 監控激勵:如果不需要監控,如何激勵 watchtower
  2. 離線懲罰:離線時如何保護資金
  3. 誠實行為:如何確保雙方誠實

結論

Eltoo 代表了比特幣 L2 解決方案狀態管理的重要創新。通過使用「最新狀態優先」的設計,它簡化了通道管理,減少了資金 Lock 時間,並降低了錢包的實現複雜度。

然而,Eltoo 目前仍處於研究和提案階段。其實現依賴比特幣腳本的升級(SIGHASH_ANYPREVOUT),這是一個尚未激活的 BIP。

對於比特幣開發者和愛好者來說,理解 Eltoo 的設計原理可以幫助評估比特幣 L2 的未來發展方向。即使 Eltoo 本身可能需要數年才能部署,其設計理念已經影響了其他 L2 解決方案的設計。

相關資源

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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