BOLT — Basis of Lightning Technology

Lightning Network
仕様書完全解説

Poon-Dryja 2016年ホワイトペーパーから BOLT 0〜12 の技術仕様まで、lnd / CLN / eclair / LDK の実装差異を含めてインタラクティブに解説します。

14
BOLT 文書数
(ドラフト含む)
4
主要実装
(lnd/CLN/eclair/LDK)
2016
ホワイトペーパー
公開年
483
HTLC スロット上限
(BOLT 3)
Section 01

Poon-Dryja ホワイトペーパー(2016)

Joseph Poon と Thaddeus Dryja が 2016 年に発表した "The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments" は、すべての LN 実装の起点となった技術文書です。

スケーラビリティ問題
Payment Channel
Commitment TX
HTLC 導入
ネットワーク構造

Bitcoin のスケーラビリティ問題

ホワイトペーパーの第1章は Bitcoin ブロックチェーンの根本的スケーラビリティ制約から始まります。

当時の数字

指標
Bitcoin TPS< 7 TPS
Visa ピーク TPS47,000 TPS
同等処理に必要なブロックサイズ〜8 GB
年間データ量400+ TB

問題の本質

全ノードが全トランザクションを検証する必要があるため、処理量の増加が中央集権化を促進する。ブロックサイズを増やせば、バリデータを維持できる組織が減り、Bitcoin の信頼モデルが崩れる。

解決策の方向性

大多数の取引をオフチェーンで処理し、不正時のみ Bitcoin ブロックチェーンを使用する。

Payment Channel の基本概念

2者間で資金を Bitcoin トランザクションに ロック し、オフチェーンで何度でも残高を更新する。最終的に 1 つのトランザクションのみをブロードキャストする。

チャネルライフサイクル
Alice
funding TX をブロードキャスト
on-chain (1回)
Bob
↓ チャネル確立後 ↓
Alice
commitment TX を交換
off-chain (無制限回数)
Bob
↓ チャネルクローズ時 ↓
Alice
closing TX をブロードキャスト
on-chain (1回)
Bob

Funding TX(開設)

txin:  Alice の資金 + Bob の資金
txout: 2-of-2 MultiSig
       (Alice, Bob 双方の署名が必要)

この 2-of-2 MultiSig output を「チャネル」と呼ぶ。どちらか片方が離脱してもブロードキャストできるよう、commitment TX を事前に合意しておく。

Commitment TX(状態)

txin:  funding TX の 2-of-2 output
txout[0]: Alice 残高 (to_local)
txout[1]: Bob 残高 (to_remote)

状態が更新されるたびに新しい commitment TX を作成・署名し合う。古い commitment TX は無効化(revocation)が必要。

Commitment TX と Revocation(失効)機構

最大の設計課題: 「古い状態(自分が有利な状態)を勝手にブロードキャストされる」を防ぐ。Poon-Dryja はこれを Revocable Sequence Maturity Contract (RSMC) で解決した。

Revocation Key の仕組み

各 commitment TX に対応する revocation key を保持する。チャネル状態を更新するとき、古い revocation key を相手に渡す。これにより古い commitment TX を一方的にブロードキャストすると全額没収されるリスクを負う。
Commitment TX v3 を使いたい場合:
1. Alice が Bob に revocation_key_v2 を渡す
2. Bob が Alice に revocation_key_v2 を渡す
3. 双方が commitment TX v3 に署名

→ v2 をブロードキャストすると相手に
  全額持ち去られる (penalty TX)

to_local スクリプト(BOLT 3)

OP_IF
    # revocation key (相手が持つ)
    <revocationpubkey>
OP_ELSE
    # チャネル更新猶予期間
    <to_self_delay> OP_CSV OP_DROP
    <local_delayedpubkey>
OP_ENDIF
OP_CHECKSIG

自分の残高(to_local)は to_self_delay ブロック待たないと使えない。相手は revocation key を持っていれば即座に取れる。

to_remote(相手の残高)は猶予なし P2WPKH。これが非対称設計の核心。

HTLC — Hash Time-Locked Contract の導入

