跳至主要內容
進階

Payment Retries 支付重試

了解閃電網路支付失敗後的重試機制,如何提高支付成功率。

10 分鐘

為什麼需要重試?

閃電網路支付可能因為多種原因失敗:流動性不足、節點離線、臨時網路問題等。 智能的重試機制對於良好的用戶體驗至關重要。

自動重試: 現代閃電實現會自動處理重試邏輯,用戶通常不需要手動干預。

重試策略

Payment Retry Flow

First Attempt:
1. 計算最佳路徑
2. 構建洋蔥封包
3. 發送 HTLC
4. 等待結果

Failure Handling:
收到失敗回應:
  • 解密錯誤訊息
  • 識別失敗節點/通道
  • 更新 Mission Control 數據
  • 決定是否重試

Retryable Errors:
  • TEMPORARY_CHANNEL_FAILURE - 暫時流動性問題
  • FEE_INSUFFICIENT - 費用不夠,需要調整
  • EXPIRY_TOO_SOON - 時間鎖太短

Non-Retryable Errors:
  • INCORRECT_PAYMENT_DETAILS - 發票有誤
  • PAYMENT_HASH_ALREADY_FULFILLED - 已支付
  • FINAL_EXPIRY_TOO_SOON - 接收者拒絕

Mission Control

Mission Control Learning

Failure Record Example:
{
  "channel": "123x456x0",
  "node": "02abc...",
  "failure_time": 1700000000,
  "failure_amt": 100000,
  "success_probability": 0.3
}

Probability Updates:
  • 失敗:降低該通道/節點的成功概率
  • 成功:提高成功概率
  • 時間衰減:舊數據逐漸失效

Avoidance Strategy:

Short-term:
  • 剛失敗的通道暫時排除
  • 通常幾分鐘到幾小時

Long-term:
  • 累積歷史數據
  • 影響路由選擇權重

重試配置

LND Configuration

# 支付相關設定
[routerrpc]
routerrpc.minrtprob=0.01        # 最小路由成功概率
routerrpc.attemptcost=100       # 每次嘗試的虛擬成本(msat)
routerrpc.attemptcostppm=1000   # 每次嘗試的比例成本
routerrpc.maxmchistory=1000     # Mission Control 記錄數量
routerrpc.mcflushinterval=1h    # 數據持久化間隔

SendPaymentV2 Parameters:
  • timeout_seconds - 總超時時間
  • max_parts - MPP 最大分片數
  • fee_limit_sat - 最大費用限制
  • no_inflight_updates - 是否接收中間狀態

MPP 優勢

多路徑支付可以分散風險,部分失敗可以重試而不影響已成功的部分。

超時處理

設定合理的超時,避免 HTLC 長時間懸掛。

冪等性: 使用相同的 payment_hash 重試是安全的 — 接收者只能領取一次。

相關資源

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