閃電網路通道技術詳解

閃電網路通道的技術原理與實現

閃電網路 Channels 詳解

閃電網路 Channels(通道)是閃電網路的核心概念,允許兩個參與者在鏈下進行多次交易,實現比特幣的即時、低費用支付。本文深入解析通道的技術細節,特別是 Commitment Transaction 的狀態機制與實際數值範例。

Channel 基本概念

什麼是通道?

通道就像在比特幣區塊鏈上建立的一個「支付管道」。建立通道後,雙方可以在鏈下進行無限次交易,最後再將最終餘額廣播到區塊鏈。

通道生命週期

  1. 建立(Funding):雙方在主鏈鎖定資金
  2. 運作(State Updates):鏈下多次轉帳
  3. 關閉(Settlement):最終餘額回到主鏈

通道建立過程

Funding Transaction

通道的建立始於一筆 Funding Transaction,這是保存在比特幣區塊鏈上的 2-of-2 多籤交易:

Funding Transaction 結構:
- 輸入:A 的 BTC + B 的 BTC
- 輸出:2-of-2 多籤,需要雙方簽名才能解鎖
- 鎖定時間:可選的絕對時間鎖(CLTV)

實際數值範例

假設 Alice 和 Bob 建立通道:

參數數值
Alice 出資0.5 BTC
Bob 出資0.3 BTC
通道總容量0.8 BTC
通道類型P2WSH(Native SegWit)
多籤腳本OP2 <AlicePubKey> <BobPubKey> OP2 OP_CHECKMULTISIG

Commitment Transaction 結構

在 Funding Transaction 確認後,雙方會交換初始的 Commitment Transaction。每個 Commitment Transaction 包含多個輸出:

承諾交易輸出類型

  1. 本地延遲輸出(to_local)
  1. 遠端延遲輸出(to_remote)
  1. HTLC 輸出( Offered HTLCs / Received HTLCs)

Commitment Transaction 具體範例

假設 Alice-Bob 通道在一次交易後的狀態:

Commitment Transaction #5(Alice 視角)

輸入:
- Funding Transaction 輸出(引用)

輸出 0(to_local):
- 金額:0.35 BTC
- 腳本:OP_IF <Alice_延遲公鑰> OP_ELSE <Bob_贖回腳本> OP_ENDIF
         OP_CHECKSEQUENCEVERIFY OP_DROP <Alice_公鑰> OP_CHECKSIG

輸出 1(to_remote):
- 金額:0.30 BTC
- 腳本:同上(延遲後歸 Bob)