2者間チャネルを複数の中継ノード経由で接続するため、ホワイトペーパーは HTLC を導入した。

核心アイデア: Receiver が秘密の数値 r を選び、H = HASH(r) を invoice に含める。各 hop は「H の preimage を提示したら支払う(さもなくば期限後に返金)」という条件付き契約を結ぶ。
HTLC 多段決済の流れ
Sender
HTLC(H, T+3Δ)
→ 転送
Alice
HTLC(H, T+2Δ)
→ 転送
Bob
HTLC(H, T+1Δ)
→ 転送
Receiver
Receiver が r を公開 →
Sender
r を学習 → 確定
← 逆流
Alice
r を学習 → 確定
← 逆流
Bob
r を提示
← 取得
Receiver

Timeout の設計(Δ の意味)

各 hop の timeout を段階的に短くすることで、中継者が preimage を持ちながら upstream を騙すことを防ぐ。

Bob: timeout T+1Δ < Alice: timeout T+2Δ
→ Alice の HTLC が期限切れになる前に
  Bob の HTLC が先に期限切れになる

HTLC の限界(ホワイトペーパー時点で既知)

  • 全 hop が同じ hash H を共有 → 経路追跡可能
  • Wormhole 攻撃(中間 hop のスキップ)
  • → のちに PTLC(adaptor signature)で改善予定

ネットワーク全体構造

個別チャネルを組み合わせて全体の Payment Network を形成する。各ノードは直接チャネルを持たない相手にも、中継経路経由で支払える。

ホワイトペーパーが描いた構造

全ノードが全ルートの状態を把握する必要なし
→ ルーティングは各ノードが局所的に判断

onion routing で:
- 送信者が全経路を指定
- 各中継ノードは次の hop しか知らない
- 受信者も送信者を特定できない

設計の重要な前提

SegWit(BIP-141)が前提条件
トランザクション展性(txid 変更攻撃)を解消しないと、funding TX の txid が変わって commitment TX が無効になる危険があった。

2017 年の SegWit 有効化により LN の実用展開が可能になった。

ホワイトペーパーの貢献と限界

要素ホワイトペーパーの提案現実の実装
RevocationRSMC(Revocable Sequence Maturity)BOLT 3 として標準化済み
HTLCHash Time-Lock Contract の設計BOLT 2/3 で厳密化
Routingネットワーク構造の概念的説明Sphinx onion routing(BOLT 4)で具体化
ネットワーク発見言及のみBOLT 7 Gossip protocol として設計
InvoiceなしBOLT 11 → BOLT 12 として追加
Section 02

BOLT 仕様書 詳解

各 BOLT の役割・主要メッセージ・設計の背景をインタラクティブに解説します。クリックして展開してください。

BOLT 0
Introduction & Index
用語集・全文書の目次

BOLT 0 は仕様全体の 目次と用語集 です。実装固有のプロトコルを定義するわけではなく、他のすべての BOLT が参照する共通概念を定義します。

主な定義

用語定義
MUST実装が従わなければならない要件
SHOULD強く推奨されるが例外あり
MAY選択的実装
funding outputチャネル開設の 2-of-2 MultiSig output
commitment number各 commitment TX の単調増加カウンタ

feature bit の規則

odd bit = optional(知らなくても動作可)
even bit = required(知らないなら拒否)

各機能は (n, n+1) のペアで定義される。n が even(required)、n+1 が odd(optional)。
BOLT 1
Base Protocol
TLV エンコーディング・ワイヤーフォーマット・init/ping/pong

すべての LN メッセージが従うワイヤーフォーマットと、接続確立時の基本メッセージを定義します。

メッセージフォーマット

+--------+----------+
| type   | 2 bytes  |
| length | 2 bytes  |
| data   | length B |
+--------+----------+

TLV (Type-Length-Value) 拡張:
+------+--------+---------+
| type | length | value   |
+------+--------+---------+
type: varint(奇数=unknown OK)
Unknown odd-typed TLV は無視してよい。Unknown even-typed TLV はエラー。これにより後方互換を保ちながら拡張可能。

主要メッセージ

init (type=16)
error (type=17)
warning (type=1)
ping (type=18)
pong (type=19)

