BOLT #12 · Offers · Reusable Invoices · Onion Messages

BOLT 12 — Offers
Lightning の支払いプロトコルを再設計する

従来の BOLT 11 invoice1 回きり・金額固定・受信者 ID が露出という制約があり、donation や subscription、refund に向かなかった。 BOLT 12 (Offers)onion messages を介して動的に invoice を要求できる「再利用可能な支払いエンドポイント」を提供する。 静的 QR code・recurring payments・refunds・blinded paths による sender/receiver privacy を実現し、Lightning の UX を商用 EC やモバイル決済の水準へ引き上げる。

SpecBOLT #12 (offer-encoding)
設計者Rusty Russell, ZmnSCPxj 他
First mainnetCLN v0.10 (2021), Eclair / Phoenix 2024+
基盤Onion Messages + Blinded Paths
Reusable
同じ offer を何度でも
Static QR
紙印刷でも有効
Privacy ✓
受信者 ID 隠蔽
Refund
protocol level で支援
§ 1 · The Problem

BOLT 11 invoice の根本的限界

😟 BOLT 11 — 1 回きりの invoice

lnbc100u1p3xnhl2pp5jptse... ↑ 同じ amount・同じ payment_hash
  • 1 度払うと 同じ invoice 再使用不可
  • 金額は 事前固定 (donation 不可)
  • 受信者 node_id が露出
  • 有効期限あり (default 1 時間)
  • QR code を 毎回再生成必要
⛔ 静的 QR code として使えない

😎 BOLT 12 — Reusable offer

lno1qcp4256ypqxcv... ↑ 何度でも使える offer
  • 同じ offer を任意回数使える
  • 金額 固定 / range / any 全て対応
  • 受信者 blinded path で隠蔽
  • 有効期限を任意設定(数年も可)
  • QR を 1 回印刷すれば永続
✨ Coffee shop / poster / website OK

本質的な変化: "支払い前に通信できる" モデルへの移行

BOLT 11 は「invoice → payment」という 一方通行のフローだった。 BOLT 12 は「offer → invoice_request → invoice → payment」という 双方向の動的やりとりを実現する。 この dialog が onion messages(HTLC を伴わない sphinx packet)の上に構築されることで、受信者匿名性動的金額決定を両立する。

§ 2 · The 4-Step Protocol

offer → invoice_request → invoice → payment

Step 0 / 4
Alice (payer) Bob (merchant) ① Offer (公開・QR印刷・URL) "I accept payments for X" ② invoice_request (onion message) "Please send me an invoice for $5" ③ invoice (onion message) "Here's a fresh invoice with payment_hash" ④ payment (HTLC, normal Sphinx) → preimage cascade ← (settlement)
Press Play to walk through the 4-step BOLT 12 flow.

各ステップの詳細

Offer publication

Bob が offer 文字列を作成し、QR/URL/DNS で公開。これは一度作れば 永続的に使える。受信者の identity は blinded path に埋められる。

Invoice request

Alice が offer をスキャン → onion message(HTLC を伴わない sphinx packet)で「金額 X の invoice をください」と送る。Alice の identity は payer_key に隠される。

Invoice issue

Bob が 動的に invoice を生成(payment_hash 含む)し、onion message で Alice に返送。BOLT 11 invoice と同等の構造を持つが、署名は offer に紐付く。

Payment

受け取った invoice を使って 通常の HTLC 支払いを実行。preimage が支払い完了の receipt として機能する。invoice 自体に refund 情報を含めることも可能。

§ 3 · Offer Anatomy

lno1... 文字列の中身を解読する

BOLT 12 offer は bech32 encoded で、TLV (Type-Length-Value) フィールドの集合。クリックで各フィールドを展開。

lno1qcp4256ypqxqvpe2y4dtwl5ja3v7c3kgr8eyxz3vryp4mln78q5ksztsy23wu0wnzjeyk5usnk8emzjyxsyf8thr8j8jaagj70wssfnaq7g

Offer / Invoice Request / Invoice の関係

# offer (公開) { chains: [bitcoin], amount: 5000_msat, description: "Coffee at Bob's Cafe", issuer: "Bob's Cafe", blinded_paths: [<blinded route to Bob>], signature: <Bob's Schnorr sig> } # invoice_request (onion message から) { offer_id: hash(offer), # 元 offer を指す amount: 5000_msat, # 確定額 payer_key: <Alice's ephemeral pubkey>, payer_note: "Thank you Bob!", signature: <Alice's sig over invoice_request> } # invoice (onion message から) { payment_hash: H = SHA256(R), amount: 5000_msat, payer_key: <Alice's pubkey>, # 紐付け cltv_expiry: ..., blinded_paths: [<route(s) to Bob>], signature: <Bob's sig binding all of above> } # Now Alice pays this invoice as normal HTLC
§ 4 · Onion Messages

HTLC を伴わない通信レイヤー

