bolt11:lnbc... という invoice 文字列から始まり、Sphinx onion でホップを暗号化し、HTLC をマルチホップでカスケード、
preimage の逆伝搬で atomically settle するまで。1 つの支払いが LN ネットワークを通り抜ける全工程を可視化する。
失敗ケース・blinded paths・MPP・trampoline まで網羅。
Alice (sender) が Dave (recipient) に 10,000 sats を送る最小ケースを追う。Bob と Carol が中継ホップ。
lnbc100u1p... を発行、Alice が解読
Lightning の支払いは通常、受信者が発行する invoice 文字列(bech32 エンコード)から始まる。
lnbc プレフィックス、額、payment_hash、有効期限、payee node id、route hints、機能フラグなどを含む。
SHA256 は preimage resistance を持つ。Dave は R をランダム生成し H = SHA256(R) を invoice に埋める。
経路上のすべてのノードは H を見るが、R を導出することは(暗号学的に)不可能。
Dave だけが R を知っているため、最終的に Dave が R を開示することで支払いが atomic にロック解除される。
Alice はネットワークの gossip graph(BOLT #07 channel_announcement / channel_update から構築)を持っている。 Dave への経路を Dijkstra / Pickhardt MCF で探索し、fee と success probability のトレードオフを最適化する。
送信者は 逆方向に fee と CLTV を組み立てる: 「最終ホップで dest_amount を受け取るには、各ホップで何 sats / 何ブロックの CLTV が必要か」。
| Algorithm | Cost function | Probability | 実装 |
|---|---|---|---|
| Dijkstra (legacy) | Σ fee | 無視 | 初期 LND |
| LND probability-cost | Σ (fee + α · risk) | 独立 prior | LND v0.13+ |
| Pickhardt MCF | min Σ −log(P_success) | min-cost flow | BLW、CLN プラグイン |
| SpeedyMurmurs | spanning-tree based | landmark | 研究のみ |
Alice は BOLT #04 Sphinx 形式で 1300-byte 固定長パケットを構築する。各ホップは 自分の層だけ復号でき、 内部に「次のホップ ID と転送額・CLTV」が含まれる。中間ホップは 送信者・受信者・パス長のいずれも知らない。
各層を順にクリックするか「Peel All」で全層を剥がす。
中間ノードは onion 経由で alice の identity を知らない。pubkey は ephemeral.
中間ノードは Dave が最終受信者であることを知らない(更にホップがあるかも).
1300 byte 固定長 + random padding により、ホップ数が漏れない.
各ホップで HMAC を更新。改竄は次のホップで検出される.
Alice → Bob → Carol → Dave の各ホップで update_add_htlc → commitment_signed → revoke_and_ack という 3 メッセージのラウンドトリップが起きる。 これにより各ホップ間のチャネル commitment が更新され、HTLC が「保留」状態でロックされる。
各ホップは新しい commitment TX に署名する。これは 古い state を放送すれば全額没収される設計(penalty mechanism)。HTLC が加わった新 state を承認する 2 ラウンド trip が必要。
最終ホップ Carol → Dave の HTLC が成立した時点で、Dave は preimage R(H = SHA256(R) の元)を持っている。
Dave が R を Carol に渡す(update_fulfill_htlc)と、Carol は HTLC を unlock し、自身も R を Bob に渡す。
これが Alice まで 逆方向に cascade することで全 HTLC が atomic に settled される。
同一の preimage R がすべてのホップで使われている。Dave が R を開示した瞬間、すべてのホップで preimage path が解錠可能になる。 もし Carol が「Bob に R を渡さない」を選んでも、Bob は on-chain で HTLC を closed し、R を直接観測して preimage path を行使できる(HTLC sweep TX)。 これにより atomicity は protocol レベル + on-chain enforcement の二重で保証される。
R は 支払いの receipt として機能する。merchant は R を保管することで「この payment_hash の支払いが完了した」を非対話的に証明できる。 これは BOLT 12 でより強化された (signed invoice)。
中間ホップで失敗(流動性不足、信号不通など)。エラーが onion-encrypted で逆カスケード。各ホップでさらに encrypt されるため、誰がエラーを発生させたかはみえる、具体的理由はみえない。
ホップの片方がオフラインになった場合、そのホップの HTLC は CLTV expiry まで stuck。受信者の preimage 開示も中継できない。最悪 force-close で on-chain 解決。
HTLC 保留中にチャネルが force-close されると、HTLC sweep TX を時間内(CLTV)に on-chain 提出する必要がある。
Replacement Cycling 攻撃 (2023) はここを突く。
共謀 attacker が経路上で honest 中間ホップを skipし、Bob と Carol を出し抜いて fee を独占する。HTLC の同一 preimage 性に起因。
PTLC で解決可能。
2023 年 10 月に Antoine Riard が公開した Replacement Cycling Attack。攻撃者は HTLC-Success と HTLC-Timeout を交互に mempool replacement することで、honest party の sweep TX を mempool から evict させる。 被害者が CLTV expiry までに sweep を含められなければ HTLC を失う。
対策: 全 LN 実装 (lnd / eclair / ldk) が patch リリース。根本解決は Bitcoin core 側の v3-transactions (TRUC) や package relay (BIP331) 等の mempool ポリシー改善に依存。
BOLT #12 (offers) で導入された blinded paths。受信者が予め blinded route(複数のホップを暗号で blind した経路)を提供し、送信者はそれを onion の末尾に埋めて支払う。 送信者は 受信者の node_id を学習しない。
| 性質 | 標準 onion | blinded path |
|---|---|---|
| Sender knows recipient | YES | NO |
| Receiver gossip required | NO | NO (blinded scids) |
| Private channels supported | partial (route hints) | YES |
| Spec | BOLT #04 | BOLT #04 update + #12 |
| Implementation | all | eclair / cln / lnd partial |
受信者は blinding factor の連鎖で各 blinded ホップの ephemeral pubkey を導出。送信者は introduction node までは通常の onion で到達し、 その後は受信者が事前計算した blinded onion fragment が逐次復号される。
流動性の制約を超えるために、1 つの支払い(同一 payment_hash)を 複数のフラグメントに分割し、それぞれ異なる経路で送る。 すべてのフラグメントが受信側で揃った時点で atomic に settle される。
MPP の拡張として Boomerang や AMP(v0 atomic-mpp)など複数の派生がある。Boomerang は redundant fragments を送り、必要数が到達した時点で settle、余剰は refund する。 LN mainnet では基本的な MPP が deploy されており、AMP は spotlight 上にあるが採用は限定的。
モバイルウォレットは LN gossip graph 全体を持てない(数百 MB 以上)。Trampoline routing は、送信者が trampoline node を信頼し、 その node に「ここから先は適当にルーティングしてくれ」と inner onion を渡す方式。