init メッセージ

type:     16
fields:
  globalfeatures (legacy)
  localfeatures  (legacy)
  tlvs:
    networks  ← genesis block hash リスト
    (feature bits は BOLT 9)

接続時に双方が init を交換して feature bit を合意する。知らない required feature があれば切断。

BOLT 2
Peer Protocol
チャネル開設・更新・クローズのメッセージシーケンス

チャネルのライフサイクル全体(開設→HTLC→クローズ)のメッセージシーケンスを定義します。最も複雑な BOLT の一つです。

チャネル開設
HTLC 更新
クローズ
チャネル開設シーケンス (v1)
Funder
open_channel →
Fundee
Funder
← accept_channel
Fundee
Funder
funding_created →
Fundee
Funder
← funding_signed
Fundee
(funding TX を on-chain でブロードキャスト → 指定ブロック承認待ち)
Funder
channel_ready ↔
Fundee
open_channel の主要フィールド: funding_satoshis, push_msat(開設時のギフト額), dust_limit_satoshis, max_htlc_value_in_flight_msat, channel_reserve_satoshis, htlc_minimum_msat, feerate_per_kw, to_self_delay, max_accepted_htlcs, funding_pubkey, revocation_basepoint, ...
Dual-funded channels (v2): CLN が実装。open_channel2 / accept_channel2 を使い、双方が funding TX に資金を拠出できる。lnd・LDK は未実装。

HTLC 追加・決済シーケンス

Alice
update_add_htlc →
Bob
Alice
commitment_signed →
Bob
Alice
← revoke_and_ack
Bob
Alice
← commitment_signed
Bob
Alice
revoke_and_ack →
Bob
preimage 取得後:
Alice
← update_fulfill_htlc
Bob

HTLC 関連メッセージ

update_add_htlc
update_fulfill_htlc
update_fail_htlc
update_fail_malformed_htlc
commitment_signed
revoke_and_ack
update_fee
revoke_and_ack = 古い commitment TX の revocation key を相手に渡すメッセージ。これにより古い状態のブロードキャストが経済的に不合理になる(違反したら全額没収)。
483 HTLC 上限: max_accepted_htlcs ≤ 483。Bitcoin TX の標準性ルール(weight 上限)から来る制約。スロット枯渇 jamming 攻撃の根因。

Cooperative Close

Alice
shutdown →
Bob
Alice
← shutdown
Bob
Alice
closing_signed ↔ (手数料交渉)
Bob

双方合意なら最短 1 トランザクションで完了。to_self_delay 待ちも不要。

Force Close

片方が離脱した場合、最新の commitment TX を一方的にブロードキャストする。

to_local: to_self_delay 後に受取
to_remote: 即時受取(P2WPKH)
HTLC: HTLC-Success/Timeout TX で解決
注意: force close 後に相手が古い commitment TX を使えば penalty TX で全額没収できる(BOLT 5 参照)。Watchtower がこの監視を担う。
BOLT 3
Transactions
Commitment TX・HTLC TX の構造・スクリプト・Anchor Outputs

BOLT 3 は commitment TX と HTLC TX の厳密な構造を定義します。スクリプト・署名タイプ・手数料計算まで完全に規定されており、実装の中で最も複雑な BOLT です。

詳細は Section 04: BOLT 3 詳解 で解説します。

Commitment TX 構造

txin[0]:  funding output (2-of-2 sig)
txout[0]: to_local (delayed P2WSH)
txout[1]: to_remote (P2WPKH or anchor)
txout[2]: anchor_local (330 sat, optional)
txout[3]: anchor_remote (330 sat, optional)
txout[4+]: HTLC outputs (P2WSH each)

Anchor Outputs (BOLT 3 改訂)

option_anchors 有効時:
- HTLC TX: SIGHASH_SINGLE|ANYONECANPAY
- 両者に 330 sat の anchor output
- force close 時に CPFP で手数料追加可
Anchor Outputs 以前: commitment TX の手数料は事前固定 → block congestion 時に stuck する問題。
BOLT 4
Onion Routing
Sphinx onion・hop payload・Route Blinding

