チャネル、ホップ、オニオン、ゴシップ!
ライトニングネットワークはビットコインの上で動くセカンドレイヤー技術で、低手数料、高速送金を実現することができます。ライトニングネットワーク(以下、LNと称す)では大きく分けて以下の二つの技術で構成されています。
- ペイメントチャネル
- マルチホップペイメント
ペイメントチャネル
ペイメントチャネルでは、2者間でマルチシグアドレスを生成し、そのアドレス上でお互いの残高を管理していきます。残高の更新があるたびに署名をしますが、この署名されたデータはブロックチェーンへ送信せず、お互いのウォレット内で保管します。こうすることで、2者間で送金があってもブロックチェーンへ送信しないので、ゼロ承認かつゼロ手数料での送金ができるわけです。このマルチシグアドレス上での残高管理・送受信を仮想的なトンネルと見立てたものをペイメントチャネルと呼びます。
ペイメントチャネルは2者間での送金を可能にする技術ですが、もし第3者へ送金したい場合、その第3者ともチャネルを作らないといけないのでしょうか。送金したい相手ごとに作成する必要があるととても不便です。その問題を解決する技術がマルチホップペイメントと呼ばれるものです。
マルチホップペイメント
マルチホップペイメントでは、ビットコインのスマートコントラクトを活用することで、中継者を経由して第3者へ、トラストレスに送金をすることができます。例えばアリスとボブ、ボブとキャロルの間にペイメントチャネルがある場合を見てみます(下記の図を参照)。この時、アリスはボブを経由してキャロルへ送金をすることができるのですが、ここでアリスがボブへ送金してもボブはキャロルへその送金を中継しない場合が考えられます。これだと既存の銀行間送金のような第三者への信頼モデルになってしまいます。そこでアリスはボブへの送金時に「キャロルしか知りえないシークレットがあれば受け取れる」という制約をつけて送金をします。ボブはこの送金を受け取るにはキャロルへシークレットを貰わないといけないので、同様な制約をつけてキャロルへ送金をします。キャロルはこの送金を受け取るためにシークレットをボブへ渡します。そしてボブはアリスからの送金を受け取るためにこのシークレットをアリスへ渡し、送金を受け取ります。
この制約をHTLC(Hash Timelock Contract)と呼び、ハッシュ値の原像(シークレット)を知っている場合は送金を受け取れるが、一定時間過ぎると送金者へ返金されるという制約を使うことで、トラストレスに中継者を経由して送金をすることができます。
以上の仕組みを使うことでLNでは低手数料かつ高速な送金ができるようになっています。
・・・
さて、ここまではLNの主要な送金技術になりますが、LNではその他にも色々な技術が使われています。マルチホップペイメントでの送金では、匿名通信「Tor」で使われているオニオンルーティングという仕組みを使うことで、中継者には最終的な送信者/受信者を分からないようにしています。また各LNノードはペイメントチャネルの情報、主にルーティング手数料の更新や新規チャネル情報、をゴシッププロトコルを使って、ネットワーク全体に情報が拡散されるような仕組みをとっています。このゴシッププロトコルはビットコインノードでも使われている分散システム特有の情報拡散プロトコルです。
このゴシッププロトコルによって各LNノードはチャネル情報を更新していきます。例えば、ボブがキャロルとのチャネルのルーティング手数料を更新した場合、この情報はまずキャロルへ伝播され、またアリスや他のノードへも伝播されます。この情報をもとにアリスはボブを経由してキャロルへ送金する時のボブへ支払うルーティング手数料を計算することができます。もし、ゴシッププロトコルがうまく機能せず、ボブの更新した手数料情報がアリスやその他のLNノードへ伝播されないと、ボブを経由する送金が手数料不足になり失敗することになります。
以下の引用は、BlockstreamのLN開発者Rustによるもので、ゴシッププロトコルの伝播具合を調査した結果です。以下の結果だとTor越しのノードは更新情報を一度も受け取ることがなかったみたいです(これはたまたまだと思いますが)。すべて更新できたのは7ノードで残りの3ノードはいくつかの更新情報が欠けていました。また伝播に要した時間の中央値は3分でした。ゴシップによるデータの伝播はスパムのように悪用することもできるので、伝播間隔やブロックリストなどをうまく活用する必要がありそうです。
ゴシッププロトコルによってチャネル情報が更新されるかのテストは簡単にできるので、もし興味がある方は、上記のツイート元を追ってみてください。