Onion message は BOLT #04 Sphinx packet を payment 以外の用途で再利用する仕組み。BOLT 12 の invoice_request / invoice はこの上で運ばれる。 Lightning ネットワークが「暗号化 messaging layer」としても機能することを意味する。

Alice Carol Dave Bob onion msg (no HTLC) onion msg (no HTLC) onion msg (no HTLC) Same Sphinx packet structure as payments — but payload は message, not HTLC fields Hops are stateless: "forward to next" only — no commitment update needed

✅ Onion Messages の利点

  • 支払い前の 双方向通信が可能
  • HTLC スロットを消費しない(jamming に強い)
  • 受信者・送信者ともに blinded
  • BOLT 12 以外の用途にも拡張可能(async payments, NIP-47 風 wallet connect)

⚠ DoS 課題

  • 送信に手数料がない → 大量送信で中継ノード負荷
  • "Onion Messages on Leash" (FC 2024) が DoS 解析と緩和を提案
  • rate-limiting / token bucket / proof-of-work 系の対策が議論中
  • Eclair / CLN / lnd で支援状況がまだ温度差あり

Sphinx packet の payload type 拡張

Sphinx packet (1366 bytes total): { version: 0x00, public_key: ephemeral_pubkey, hops_data: [ { hop_type: # key innovation - 0: HTLC payload (BOLT #04 standard) - 1: onion message payload (BOLT #04 update) ... } ... ], hmac } # Same routing infrastructure, different payload semantics
§ 5 · Use Cases

BOLT 12 が初めて実用化するシナリオ

📌 Static QR Code (固定 QR)

店舗のレジ横に貼った QR code が 永続的に有効。お客は同じ QR をスキャンするたび新しい invoice が動的生成される。BOLT 11 では不可能だった "1 度印刷すれば終生使える" 体験を実現。

既存サービスでの採用

サービス / WalletBOLT 12 対応主用途備考
Phoenix✓ (offer / receive)個人受信用 static QR2024+ 標準サポート
CLN✓ Full (since 2021)routing + merchantBOLT 12 のリファレンス実装
Eclair✓ (2024+)routingonion msg DoS 対策進行中
LDK✓ (2024+)mobile / libAPI design 完了
LND部分 (議論中)採用判断が他より遅い
Boltz✓ (offer-pay)swap with offerLoop と類似
§ 6 · Async Payments — 受信者がオフラインでも

BOLT 12 + trampoline で可能になる「オフライン受信」

モバイル wallet は常時オンラインではない。BOLT 12 + trampoline routing + specialized LSP の組み合わせで、受信者がオフライン中でも 支払いを受け取れる仕組みが提案されている。 Phoenix が先行実装し、2024 以降 ecosystem に広がりつつある。

Alicepayer LSP / Trampoline (always-on, holds funds) 1. 受信を Hold 2. Bob のオンライン待ち 3. オンラインになり次第 forward → settle 📱 Bob offline 💤 (later: comes online) payment + offer delayed forward

従来との比較

BOLT 11 のオフライン受信問題

受信者がオフラインだと invoice 発行も支払い受領もできない。モバイル user は wallet を起動しないと無理。

BOLT 12 + LSP のオフライン受信

Static offer で常時 publishable / LSP が hold + settle を仲介。受信者は 後でオンラインになるだけで支払いを受け取れる。

関連する未解決課題

§ 7 · Adoption Status (2021 → 2026)

各実装・wallet の BOLT 12 対応

採用タイムライン

2019-12 Rusty Russell が初稿提案 (lightning-dev ML) 2020-2021 spec design (TLV format, Schnorr signatures) 2021-09 CLN v0.10 — 初の experimental BOLT 12 サポート 2022-23 Eclair / LDK 設計議論 2023-07 Phoenix wallet が BOLT 12 receive 対応 2024-02 Eclair が full offer-pay 実装 2024-03 Phoenix v2.2 splicing + offers 2024-07 LDK が offer-pay 実装 2025-Q1 CLN BOLT 12 が "experimental" → "stable" 移行 2025-Q2 Strike / Wallet of Satoshi が offer-receive 検討 2026-Q1 Boltz, Mutiny がフル対応 2026-mid LND が部分採用議論
5+
主要 LN 実装が対応
2021
CLN 初実装
2024
Phoenix mainnet 安定化
5
主要 use case 対応済
§ 8 · Resources & Related Pages

関連する HTML / wiki / spec

本サイト内のビジュアル解説

主要リファレンス

  • 📜 BOLT #12 — Offer Encoding spec (lightning/bolts repo)
  • 📜 BOLT #04 (update) — Onion Messages
  • 📰 Bitcoin Optech — BOLT 12 / Offers topic page
  • 📰 Rusty Russell — original proposal (2019-12)
  • 📰 Bitcoin Optech — Async Payments topic page
  • 📄 Onion Messages on Leash — DoS analysis FC 2024
  • 🔧 Core Lightning — first BOLT 12 implementation (v0.10+)
  • 🔧 Phoenix Wallet — first mobile BOLT 12 (v2.2+)