Lightning Network の送信者プライバシーを実現する Sphinx onion routing プロトコルを定義します。2024 年の改訂で Route Blinding が統合されました。

Sphinx Packet 構造

onion_packet:
  version:    1 byte   (=0)
  public_key: 33 bytes (Diffie-Hellman)
  hops_data:  1300 bytes (暗号化された hop 情報)
  hmac:       32 bytes (認証)

各 hop は自分の鍵でのみ復号できる層を剥がし、残りを次の hop へ転送。1300 bytes で最大 20 hop 程度を収容。

Hop Payload (TLV 形式)

amt_to_forward:       転送金額
outgoing_cltv_value:  次の HTLC の timeout
short_channel_id:     次の hop のチャネル ID
payment_data:         (最終 hop) payment_secret + total_msat

Route Blinding(BOLT 4 統合)

受信者が経路の後半部分を暗号化して invoice に含める。送信者は受信者の実 node ID を知らずに送信できる。

Sender
Relay A
Intro Node
blinded →
Blinded 1
Receiver
Intro Node 以降は受信者が暗号化した encrypted_recipient_data を使う。送信者には Intro Node の ID だけが見える。BOLT 12 Offers の受信者プライバシーに使用。

実装状況

実装Route Blinding
lnd実装中
CLN✓ deploy 済
eclair✓ deploy 済
LDK
BOLT 5
On-chain Recommendations
Force close・Penalty TX・チャネル監視

Force Close の処理フロー

1. 最新の commitment TX をブロードキャスト
2. to_remote: 即時使用可能
3. to_local: to_self_delay ブロック後
4. HTLC-Timeout TX: cltv_expiry 後にブロードキャスト
5. HTLC-Success TX: preimage が判明次第

※相手が古い commitment TX をブロードキャストしたら:
→ Penalty TX(breach remedy)で全額没収
Penalty TX の送信猶予時間 = to_self_delay(一般的に 144〜2016 ブロック)。この間に Watchtower が代替監視。

Watchtower との連携

ノードがオフラインの間も breach(古い commitment TX の使用)を検出・応答するために Watchtower を使用。

実装Watchtower
lnd統合型 Altruist Watchtower
CLNプラグイン経由
eclair外部連携
LDKChainMonitor API
lnd の Watchtower は無料・利他的な実装(Altruist)。PISA/Cerberus のような有料モデルは研究段階。
BOLT 7
P2P Node and Channel Discovery
Gossip protocol・channel_announcement・channel_update

Gossip メッセージ

channel_announcement
channel_update
node_announcement
query_short_channel_ids
query_channel_range
reply_channel_range

channel_announcement

short_channel_id: ブロック高+tx位置+out番号
node_id_1, node_id_2: チャネルの両端ノード
bitcoin_key_1, bitcoin_key_2: on-chain 鍵
signatures: 4 個(双方の node/bitcoin 鍵)

チャネル存在の証明として、on-chain funding TX の署名を含む。

channel_update(ルーティングポリシー)

short_channel_id: チャネル識別子
timestamp: 更新タイムスタンプ
cltv_expiry_delta: 中継 HTLC の timeout δ
htlc_minimum_msat: 最小転送額
fee_base_msat: 固定手数料
fee_proportional_millionths: 比例手数料 (ppm)
htlc_maximum_msat: 最大転送額
プライバシー問題: gossip ベースのネットワーク探索では、全チャネル情報が公開される。BOLT 12 + Route Blinding で受信者プライバシーを向上。将来は P2P Gossip の一部を暗号化する研究も進行中。
BOLT 8
Encrypted and Authenticated Transport
Noise XK ハンドシェイク・ChaCha20-Poly1305

Noise XK ハンドシェイク

Act 1 (Initiator → Responder):
  initiator が ephemeral key を生成
  ECDH(ephemeral, responder_static) → shared secret
  → encrypt empty payload

Act 2 (Responder → Initiator):
  responder が ephemeral key を生成
  ECDH(ephemeral_r, ephemeral_i) → shared secret
  → encrypt empty payload

Act 3 (Initiator → Responder):
  initiator が自分の static key を送信
  → 以降 ChaCha20-Poly1305 で暗号化

