つい最近、ライトニングネットワーク実装の1つであるLndのバージョン0.12.0がリリースされました。メジャーバージョンアップらしく、機能追加や性能向上が盛りだくさんです。中でも目玉なのはAnchor Outputsを利用したチャネルが既定で作成されるようになったことです。これは去年話題になったLNに対する攻撃の1つを軽減する効果のある変更で、まだ正式にBOLT (ライトニングネットワークの標準プロトコル)に採用されてはいませんが今後標準化される可能性があります。今日はAnchor Outputsがどのように安全性を向上するのか見ていきます。

問題:LNノードに対する攻撃

去年、こちらのコラムでも何回かLNに対する攻撃方法として発表されているものを紹介しました。ほとんどが資金を一定期間ロックしてしまうDoS攻撃に分類されますが、中でも"Flood and Loot"と呼ばれるものはDoS攻撃の結果として資金の盗難につながってしまう可能性のある攻撃でした。Flood and Lootの概要を要約すると、攻撃者が大量のチャネルを開設し、様々な経路を通り別の自分のノードに対して支払う大量のトランザクションを生成します。HTLCの解決の最後の段階で、1ホップ目のノードがプリイメージを返してきてもオフラインのフリをします。この段階で攻撃者は手数料を引いた金額をすでに受け取っているが、最初の支払いを拒否している形になります。これに対して1ホップ目のノードは払い損を防ぐため、チャネルを強制決済することになります。しかし、同じ状況のチャネルが多数、同時に期限を迎えてオンチェーンで決済されることとなると、ブロックに取り込まれずタイムアウトしてしまうものも出てきます。すると、今度は攻撃者がHTLCタイムアウトトランザクションを発行して支払いを取り消すことができてしまいます。攻撃者はかなり有利な立場で、事前に非協力的クローズ時の手数料を一方的に(安く、ブロックに取り込まれにくい水準に)提案することができるほか、HTLCタイムアウトトランザクションは攻撃者が単独で手数料を追加することができる一方で非協力的クローズの手数料を被害者が単独で追加することはできません。さて、Lnd v0.12.0から既定となったAnchor Outputsによるチャネルはこの攻撃をどのように軽減するのでしょうか。

今回導入された軽減策:ANCHOR OUTPUTS

Anchor Outputsとは、簡単に言えばチャネルのコミットメントトランザクションに追加される、チャネルを開設する両者がコントロールする2つのダスト出力(330 sats)のことです。これを使うと、チャネルクローズ時のトランザクションに必要に応じてチャネルの両端どちらのユーザーもCPFPを使って単独で手数料を追加することができます。

CPFP (Child Pays for Parent)…未承認のトランザクションからの出力を入力とするトランザクションを作成し、高い手数料を支払うことで実質的に親トランザクションの手数料が増加したようにマイナーに扱ってもらう方法。
マイナーからすると「このトランザクションを承認すれば、手数料がめっちゃ高い子トランザクションも承認できる」というもの。
実行には別途オンチェーンの残高が必要なため、LND v0.12.0からはオンチェーンの残高の一部が必ず備蓄される(チャネルに利用できない)。

Flood and Lootの例で言うと、攻撃者がトランザクションの手数料を一方的に設定できる有利な状況が改善されました。もし非協力的チャネルクローズのタイミングで手数料が高騰していれば、被害者もCPFPで手数料を追加してタイムアウトする可能性を軽減できます。他にもメリットとして、協力的なチャネルクローズの際も、急いでいる方のユーザーが手数料を追加することができるため、チャネル運用の自由度が上がります。(その代わりオンチェーンのフットプリントは大きくなりますが)ではなぜこれがFlood and Lootの解決ではなく軽減かというと、単純にオンチェーンのスループットが限られているため、どれだけ手数料を追加できても例えば同時に大量に非協力的チャネルクローズが発生したら期限までに取り込まれないものも出てくるからです。これはAnchor Output単体で解決できる問題ではなく、見知らぬノードからのチャネル開設を受け入れることに関するリスクなので、このようなポリシーのノードはリスクの対価として手数料を高くしたり、他の軽減策を併用する必要があります。【追記】Anchor Outputsのチャネルは強制決済時に複数のHTLCをまとめることができるようなので、これもFlood and lootタイプの攻撃への耐性を向上させています。

おわりに

Flood and loot自体は以前にも書いたように、かなり根本的な問題なので対策は難しいと思います。特に、攻撃に使用した資金のほとんどを最初の段階で受け取っているため攻撃者へのリスクが小さく、攻撃者となり得るノードからのチャネル開設を受け入れることのリスクプレミアムは相当高いべきなのではないかと思います。ノードの経歴などを元に何かしらのレピュテーションシステムが生まれ、評価の低いノードや新しいノードはけっこう高い手数料を求められるようになるかもしれません。ヤフオクやメルカリでも、まだ評価のないユーザーの出品には警戒しますし、落札金額や購入金額が安くなる傾向があると思います。(自分はそうでした)Lnd v0.12.0からチャネル開設時に既定で含まれるようになったAnchor Outputsについて解説させていただきました。