跳至主要內容
入門

Invoice Expiry 發票過期

了解閃電網路發票的過期機制,為什麼發票會過期以及如何處理。

8 分鐘

為什麼發票會過期?

閃電發票包含過期時間,這是出於安全和實用性的考量。 過期機制防止了多種潛在問題。

預設過期: BOLT 11 發票的預設過期時間是 1 小時(3600 秒)。

過期的原因

為什麼需要過期機制:

安全考量:

1. 匯率波動
   • 發票金額以 satoshis 計價
   • 法幣等值會隨時間變化
   • 長期有效的發票可能導致價格爭議

2. Payment Hash 安全
   • 接收者需要保存 preimage
   • 長期存儲增加洩漏風險
   • 過期後可以安全刪除 preimage

3. 路由資訊時效性
   • 發票可能包含 route hints
   • 通道狀態隨時間變化
   • 舊的路由提示可能不再有效

實用性考量:
• 商家庫存管理
• 訂單超時自動取消
• 減少系統資源占用
• 改善用戶體驗(明確的支付窗口)

BOLT 11 過期欄位

發票過期編碼:

Tagged Field 'x'(expiry):
格式:x + 數據長度 + 秒數(big-endian)

範例:
• x = 3600        → 1 小時後過期
• x = 86400       → 24 小時後過期
• x = 604800      → 7 天後過期

過期時間 = timestamp + expiry

常見設定:
• 即時支付(POS):60-300 秒
• 線上購物:3600 秒(1 小時)
• 捐款/打賞:86400 秒(24 小時)
• 訂閱預付:604800 秒(7 天)

過期處理

發送者行為:
支付前檢查:
if (current_time > invoice.timestamp + invoice.expiry) {
  return ERROR_INVOICE_EXPIRED;
}

錢包通常會:
• 顯示剩餘時間倒計時
• 過期前發出警告
• 過期後拒絕支付

接收者行為:
收到過期發票的支付:
• 技術上:接收者可以選擇接受或拒絕
• 實踐中:大多數實現會拒絕
• 返回錯誤:INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS

最佳實踐:
• 過期後刪除 preimage
• 或標記發票為已過期

BOLT 12 改進

Offers 支持動態生成發票,解決了靜態發票的過期問題。

無過期發票

可以省略 expiry 欄位,但不建議 — 會帶來前述的安全風險。

相關資源

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