特徴

  • 相互認証: 双方が相手の node ID を確認
  • Forward Secrecy: セッション鍵は session ごと
  • メッセージ認証: AEAD (Poly1305)
  • Tor 上でも動作(TCP 接続のみ要求)
接続前から相手の公開鍵(node ID)がわかっているため Noise XK パターンを採用(X = 送信者 static key を送信, K = 受信者 static key は既知)。

暗号アルゴリズム

用途アルゴリズム
鍵交換secp256k1 ECDH
ハッシュSHA-256
暗号化ChaCha20-Poly1305
BOLT 9
Assigned Feature Flags
機能ビットの一覧と実装ごとのサポート

実装間で機能を交渉するための feature bit 一覧。init メッセージと node_announcement で交換される。

Bit機能lndCLNeclairLDK
0/1option_data_loss_protect
4/5initial_routing_sync
6/7upfront_shutdown_script
8/9gossip_queries
14/15payment_secret
16/17basic_mpp
20/21option_anchor_outputs
22/23option_anchors_zero_fee
44/45option_channel_type
48/49option_scid_alias
50/51option_zero_conf
12/13option_static_remotekey
BOLT 11
Invoice Protocol
bech32 エンコード invoice・フィールド定義

bech32 Invoice 形式

lnbc10m1p0rsn9qpp5...
│   │  │
│   │  └ データ部 (bech32 エンコード)
│   └─── 金額 (10m = 10 millibitcoin)
└─────── ln + bc (mainnet)
         ln + tb (testnet)
         ln + bcrt (regtest)

主要フィールド(タグ付きデータ)

タグフィールド必須
ppayment_hash (32B)
spayment_secret (32B, MPP用)推奨
ddescription (UTF-8)d or h
hdescription_hash (SHA256)d or h
npayee node_id (33B)
xexpiry (秒, デフォルト 3600)
cmin_final_cltv_expiry
ffallback on-chain address
rrouting hint (プライベート CH用)

BOLT 11 の限界

  • 1 回限り: 各 invoice は payment_hash を 1 回のみ使用可
  • 静的な QR コードが再利用できない
  • 受信者が事前に作成・配布する必要がある
  • 受信者 node ID が invoice に含まれてしまう(プライバシー問題)
→ BOLT 12 Offers でこれらを解決: 再利用可能 endpoint、onion message での動的 invoice 要求、受信者プライバシーの強化。

署名

signature: secp256k1 ECDSA
           (payee node の秘密鍵で)
recovery_flag: (0-3)
→ 公開鍵を復元して検証
BOLT 12
Offers: Recurring Payments
再利用可能 Offer・onion message ベースの Invoice 要求

BOLT 12 は Offer(静的な支払い endpoint)を定義します。受信者が一度 Offer を作ればほぼ永続的に再利用でき、送信者が onion message で動的に invoice を要求します。

フロー

Receiver
Offer を公開(静的 QR など)
Sender
Sender
onion message: invoice_request →
Receiver
Sender
← onion message: invoice
Receiver
Sender
HTLC 送金 →
Receiver

Offer フィールド例

offer_id:        SHA256 of offer TLV
chains:          Bitcoin mainnet
amount:          固定額 or 任意額
currency:        BTC (or fiat)
description:     "Monthly subscription"
issuer:          "Example Co."
quantity_max:    複数個注文可
recurrence:      定期支払い設定

BOLT 11 vs BOLT 12

特性BOLT 11BOLT 12
再利用✗ 1 回のみ✓ 何度でも
受信者プライバシーnode ID 公開blinded path
送信者プライバシーなしonion msg
定期支払い非対応recurrence
金額指定固定動的指定可
署名方式ECDSASchnorr (BIP-340)

実装状況

実装BOLT 12
lnd実装中
CLN✓ deploy 済(2023〜)
eclair✓ deploy 済(2024〜)
LDK
Draft
Simple Taproot Channels
MuSig2 ベースの Taproot チャネル・scriptless scripts

Taproot(BIP-341)と MuSig2(BIP-327)を利用して、commitment TX の出力を通常の Taproot output に見せる プライバシー改善手数料削減 を実現するドラフト仕様。

