跳至主要內容
高級

Anchor Outputs

深入了解 Anchor Outputs,解決閃電網路承諾交易的手續費問題。

12 分鐘

什麼是 Anchor Outputs?

Anchor Outputs 是閃電網路的一項改進,在承諾交易中添加特殊的小額輸出, 允許任一方使用 CPFP(Child Pays For Parent)來提高交易手續費, 解決預簽名交易無法調整手續費的問題。

問題背景

閃電網路承諾交易的手續費問題:

1. 承諾交易是預簽名的
   - 在通道開啟時就決定了手續費
   - 無法預測未來的手續費市場

2. 手續費過低
   - 交易可能無法及時確認
   - 在緊急情況下(如惡意關閉)很危險

3. 手續費過高
   - 浪費資金
   - 減少可用通道容量

傳統解決方案:
- 更新承諾交易以調整手續費
- 但需要雙方在線協作

Anchor Output 設計

帶 Anchor Outputs 的承諾交易:

┌─────────────────────────────────────────────────────────────┐
│  Commitment Transaction                                     │
│                                                             │
│  Inputs:                                                    │
│  ├── Funding Output (2-of-2 multisig)                      │
│                                                             │
│  Outputs:                                                   │
│  ├── To Local (帶延遲的本地輸出)                            │
│  ├── To Remote (遠端輸出)                                   │
│  ├── HTLC Outputs (如果有)                                  │
│  ├── Anchor Output A (330 sats) ← Alice 的錨點             │
│  └── Anchor Output B (330 sats) ← Bob 的錨點               │
│                                                             │
│  手續費: 很低(接近最小值)                                  │
└─────────────────────────────────────────────────────────────┘

錨點輸出特點:
- 金額: 330 satoshis(dust 限制)
- 任一方可以花費自己的錨點
- 用於添加 CPFP 子交易提高手續費
// Anchor Output 腳本
// 任一方可立即花費(用於 CPFP)
// 或 16 個區塊後任何人可花費(清理)

const anchorScript = `
  OP_IF
    
  OP_ELSE
    OP_16
    OP_CHECKSEQUENCEVERIFY
    OP_DROP
    
  OP_ENDIF
  OP_CHECKSIG
`;

// 簡化版(BOLT-3 定義)
// 輸出類型:P2WSH
// 金額:330 satoshis

interface AnchorOutput {
  value: 330;  // satoshis
  scriptPubKey: P2WSH;  // 見證腳本雜湊
  witnessScript: Script;  // 上述腳本
}

CPFP 流程

使用 Anchor Output 進行 CPFP:

1. 廣播承諾交易(低手續費)
   ┌─────────────────────────────────┐
   │  Commitment TX                  │
   │  Fee: 1 sat/vB (很低)           │
   │  ├── ...                        │
   │  └── Anchor Output (330 sats)   │
   └─────────────────────────────────┘

2. 創建 CPFP 子交易
   ┌─────────────────────────────────┐
   │  CPFP TX                        │
   │  Input: Anchor Output           │
   │  Input: 額外的 UTXO(提供資金)  │
   │  Output: 找零                   │
   │  Fee: 100 sat/vB (高)           │
   └─────────────────────────────────┘

3. 礦工將兩筆交易一起打包
   - 父交易:1 sat/vB
   - 子交易:100 sat/vB
   - 有效費率:計算兩者總和
// CPFP 子交易創建
function createCPFPTransaction(
  anchorOutpoint: OutPoint,
  anchorAmount: number,
  additionalUtxo: UTXO,
  targetFeeRate: number  // sat/vB
): Transaction {
  const tx = new Transaction();

  // 輸入 1: Anchor Output
  tx.addInput(anchorOutpoint, anchorWitness);

  // 輸入 2: 額外的 UTXO(提供手續費資金)
  tx.addInput(additionalUtxo.outpoint, additionalUtxo.witness);

  // 計算所需手續費
  // 需要覆蓋父交易 + 子交易的總費用
  const parentSize = 500;  // 承諾交易虛擬大小
  const childSize = 150;   // CPFP 交易虛擬大小
  const totalSize = parentSize + childSize;

  const totalFeeNeeded = totalSize * targetFeeRate;
  const parentFee = 500;  // 承諾交易已付的手續費
  const childFee = totalFeeNeeded - parentFee;

  // 輸出: 找零
  const totalInput = anchorAmount + additionalUtxo.value;
  const changeAmount = totalInput - childFee;

  if (changeAmount > DUST_LIMIT) {
    tx.addOutput(changeAddress, changeAmount);
  }

  return tx;
}

