高級
BOLT12 Offers
深入理解 BOLT12 Offers,閃電網路的下一代支付請求協議。
20 分鐘
什麼是 BOLT12?
BOLT12 是閃電網路規範的重大更新,引入了「Offers」概念——一種可重複使用的支付請求格式。 與一次性的 BOLT11 發票不同,Offers 可以永久有效,並支持更豐富的功能, 如訂閱支付、退款、和更好的隱私保護。
為什麼需要 BOLT12? BOLT11 發票設計上是一次性的,每次支付都需要新發票。 BOLT12 Offers 解決了這個問題,同時帶來了更好的隱私和功能。
BOLT11 vs BOLT12
| 特性 | BOLT11 | BOLT12 |
|---|---|---|
| 使用次數 | 一次性 | 可重複使用 |
| 金額 | 固定或為空 | 固定、範圍或付款者決定 |
| 有效期 | 通常 1 小時 | 可永久有效 |
| 付款者隱私 | 有限 | 支持盲化路徑 |
| 收款者隱私 | 節點 ID 暴露 | 可隱藏節點 ID |
| 退款支持 | 無 | 內建支持 |
| 格式前綴 | lnbc... | lno...(offer) |
Offers 工作流程
1
創建 Offer
商家創建一個 Offer(lno1...),包含描述、金額範圍等資訊
2
發送請求
付款者掃描 Offer,通過洋蔥訊息發送 invoice_request
3
返回發票
商家收到請求,生成專屬發票並通過洋蔥訊息返回
4
完成支付
付款者收到發票,按正常流程完成閃電支付
Offer 格式解析
# 範例 Offer
lno1qgsqvgjwvd...(bech32m 編碼)
# 解碼後的內容
offer_id: 8a3c...
description: "Coffee Shop Tips"
issuer: "Bitcoin Cafe"
amount_msat: 0 (付款者決定)
features: 0x0200
paths: [blinded_path_1, blinded_path_2]
node_id: (隱藏,使用盲化路徑) 關鍵功能
盲化路徑 (Blinded Paths)
收款者可以提供「盲化路徑」而非真實節點 ID。 付款者只知道路徑的入口點,無法得知最終目的地。
A → B → ??? → ??? → 收款者
(後半段路徑被加密)
(後半段路徑被加密)
洋蔥訊息 (Onion Messages)
BOLT12 使用洋蔥訊息進行通訊,無需建立通道即可發送訊息。 這允許匿名請求發票。
- • 無需支付即可通訊
- • 端到端加密
- • 支持回覆路徑
應用場景
🎁
靜態支付碼
一個 Offer 可以永久使用,適合打賞、捐款
🔄
訂閱服務
定期支付服務費,無需每次生成新發票
↩️
退款機制
商家可以通過原支付路徑發起退款
🔒
隱私支付
盲化路徑保護收款者身份
📱
NFC 支付
Offer 可嵌入 NFC 標籤,簡化線下支付
⚡
自動支付
結合 LSP 實現自動化支付流程
Offer 類型
| 類型 | 前綴 | 用途 |
|---|---|---|
| Offer | lno1... | 收款者發布,請求付款 |
| Invoice Request | lnr1... | 付款者發送,請求發票 |
| Invoice | lni1... | 收款者回應,包含支付詳情 |
| Invoice Error | - | 錯誤回應 |
實現狀態
| 實現 | 狀態 | 備註 |
|---|---|---|
| CLN (Core Lightning) | ✓ 完整支持 | Rusty Russell 主導開發 |
| LDK | ✓ 已支持 | Spiral 開發 |
| Eclair | ✓ 已支持 | ACINQ |
| LND | ⏳ 開發中 | 計劃支持 |
| Phoenix | ✓ 已支持 | 移動端錢包 |
CLI 範例
# 創建 Offer (CLN)
lightning-cli offer any "Coffee tips"
# 返回:
# "bolt12": "lno1qgsqvgjwvd..."
# "offer_id": "8a3c..."
# 從 Offer 獲取發票
lightning-cli fetchinvoice lno1qgsqvgjwvd... 10000
# 支付 BOLT12 發票
lightning-cli pay lni1qqs... 最佳實踐: 對於需要接收多次支付的場景(如打賞、訂閱),優先使用 BOLT12 Offers 而非 BOLT11 發票。 這不僅提供更好的用戶體驗,還增強了隱私保護。
已複製連結