現在(P2WSH)との比較

現在 (P2WSH):
  funding output → 2-of-2 OP_CHECKMULTISIG
  on-chain に "これは LN チャネル" と見える

Taproot チャネル:
  funding output → P2TR (MuSig2 keypath)
  cooperative close → 通常の keypath spend
  → on-chain では普通の single-sig TX に見える
Cooperative close が on-chain で LN と識別不能になり、プライバシーが大幅向上。Force close 時のみ script path(penalty script)が露出。

技術的詳細

Funding output:
  P2TR with keypath = MuSig2(Alice, Bob)
  tapscript = penalty script (force close 用)

HTLC output:
  P2TR with keypath = MuSig2 adaptor sig
  (PTLC 化の前段階として)

Commitment TX 署名:
  MuSig2 の 2-round 署名プロセスを
  BOLT 2 のメッセージシーケンスに統合

実装状況

実装Taproot CH
lnd実験的 (v0.18+)
CLN開発中
eclairなし
LDK開発中
Section 03

実装比較マトリクス

lnd / CLN / eclair / LDK の BOLT 機能サポート状況と設計思想の違いを整理します。

lnd(Lightning Labs)

Go 実装。gRPC API 中心のフルノード。豊富な API と周辺ツール(Loop/Pool/Terminal)が強み。Taproot チャネルの先行実装。

Go
gRPC
watchtower 統合
MuSig2 (実験的)

Core Lightning(CLN)

C コア + プラグインアーキテクチャ。任意言語でノードを拡張可能。Dual-funded channels・Splicing・BOLT 12 の最速 deploy。

C + plugin
JSON-RPC
Splicing
Dual-funded

eclair(ACINQ)

Scala/Akka 実装。Phoenix モバイルウォレットのバックエンド。Cluster モードで大規模ルーティングノード運用。LSPS2 リファレンス。

Scala
Akka actor
Phoenix/Phoenixd
LSPS2

LDK(Spiral)

Rust ライブラリ。アプリに組み込む設計。チェーン同期・鍵管理・ストレージを呼び出し側が提供(Bring Your Own Component)。

Rust
ライブラリ
ProbabilisticScorer
Swift/Kotlin bindings

機能比較テーブル(詳細)

機能 lnd CLN eclair LDK
コア BOLT 機能
BOLT 1-9 コア
Anchor Outputs
MPP (basic_mpp)
Onion Messages
最新機能
BOLT 12 Offers実装中✓ (2023〜)✓ (2024〜)
Route Blinding実装中
Taproot Channels実験的開発中開発中
Splicing開発中
Dual-funded (v2)
Zero-conf Channels✓ (v0.15+)✓ (v0.0.107+)
固有機能
Watchtower 統合✓ Altruistプラグイン外部連携ChainMonitor API
Circular Rebalancing手動プラグイン✓ 自動
Probabilistic Scoringプラグイン✓ (主力機能)
PostgreSQL バックエンド
Macaroon 認証
Mobile Language Bindings✓ (Phoenix)✓ Swift/Kotlin
: 実装状況は 2026 年時点。各実装は急速に開発が進んでおり、最新状況は公式リポジトリを確認してください。
Section 04

BOLT 3 詳解 — Commitment TX と HTLC TX

BOLT 3 は Lightning Network で最も複雑な仕様です。onchain トランザクションの厳密な構造を定義し、実装のセキュリティの核心を担います。

Commitment TX 構造
HTLC スクリプト
2段階 TX 方式
Dust・スロット制限

Commitment TX の完全構造

version:   2 (または 3 for zero_fee)
locktime:  obscured commitment number
           (privacy のため難読化)

txin[0]:  funding output
  sequence: obscured commitment number

txout (option_anchors 有効時):
  [0] to_local:    P2WSH (delayed)
  [1] to_remote:   P2WPKH or P2WSH
  [2] anchor_local:  330 sat P2WSH
  [3] anchor_remote: 330 sat P2WSH
  [4+] HTLC outputs: P2WSH each

