跳至主要內容
高級

承諾交易

深入理解閃電網路承諾交易的結構、撤銷機制和安全性設計。

20 分鐘

什麼是承諾交易?

承諾交易(Commitment Transaction)是支付通道的核心。它是一筆預先簽署但未廣播的交易, 代表通道在某一時刻的餘額狀態。雙方各自持有一個版本,可以隨時廣播來關閉通道。

關鍵洞見: 承諾交易的巧妙設計在於:雙方持有的版本略有不同, 這種「不對稱性」使得撤銷機制成為可能。

承諾交易結構

承諾交易(Alice 持有的版本):

輸入:
  funding_txid:0  (2-of-2 多簽)
    └─ 需要 Alice + Bob 的簽名

輸出:
  0: to_local (Alice 的餘額)
     ├─ 金額: 600,000 sats
     └─ 腳本:
        OP_IF
          <revocation_pubkey>  # Bob 可用撤銷密鑰取走
        OP_ELSE
          <to_self_delay> OP_CSV
          <alice_delayed_pubkey>  # 等待後 Alice 可取
        OP_ENDIF
        OP_CHECKSIG

  1: to_remote (Bob 的餘額)
     ├─ 金額: 400,000 sats
     └─ 腳本: <bob_pubkey> OP_CHECKSIG  # 立即可取

  2-N: HTLC 輸出 (如有待處理的 HTLC)

不對稱性設計

Alice 和 Bob 持有的承諾交易是「鏡像」版本:

Alice 持有的版本

  • • Alice 的輸出:有延遲 + 可被撤銷
  • • Bob 的輸出:立即可取
  • • 由 Bob 簽名給 Alice

Bob 持有的版本

  • • Bob 的輸出:有延遲 + 可被撤銷
  • • Alice 的輸出:立即可取
  • • 由 Alice 簽名給 Bob
為什麼需要不對稱?

如果雙方持有相同的交易:
- 無法區分誰廣播了舊狀態
- 無法實現懲罰機制

不對稱設計:
- 廣播者自己的輸出有延遲
- 對方的輸出可以立即取走
- 廣播舊狀態會被對方用撤銷密鑰懲罰

這確保了:
1. 誠實方可以立即取回資金
2. 作弊方會損失全部資金

撤銷機制

當通道狀態更新時,舊的承諾交易需要被「撤銷」:

撤銷密鑰生成:

每個承諾交易使用一對「撤銷基點」:
- Alice 的 revocation_basepoint
- Bob 的 revocation_basepoint

撤銷公鑰:
revocation_pubkey =
  revocation_basepoint_alice * SHA256(revocation_basepoint_alice || per_commitment_point_bob)
  + per_commitment_point_bob * SHA256(per_commitment_point_bob || revocation_basepoint_alice)

撤銷時:
- Alice 向 Bob 揭示 per_commitment_secret
- Bob 可以計算出 revocation_privkey
- 如果 Alice 廣播舊狀態,Bob 可以取走全部資金

Per-Commitment Secret

每個承諾交易都有一個唯一的秘密值,使用高效的樹狀結構生成:

Shachain: 高效的秘密儲存

種子 → 生成 2^48 個秘密
只需儲存 O(log n) 個值即可重建任意舊秘密

           seed
          /    \
       H(0)    H(1)
       /  \    /  \
     H(00) H(01) H(10) H(11)
     ...

揭示順序:從最新到最舊
每次揭示後,可以驗證並壓縮儲存

優點:
- 支持數十億次狀態更新
- 儲存空間固定(約 1KB)

to_local 輸出

廣播者自己的餘額輸出,有兩種花費路徑:

to_local 腳本:

OP_IF
    # 撤銷路徑:對方懲罰
    <revocationpubkey>
OP_ELSE
    # 正常路徑:等待後自己取回
    <to_self_delay>
    OP_CHECKSEQUENCEVERIFY
    OP_DROP
    <local_delayedpubkey>
OP_ENDIF
OP_CHECKSIG

to_self_delay 典型值:
- 144 blocks (~1 天)
- 可協商,更大的值更安全
- 給對方足夠時間檢測作弊

to_remote 輸出

對方的餘額輸出,可以立即花費:

to_remote 腳本(原始版本):
<remotepubkey> OP_CHECKSIG

to_remote 腳本(錨點版本):
<remotepubkey> OP_CHECKSIGVERIFY 1 OP_CHECKSEQUENCEVERIFY

錨點版本添加 1 block 延遲
允許使用 CPFP 調整手續費

HTLC 輸出

待處理的 HTLC 創建額外的輸出:

Offered HTLC 腳本(Alice 提供給 Bob):

# 撤銷
OP_DUP OP_HASH160 <RIPEMD160(revocationpubkey)> OP_EQUAL
OP_IF
    OP_CHECKSIG
OP_ELSE
    <remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
    OP_NOTIF
        # 超時:Alice 取回(需要 HTLC-timeout tx)
        OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
    OP_ELSE
        # 成功:Bob 提供原像
        OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
        OP_CHECKSIG
    OP_ENDIF
OP_ENDIF

錨點輸出

現代承諾交易包含「錨點輸出」,解決手續費問題:

承諾交易(含錨點):

輸出:
  0: to_local           (Alice,延遲)
  1: to_remote          (Bob,1 block CSV)
  2: anchor_alice       (330 sats)
  3: anchor_bob         (330 sats)
  4-N: HTLCs

錨點輸出腳本:
<local_pubkey> OP_CHECKSIG
OP_IFDUP OP_NOTIF
    16 OP_CHECKSEQUENCEVERIFY
OP_ENDIF

用途:
- 允許 CPFP 提高手續費
- 承諾交易可以使用最低手續費
- 廣播時動態調整

狀態更新流程

更新通道狀態(例如:Alice 付 Bob 1000 sats):

1. Alice 發送 update_add_htlc 或直接更新
2. Alice 發送 commitment_signed
   └─ 包含新承諾交易的簽名
3. Bob 驗證並發送 revoke_and_ack
   └─ 揭示舊狀態的 per_commitment_secret
   └─ 發送新的 per_commitment_point
4. Bob 發送 commitment_signed
5. Alice 發送 revoke_and_ack

完成後:
- 雙方都有新的承諾交易
- 舊的承諾交易已被撤銷
- 任一方廣播舊狀態都會被懲罰

懲罰交易

當檢測到對方廣播舊狀態時,可以創建懲罰交易:

懲罰交易(Justice Transaction):

前提:Bob 廣播了舊的承諾交易
Alice 有對應的 revocation_secret

懲罰交易:
輸入:
  - Bob 的 to_local 輸出(使用撤銷密鑰)
  - 所有 HTLC 輸出(使用撤銷密鑰)
輸出:
  - Alice 的地址

結果:
- Bob 損失所有通道資金
- Alice 獲得全部資金

時間窗口:
- 必須在 to_self_delay 期間內
- 這就是為什麼需要監控區塊鏈或使用瞭望塔

安全考量

定期在線

節點需要定期檢查區塊鏈,在 to_self_delay 期間內發現作弊並懲罰。

瞭望塔服務

如果無法持續在線,可以使用瞭望塔服務代為監控和懲罰。

備份撤銷數據

必須安全備份通道狀態和撤銷密鑰,丟失可能導致無法懲罰作弊。

下一步: 了解 通道狀態機 的完整狀態轉換和訊息交互。

已複製連結
已複製到剪貼簿