跳至主要內容
進階

Failure Codes 錯誤代碼

了解閃電網路支付失敗的錯誤代碼,包括 BOLT 4 定義的各種失敗類型及其處理方式。

12 分鐘

什麼是錯誤代碼?

當閃電網路支付失敗時,失敗節點會返回一個加密的錯誤訊息給發送者。 這些錯誤訊息包含標準化的錯誤代碼,幫助發送者理解失敗原因並決定如何重試。 錯誤代碼定義在 BOLT 4 中。

洋蔥加密錯誤: 錯誤訊息使用洋蔥路由的共享密鑰加密,只有發送者能解密並確定是哪個節點返回了錯誤。

錯誤類型分類

Error Code Structure

Error code format (2 bytes):
Bit 15 (BADONION):  1 = HMAC verification failed
Bit 14 (PERM):      1 = Permanent error, don't retry
Bit 13 (NODE):      1 = Node error, can try bypassing
Bit 12 (UPDATE):    1 = Contains channel_update
Bits 0-11:          Specific error type code

Error Categories:
• Temporary errors (can retry)
  - Resources temporarily unavailable, insufficient balance, etc.
• Permanent errors (don't retry)
  - Amount too small, CLTV expired, channel doesn't exist, etc.
• Node errors
  - Node issues, can bypass this node and retry
• Onion errors
  - HMAC failed, routing data corrupted

常見錯誤代碼

臨時錯誤(可重試)

TEMPORARY_NODE_FAILURE (0x2002)
├── 節點暫時無法處理支付
├── 原因:節點忙碌、重啟中、維護中
└── 處理:稍後重試或繞過此節點

TEMPORARY_CHANNEL_FAILURE (0x1007)
├── 通道暫時無法轉發
├── 原因:餘額不足、HTLC 數量限制
├── 可能包含:channel_update
└── 處理:選擇其他路徑重試

EXPIRY_TOO_SOON (0x100E)
├── CLTV expiry 太接近當前區塊
├── 原因:支付處理太慢
└── 處理:使用更大的 CLTV delta 重試

MPP_TIMEOUT (0x0017)
├── 多路徑支付超時
├── 原因:部分支付未能及時到達
└── 處理:重新發送所有部分

CHANNEL_DISABLED (0x1009)
├── 通道已停用
├── 原因:對方節點離線或維護中
├── 包含:channel_update(disabled 標誌)
└── 處理:更新路由表,選擇其他路徑

永久錯誤(不重試)

INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS (0x400F)
├── 支付詳情錯誤(最終節點返回)
├── 原因:
│   ├── payment_hash 不匹配
│   ├── 金額不正確
│   ├── 發票已過期
│   └── 發票已被支付
└── 處理:檢查發票是否正確

UNKNOWN_NEXT_PEER (0x400A)
├── 下一跳節點未知
├── 原因:通道不存在或已關閉
└── 處理:更新路由圖,重新計算路徑

AMOUNT_BELOW_MINIMUM (0x100B)
├── 金額低於最小限制
├── 原因:低於 htlc_minimum_msat
├── 包含:channel_update
└── 處理:增加金額或選擇其他通道

FEE_INSUFFICIENT (0x100C)
├── 手續費不足
├── 原因:低於通道要求的費率
├── 包含:channel_update
└── 處理:使用新費率重新計算

INCORRECT_CLTV_EXPIRY (0x100D)
├── CLTV expiry 值不正確
├── 原因:不符合 cltv_expiry_delta
├── 包含:channel_update
└── 處理:使用正確的 delta 重試

FINAL_INCORRECT_CLTV_EXPIRY (0x4012)
├── 最終節點的 CLTV 不正確
├── 原因:expiry 不匹配發票要求
└── 處理:使用發票指定的 min_final_cltv_expiry

FINAL_INCORRECT_HTLC_AMOUNT (0x4013)
├── 最終節點收到的金額不正確
├── 原因:金額與發票不符
└── 處理:確保發送正確金額

洋蔥錯誤

INVALID_ONION_VERSION (0x8002)
├── 洋蔥版本不支援
└── BADONION 標誌 + PERM 標誌

INVALID_ONION_HMAC (0x8003)
├── HMAC 驗證失敗
├── 原因:洋蔥資料被篡改或密鑰錯誤
└── 處理:路徑可能有問題

INVALID_ONION_KEY (0x8004)
├── 洋蔥密鑰無效
├── 原因:無法解密下一層
└── 處理:重新計算洋蔥

INVALID_ONION_PAYLOAD (0x8016)
├── 洋蔥 payload 格式錯誤
├── 原因:TLV 編碼錯誤
└── 處理:檢查發送端實現

INVALID_ONION_BLINDING (0x801A)
├── 盲化路由錯誤
├── 原因:盲化點計算失敗
└── 處理:重新計算盲化路徑

完整錯誤代碼表

錯誤代碼速查表:

代碼     名稱                              標誌              處理
─────────────────────────────────────────────────────────────────────
0x0002   invalid_realm                     BADONION+PERM     不重試
0x0003   temporary_node_failure            NODE              可重試
0x0004   permanent_node_failure            PERM+NODE         不重試
0x0005   required_node_feature_missing     PERM+NODE         不重試
0x0006   invalid_onion_version             BADONION+PERM     不重試
0x0007   invalid_onion_hmac                BADONION+PERM     不重試
0x0008   invalid_onion_key                 BADONION+PERM     不重試
0x0009   amount_below_minimum              UPDATE            用新參數重試
0x000A   fee_insufficient                  UPDATE            用新費率重試
0x000B   incorrect_cltv_expiry             UPDATE            用新 delta 重試
0x000C   expiry_too_soon                   UPDATE            用更大 expiry 重試
0x000D   incorrect_or_unknown_payment_details  PERM          檢查發票
0x000E   incorrect_payment_amount          PERM              檢查金額
0x000F   final_expiry_too_soon             -                 加大 CLTV
0x0010   final_incorrect_cltv_expiry       PERM              用正確 CLTV
0x0011   final_incorrect_htlc_amount       PERM              用正確金額
0x0012   channel_disabled                  UPDATE            選其他路徑
0x0013   expiry_too_far                    -                 減小 CLTV
0x0014   invalid_onion_payload             BADONION+PERM     檢查實現
0x0015   mpp_timeout                       -                 重發所有部分
0x0016   invalid_onion_blinding            BADONION+PERM     重算盲化路徑
0x0018   unknown_next_peer                 PERM              更新路由圖

錯誤訊息結構

Error Message Format

update_fail_htlc message:
• channel_id: 32 bytes
• id: u64 (HTLC ID)
• reason: encrypted error message

Decrypted error message:
• hmac: 32 bytes
• failure_len: 2 bytes
• failuremsg: failure_len bytes
  - failure_code: 2 bytes
  - data: depends on failure_code
• pad_len: 2 bytes
• pad: pad_len bytes

Error with channel_update (UPDATE flag):
• failure_code: 2 bytes
• len: 2 bytes
• channel_update: len bytes
  - signature: 64 bytes
  - chain_hash: 32 bytes
  - short_channel_id: 8 bytes
  - timestamp: 4 bytes
  - message_flags: 1 byte
  - channel_flags: 1 byte
  - cltv_expiry_delta: 2 bytes
  - htlc_minimum_msat: 8 bytes
  - fee_base_msat: 4 bytes
  - fee_proportional_millionths: 4 bytes
  - htlc_maximum_msat: 8 bytes (optional)

錯誤處理策略

更新路由資訊

收到帶 UPDATE 標誌的錯誤時,應該驗證並更新本地路由表中的通道資訊。 這包括費率、最小金額、CLTV delta 等參數。

避免失敗節點

收到節點錯誤時,應該在 Mission Control 中記錄。 後續路徑計算時暫時避開此節點或通道,直到懲罰期過後。

重試邏輯

臨時錯誤可以重試,永久錯誤應該放棄或使用完全不同的路徑。 設定最大重試次數避免無限循環。

錯誤識別

解密錯誤訊息時,使用共享密鑰逐層嘗試。 成功解密的層對應返回錯誤的節點。

Mission Control 整合

How Mission Control Uses Errors

Processing after receiving error:
1. Decrypt error, identify failing node
2. Determine penalty severity based on error type
3. Update node/channel success probability
4. Use updated probability in next path calculation

Penalty Strategy Example:

Error Type                            Penalty   Decay Time
----------------------------------------------------------------
TEMPORARY_CHANNEL_FAILURE             Light     1 hour
CHANNEL_DISABLED                      Medium    6 hours
UNKNOWN_NEXT_PEER                     Heavy     Permanent
INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS  None      N/A

Probability update formula:
new_probability = old_probability * decay_factor

Example:
• Initial success probability: 95%
• Received TEMPORARY_CHANNEL_FAILURE
• Penalty: Success probability drops to 60%
• After 1 hour, starts decay recovery
• After 24 hours, returns to baseline probability

調試支付失敗

查看支付失敗原因:

LND:
# 查看支付歷史
lncli listpayments --include_incomplete

# 查看特定支付
lncli trackpayment <payment_hash>

# 詳細錯誤資訊
lncli sendpayment --debug_send ...

CLN:
# 查看支付狀態
lightning-cli listsendpays

# 查看支付嘗試
lightning-cli listsendpays <bolt11>

常見失敗場景診斷:

"TEMPORARY_CHANNEL_FAILURE"
├── 檢查:對方通道餘額
├── 檢查:HTLC 數量是否達到上限
└── 解決:選擇其他路徑或稍後重試

"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"
├── 檢查:發票是否過期
├── 檢查:金額是否正確
├── 檢查:是否已支付過
└── 解決:請求新發票

"UNKNOWN_NEXT_PEER"
├── 檢查:目標通道是否存在
├── 檢查:路由圖是否過時
└── 解決:同步路由圖並重試

相關資源

下一步: 了解 功能位 如何協商節點能力。

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