txout (option_anchors なし):
  [0] to_local:    P2WSH (delayed)
  [1] to_remote:   P2WPKH
  [2+] HTLC outputs
obscured commitment number: locktime と sequence に commitment number を XOR で埋め込み、observer がチャネルの状態数を把握しにくくする。

to_local スクリプト

OP_IF
    # Penalty path (相手が revocation key を保有)
    <revocationpubkey>
OP_ELSE
    # Self-spend path (猶予後に自分が使う)
    <to_self_delay> OP_CSV OP_DROP
    <local_delayedpubkey>
OP_ENDIF
OP_CHECKSIG

to_remote(option_static_remotekey 有効時)

P2WPKH(<remote_pubkey>)
# 即時使用可能(猶予なし)
# ただし commitment ごとに同じ鍵を使用
# → バックアップ不要で鍵を管理可能
option_static_remotekey: to_remote が毎回同じ鍵になるため、Watchtower がバックアップなしで penalty TX を構築可能になる重要な改良。

Offered HTLC スクリプト(送信側、option_anchors なし)

# Revocation path: 相手が revocation key を提示して即時没収
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
OP_IF
    OP_CHECKSIG
OP_ELSE
    <remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
    OP_NOTIF
        # HTLC-Timeout TX を経由したローカルノードの回収
        OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
    OP_ELSE
        # Preimage path: 相手が preimage を提示して受け取り
        OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
        OP_CHECKSIG
    OP_ENDIF
OP_ENDIF

Received HTLC スクリプト(受信側)

# Revocation path
OP_DUP OP_HASH160 <RIPEMD160(revocationpubkey)> OP_EQUAL
OP_IF
    OP_CHECKSIG
OP_ELSE
    <remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
    OP_IF
        # Preimage: ローカルノードが preimage で受け取り
        OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
        2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
    OP_ELSE
        # Timeout: 相手が期限後に返金
        OP_DROP <cltv_expiry> OP_CHECKLOCKTIMEVERIFY OP_DROP
        OP_CHECKSIG
    OP_ENDIF
OP_ENDIF

3 つの解決パス

パス誰が条件
Revocation相手ノードrevocation key を保有
Preimage受信者payment preimage を提示
Timeout送信者HTLC-Timeout TX 経由
option_anchors 追加時: CSV 1 ブロックの遅延が Revocation と Preimage パスに追加される。これによりピニング攻撃(HTLC TX を mempool に固定する攻撃)が困難になる。

なぜ 2 段階 TX が必要か

commitment TX の force close 後、HTLC output の解決に 2 つの別 TX(HTLC-Success / HTLC-Timeout)を使う。

理由: commitment TX の to_local は to_self_delay を待つ必要がある。しかし HTLC には独自の cltv_expiry がある。2 つの遅延を直接合算すると経路全体の timeout が不必要に長くなるため、HTLC output を別 TX で先に解決し、その output に to_self_delay をかける 2 層構造を採用。

HTLC-Success TX(受信 HTLC の成功)

version:  2
locktime: 0

txin[0]: commitment TX の received HTLC output
  witness: 0 <remotehtlcsig> <localhtlcsig> <preimage>

txout[0]: P2WSH (to_self_delay 後に使用可)
  script:
    OP_IF
        <revocationpubkey>  # penalty path
    OP_ELSE
        <to_self_delay> OP_CSV OP_DROP
        <local_delayedpubkey>
    OP_ENDIF
    OP_CHECKSIG

成功条件: preimage + 相手の HTLC 署名が必要。これにより「相手なしに勝手に HTLC を解決できない」。

HTLC-Timeout TX(送信 HTLC のタイムアウト)

version:  2
locktime: cltv_expiry  # ← HTLC の期限

txin[0]: commitment TX の offered HTLC output
  witness: 0 <remotehtlcsig> <localhtlcsig> <>
           # preimage なし

txout[0]: P2WSH (同じく to_self_delay 後)
  script: 同上 (to_local と同じ delayed 構造)

タイムアウト後にのみ有効: locktime = cltv_expiry により期限前のブロードキャスト不可。remotehtlcsig が必要 → local node が単独で操作できない。