與 Package Relay 的關係

重要: Anchor Outputs 依賴 Bitcoin Core 的 CPFP 機制。Package Relay(BIP-331) 將進一步改善這一功能,允許同時提交父子交易。

當前限制(無 Package Relay):

問題:如果承諾交易手續費低於 mempool 最小值
┌─────────────────────────────────────────────────────────────┐
│  Node Mempool                                               │
│  Minimum fee: 5 sat/vB                                      │
│                                                             │
│  1. 廣播承諾交易(1 sat/vB)                                │
│     → 被拒絕!低於最小費率                                  │
│                                                             │
│  2. 無法廣播 CPFP 子交易                                    │
│     → 父交易不在 mempool 中                                 │
│                                                             │
│  結果:交易卡住                                              │
└─────────────────────────────────────────────────────────────┘

Package Relay 解決方案:

┌─────────────────────────────────────────────────────────────┐
│  使用 Package Relay                                         │
│                                                             │
│  1. 同時提交父子交易作為一個「包」                          │
│     - 承諾交易(1 sat/vB)                                  │
│     - CPFP 交易(100 sat/vB)                               │
│                                                             │
│  2. 節點計算包的有效費率                                    │
│     → 有效費率高於最小值                                    │
│                                                             │
│  3. 兩筆交易都被接受                                        │
└─────────────────────────────────────────────────────────────┘

Mempool 政策

Bitcoin Core 對 Anchor Outputs 的特殊處理:

1. CPFP Carve-out(BIP-125 擴展)
   - 允許一個額外的子交易繞過祖先限制
   - 專門為閃電網路設計

2. 規則:
   - 祖先數量限制:25
   - Carve-out 例外:
     - 只有一個祖先(承諾交易)
     - 大小 ≤ 1000 vB
     - 允許第 26 個子交易

3. 目的:
   - 確保雙方都能進行 CPFP
   - 防止一方阻止另一方提高手續費
# bitcoin.conf 相關設置

# 祖先數量限制
limitancestorcount=25

# 後代數量限制
limitdescendantcount=25

# CPFP Carve-out 是硬編碼的,無法配置

零手續費 Anchor

最新的閃電網路規範引入了「零手續費 Anchor」,進一步簡化設計。

零手續費 Anchor Outputs(BOLT-3 更新):

特點:
- 承諾交易手續費為 0
- 完全依賴 CPFP 來支付手續費
- 最大化通道容量

優點:
1. 不需要預測手續費
2. 更多資金可用於支付
3. 簡化通道管理

要求:
- 需要 Package Relay 支持
- 需要節點有額外的 UTXO 用於 CPFP

交易結構:
┌─────────────────────────────────┐
│  Commitment TX                  │
│  Fee: 0 sat/vB                  │
│  ├── To Local                   │
│  ├── To Remote                  │
│  ├── HTLCs                      │
│  └── Single Anchor (330 sats)   │
└─────────────────────────────────┘

實現狀態

實現 支持 備註
LND 預設啟用
CLN 實驗性
Eclair 支持
Bitcoin Core 部分 CPFP carve-out 已實現

總結

  • 解決問題:預簽名交易的手續費調整
  • 機制:使用 CPFP 子交易提高手續費
  • Carve-out:確保雙方都能進行 CPFP
  • 依賴:Package Relay 將進一步改善體驗
已複製連結
已複製到剪貼簿