輸出 2( Offered HTLC #1):
- 金額:0.05 BTC
- 腳本:OP_HASH160 <HTLC哈希> OP_EQUAL
         OP_IF
           <Bob_預圖像公鑰>
         OP_ELSE
           <Alice_延遲公鑰> OP_CHECKSEQUENCEVERIFY OP_DROP
           <Bob_過期退款公鑰> OP_CHECKSIG
         OP_ENDIF

輸出 3(Received HTLC #1):
- 金額:0.03 BTC
- 腳本:OP_HASH160 <HTLC哈希> OP_EQUAL
         OP_IF
           <Alice_預圖像公鑰>
         OP_ELSE
           <Bob_延遲公鑰> OP_CHECKSEQUENCEVERIFY OP_DROP
           <Alice_過期退款公鑰> OP_CHECKSIG
         OP_ENDIF

Commitment Number(狀態編號)

每個 Commitment Transaction 都有一個唯一的編號,從 0 開始遞增。這個編號在雙方的視角中是互補的:

Commitment Transaction 狀態解析

狀態機制

閃電網路使用「局部」更新機制,每次支付都會產生新的 Commitment Transaction:

  1. 狀態 N:雙方各自持有對方的簽名
  2. 狀態 N+1:雙方交換新簽名,舊狀態失效
  3. 狀態 N+2:再更新...

輸出詳細解析

to_local 輸出

格式:
OP_IF
  <延遲公鑰>
  OP_CHECKSEQUENCEVERIFY
  OP_DROP
  <本地公鑰>
  OP_CHECKSIG
OP_ELSE
  <對手延遲公鑰>
  OP_CHECKSEQUENCEVERIFY
  OP_DROP
  <對手公鑰>
  OP_CHECKSIG
OP_ENDIF

解讀

HTLC 輸出

HTLC 輸出有兩種狀態,視 HTLC 是否已被解決:

狀態 A:HTLC 進行中

條件 1(正確預圖像):<收款方公鑰> OP_CHECKSIG
條件 2(過期):<付款方延遲公鑰> OP_CSV OP_DROP <付款方退款公鑰> OP_CHECKSIG

狀態 B:HTLC 已解決

CSV(Check Sequence Verify)

OP_CSV 是Commitment Transaction 安全性的關鍵:

懲罰機制詳解

為什麼需要懲罰?

閃電網路的「非同步」特性帶來了雙花風險:

Revocable Contract

每個 Commitment Transaction 都包含「可撤銷」的組件:

  1. 延遲輸出:使用 penalty key
  2. HTLC:在過期前可以被提取

欺詐場景

假設 Bob 試圖欺騙 Alice:

時間線:
T+0:雙方同意 Commitment #10
T+1:Alice 發現 Bob 广播了 Commitment #10(但已過時)
T+2:Alice 使用 penalty key,盜取 Bob 在 to_local 和 HTLC 輸出中的全部資金
T+3:Bob 損失資金,Alice 獲得獎勵

實際數值:Penalty 計算

假設通道狀態(Bob 的欺詐):

輸出金額Penalty 後果
to_local(Bob)0.20 BTCAlice 盜走
to_remote(Alice)0.30 BTCAlice 獲得
Offered HTLC #10.05 BTCAlice 盜走
Received HTLC #20.08 BTCAlice 盜走
總計0.63 BTCAlice 獲得

Bob 原本只能獲得 0.30 BTC(to_remote),但因為欺詐,損失了全部 0.63 BTC。

HTLC 深入解析

HTLC 結構

HTLC(Hash Time Locked Contract)是閃電網路實現跨節點支付的基礎:

HTLC 輸出腳本:
OP_HASH160 <R-Hash> OP_EQUAL
OP_IF
  <收款方預圖像路徑>
OP_ELSE
  OP_SWAP <付款方公鑰> OP_CHECKSIG
  OP_IF
    <延遲路徑>
  OP_ENDIF
OP_ENDIF

預圖像(Preimage)

預圖像是 HTLC 機制的核心:

HTLC 數值範例

假設 Alice 通過 Bob 向 Carol 支付 0.01 BTC:

流程:

1. Alice -> Bob:建立 HTLC
   - HTLC 金額:0.01 BTC
   - R-Hash:SHA-256(Carol的預圖像)
   - 過期:10 區塊後

2. Bob -> Carol:轉發 HTLC
   - 金額:0.01 BTC(加上 Bob 的費用)
   - R-Hash:同上
   - 過期:5 區塊後(更短)

3. Carol -> Bob:揭示預圖像
   - Carol 揭示預圖像 R
   - Bob 獲得款項

4. Bob -> Alice:揭示預圖像
   - Bob 向 Alice 揭示 R
   - Alice 確認支付成功

HTLC 過期參數

過期時間的設置需要平衡:

參數典型值考量
cltv_expiry144-1008 區塊給收款方足夠時間響應
incoming CLTV比 outgoing 短確保時間 buffer
最小 HTLC1 satoshi灰塵限制
最大 HTLC通道容量單筆支付上限

通道關閉機制

協商關閉(Mutual Close)

正常情況下,雙方協商關閉通道:

Mutual Close Transaction:
- 創建費用:預設 250 satoshi
- 剩餘餘額:按最新 Commitment 分配
- 延遲:0(立即可花費)

單方面關閉(Unilateral Close)

任何一方可以單方面广播最新的 Commitment Transaction:

Unilateral Close Timeline:
- T+0:广播 Commitment Transaction
- T+1:等待區塊確認
- T+2~N:to_local/ to_remote 輸出進入 CSV 延遲
- T+N+1:資金解鎖,可提取
- T+N+2+penalty window:penalty key 失效

違約關閉(Devised Close)

當一方無法響應時(如離線),另一方可以啟動違約關閉:

流動性管理

問題分析

通道餘額是「單向」的:

流動性範例

假設 Alice -> Bob 通道:

狀態Alice 餘額Bob 餘額流動性限制
初始0.50 BTC0.30 BTCAlice 可付款,Bob 可收款
Alice 付 0.10 BTC0.40 BTC0.40 BTCAlice 仍可付款
Alice 付 0.40 BTC0.10 BTC0.70 BTCAlice 流動性耗盡

解決方案

  1. Submarine Swaps:鏈上換成鏈下流動性
  1. Rebalancing:調整通道餘額
  1. Loop:從通道抽出資金
  1. Dual Funding:雙方共同增資

相關文章

本文包含

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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