option_anchors 時: SIGHASH_SINGLE|SIGHASH_ANYONECANPAY で署名 → 後から fee input を追加して手数料を調整できる。

Dust HTLC と 483 スロット制限

Trimmed HTLC(Dust 以下)

dust_limit_satoshis(例: 546 sat)を
下回る金額の HTLC は:

option_anchors なし:
  → commitment TX の miner fee に加算
  → onchain に output が現れない

option_anchors あり:
  → shared_anchor output に加算
リスク: force close 時に trimmed HTLC は全額失われる。griefing 攻撃(dust HTLC を大量送付)で相手のチャネル手数料を吊り上げる攻撃も可能(fee siphoning)。

483 HTLC スロット上限

1 commitment TX に格納できる HTLC output は最大 483 個

計算根拠:
  Bitcoin TX 標準性: max weight = 400,000 wu
  commitment TX の overhead (input/output) を差し引き
  offered HTLC P2WSH weight ≈ 172 wu
  received HTLC P2WSH weight ≈ 170 wu
  → max HTLC ≈ 966 / 2 = 483
Channel Jamming の根因: 攻撃者が 483 個の小額 HTLC を送り、タイムアウトまで保持することでノードのスロットを枯渇させる(Slot Jamming)。HTLC Endorsement による優先度付けや upfront fee が対策候補。

実装ごとのデフォルト

実装デフォルト max_accepted_htlcs
lnd483 (最大値)
CLN483
eclair30 (デフォルト、設定可変)
LDK50 (推奨デフォルト)
Section 05

LN 仕様の進化と将来

過去の主要マイルストーン

2016年1月
Poon-Dryja ホワイトペーパー公開
HTLC・Commitment TX・Revocation の原型を提案。SegWit 前提。
2016年下半期
BOLT 1.0 策定開始
BOLT 1-11 の初期版を lnd/CLN/eclair の開発者が共同策定。
2017年8月
SegWit 有効化(BIP-141)
LN の前提条件が整い、本格展開が可能に。
2018年3月
LN mainnet 本格稼働
lnd 0.4 / CLN / eclair が相互運用テストを経てリリース。
2020年
MPP(Multi-Path Payment)deploy
eclair が最速で実装。payment_secret と basic_mpp feature bit が標準化。
2021年
Taproot(BIP-341)有効化
PTLC・Taproot チャネルの技術的基盤が整備。
2021-2022年
Anchor Outputs 標準化
BOLT 3 改訂。CPFP 対応で force close の手数料問題を解決。
2023-2024年
BOLT 12 / Route Blinding deploy
CLN・eclair・LDK が本番展開。lnd は実装中。

未解決・進行中の仕様

PTLC(Point Time-Locked Contract)

HTLC の hash を Schnorr adaptor signature(EC point)で置き換える。経路プライバシーの根本改善。

状況: 全実装で未 deploy。Simple Taproot Channels が前段階。HTLC との後方互換維持が主な課題。

Splicing

チャネルを閉じずにオンチェーンで資金を追加・引き出し。CLN が 2023 年に deploy 済み、eclair が開発中。

BOLT 化はまだ進行中。CLN の実装が事実上の参照実装として扱われている。

Channel Jamming 防御

HTLC Endorsement + Upfront Fee の組み合わせが最有力候補(SoK, AFT 2024)。しかし具体的な設計パラメータが未合意。

仕様レベルの合意なし。研究コミュニティで活発に議論中。

eltoo / LN-Symmetry

Revocation 機構を廃止し、最新状態のみブロードキャストできる対称チャネル。BIP-118 (ANYPREVOUT) が必要 → Bitcoin に未採用。

BIP-118 のコンセンサスが進まず、実現の目処は不明確。

Post-Quantum 対応

adaptor signature・MuSig2 など LN の暗号基盤は量子コンピュータ脆弱。格子暗号ベースの adaptor signature 研究が始まっているが、実用的な仕様はない。

仕様策定への参加: BOLT は GitHub lightning/bolts リポジトリで議論・開発。Lightning Summit(年次会議)での合意が各 BOLT のマイルストーンとなる。提案は Lightning-dev メーリングリストまたは GitHub Issues で行う。