従来の BOLT 11 invoice は 1 回きり・金額固定・受信者 ID が露出という制約があり、donation や subscription、refund に向かなかった。 BOLT 12 (Offers) は onion messages を介して動的に invoice を要求できる「再利用可能な支払いエンドポイント」を提供する。 静的 QR code・recurring payments・refunds・blinded paths による sender/receiver privacy を実現し、Lightning の UX を商用 EC やモバイル決済の水準へ引き上げる。
BOLT 11 は「invoice → payment」という 一方通行のフローだった。 BOLT 12 は「offer → invoice_request → invoice → payment」という 双方向の動的やりとりを実現する。 この dialog が onion messages(HTLC を伴わない sphinx packet)の上に構築されることで、受信者匿名性と 動的金額決定を両立する。
Bob が offer 文字列を作成し、QR/URL/DNS で公開。これは一度作れば 永続的に使える。受信者の identity は blinded path に埋められる。
Alice が offer をスキャン → onion message(HTLC を伴わない sphinx packet)で「金額 X の invoice をください」と送る。Alice の identity は payer_key に隠される。
Bob が 動的に invoice を生成(payment_hash 含む)し、onion message で Alice に返送。BOLT 11 invoice と同等の構造を持つが、署名は offer に紐付く。
受け取った invoice を使って 通常の HTLC 支払いを実行。preimage が支払い完了の receipt として機能する。invoice 自体に refund 情報を含めることも可能。
BOLT 12 offer は bech32 encoded で、TLV (Type-Length-Value) フィールドの集合。クリックで各フィールドを展開。
Onion message は BOLT #04 Sphinx packet を payment 以外の用途で再利用する仕組み。BOLT 12 の invoice_request / invoice はこの上で運ばれる。 Lightning ネットワークが「暗号化 messaging layer」としても機能することを意味する。
店舗のレジ横に貼った QR code が 永続的に有効。お客は同じ QR をスキャンするたび新しい invoice が動的生成される。BOLT 11 では不可能だった "1 度印刷すれば終生使える" 体験を実現。
| サービス / Wallet | BOLT 12 対応 | 主用途 | 備考 |
|---|---|---|---|
| Phoenix | ✓ (offer / receive) | 個人受信用 static QR | 2024+ 標準サポート |
| CLN | ✓ Full (since 2021) | routing + merchant | BOLT 12 のリファレンス実装 |
| Eclair | ✓ (2024+) | routing | onion msg DoS 対策進行中 |
| LDK | ✓ (2024+) | mobile / lib | API design 完了 |
| LND | 部分 (議論中) | — | 採用判断が他より遅い |
| Boltz | ✓ (offer-pay) | swap with offer | Loop と類似 |
モバイル wallet は常時オンラインではない。BOLT 12 + trampoline routing + specialized LSP の組み合わせで、受信者がオフライン中でも 支払いを受け取れる仕組みが提案されている。 Phoenix が先行実装し、2024 以降 ecosystem に広がりつつある。
受信者がオフラインだと invoice 発行も支払い受領もできない。モバイル user は wallet を起動しないと無理。
Static offer で常時 publishable / LSP が hold + settle を仲介。受信者は 後でオンラインになるだけで支払いを受け取れる。