はじめに
Lightning Networkについて勉強している慶應SFC生です。
今回はオフチェーンでトラストレスな送金ができる仕組みにの解説。
(2020/01/18:追記)今見たらただのペイメントチャネルの説明にしかなっていなかった。(私の理解が足りてなかった。)
これではLNの魅力が伝わらないのでマルチホップに注目したLNの記事を書いた。
#Lightningがやりたいこと
ずばり、
オフチェーンで少額で即座にトラストレスな送金をしたい
ただ、今のビットコインにはそれはできません。
Bitcoinではこんな問題点が
- 手数料が高すぎて少額の送金ができない
- マイニングされるまで最大10分待つ必要があり即座の送金はできない
これが俗に言うスケーラビリティ問題ってやつです。
Lightning Networkの決済の流れ
Lightning Networkの決済の流れはこの動画がめちゃめちゃわかりやすいのこれを見た方が早いかも。
【動画で学ぶブロックチェーン】新しいオフチェーンコントラクトeltooとSIGHASH_NOINPUT - 安土 茂亨氏
###準備フェーズ
オフチェーンでの決済のための準備段階
1.Opening transaction … 一方もしくは両方のコインをブロックチェーンに ロックしFunding Txを作成。金庫にコインをしまうイメージ。
2.お互いに秘密鍵とそのHashを生成。Hashをだけを交換。

3.お互いに相手から受け取ったHashを使ってFunding Txのoutputをinputにした Commitment Txを作り署名を付与してから交換する

これでお互いに相手が作成し、相手が署名したCommitment Transactionを持っていることになる。
(Commitnent tx1はチャンネル開設直後の異常系の処理の意味を持ちます。開設した直後どちらかのノードが死んだ場合、これをブロードキャストしマルチシグに預けたコインを各々に返金します。)
ここでFunding Transactionに署名し、ネットワークにブロードキャストし、チャネルをオープンする。これでようやく準備完了。
###決済フェーズ
また新しい秘密鍵を作りhashを交換。
決済のために新しいCommitment Txを更新することでオフチェーン上で送金を行う。
下の画像ではBobが0.2BTCを送金した内容のCommitment Txを作っている。
###決済終了
チャンネルをクローズすることでCommitment transactionをブロードキャストし、決済を終了。最新のCommitment Transaction であるCommitment Tx2のOutputを元にClosing Transactionがで、Aliceに1.2、Bobに0.8BTCが支払われる。結果このPayment channelではBobがAliceに0.2BTC支払ったことになる。

#例 ) Bitcoin支払いのインターネット広告サービス
Bitcoin支払いのインターネット広告サービスを例にして見ます。(完全に自分で考えた例なのでこれがあっているのかは分からない)
・Alice ... Webサイト運用者
・Bob ... インターネット広告代理店の人
Bobの務めるインターネット広告代理店のサービスの内容が以下。
Bobの会社のサービス内容
1.Webサイト運用者と契約し、サイトに広告を埋め込む。
2.サイトの利用者が広告をクリックするたびに、運用者は0.1BTCもらえる。
3.その0.1BTCは広告代理店から運用者に即座に送金される。
4.サイト運用者は月最大5BTCまでもらえる。
1はよくあるのインターネット広告の仕組みと同じなので説明はしません
2~4がLightning Networkではどう言う処理に当たるのかを解説します。
わかりやすくするため4から説明します。
Lightning上でのBobの会社のサービス内容の処理
4.Bobが5BTCを預けAliceとの2of2マルチシグを開設します。この内容はfunding transactionとして一度ブロードキャストします。月の最終日にはチャンネルをクローズし、その時点の広告収入を最終的な収入とし、最新のCommitment TransactionからClosing Transactionを作りブロードキャストします。
2.3.Webサイト上で広告をクリックされたことがスイッチとなり、2of2マルチシグの中で(オフチェーンで)Bobは0.1BTCをAliceに送金します。
###Bobの会社の支払い日
結果的にこの月にAliceのWebサイトで広告をクリックした人は30人だったとしましょう。
Aliceには
0.1BTC * 30 = 3.0BTC
送金されます。

上の図のようにオフチェーン状にたくさんのCommitment Transactionができています。この中で、最新のCommitment TransactionであるTx30を元にClosing Transactionを作りブロードキャストするとAliceにBobから3.0BTC送金されたことが確定します。

###こんなパターンもあり得る(おまけ)
(おまけ1)Aliceのサイトで50人以上が広告をクリックしました。Bobの会社のサービスは月最大5BTCまでしか貰えないので、それ以上クリックされても送金はされません。そして50人クリックした時点でチャンネルをクローズし、Aliceに5BTC入るようなClosing Transactionを作りその月の最終的なAliceの収入としてそれをブロードキャストします。
(おまけ2)Aliceが月の中旬ごろにサイトを閉鎖しました。その時Aliceのサイトでは5人の人が広告をクリックしていました。Aliceはその時点での広告収入(0.5BTC)が欲しいです。最新のCommitment TransactionはAliceのOutputが0.5BTC、BobのOutputが4.5BTCであることがわかります。この最新のommitment transactionでClosingすればAliceに0.5BTCが支払われます。
オンチェーンで送金されるサービスだったら
もしこれがオンチェーンで行われるサービスだったとしたら、1クリックされるたびにBobからAliceへ0.1BTC送金する内容のTransactionをブロードキャストしないといけません。
この例ではわかりやすくするため、1クリック0.1BTC(現時点で約10万円)と設定しましたが、実際のインターネット広告では1クリック0.1円くらいですよね。0.1円の送金をいちいちブロードキャストしていたら、クリックされるたび高い手数料を払わないといけず、大赤字になります。
即座の送金してる?
Bobの会社のサービス内容の3番に
「その0.1BTCは広告代理店から運用者に即座に送金される。」
とあります。にも関わらず、最終的な収入って何?と思った方。説明しましょう。
このオフチェーンの決済はマルチシグ内でやりとりされている間は使えません。最終的なAliceの取り分、Bobの取り分の結果だけをブロードキャストします。
つまり、最初にマルチシグを作った時点で5BTCは固定され、Closing Transactionがブロードキャストされるまで利用することはできません。
しかしこのオフチェーンで行われた取引は必ず送金されるようになっています。
1クリックによりAliceに0.1BTC送金されたと言うオフチェーンでの決済内容は有耶無耶にすることはできないのです。
なのでClosing Transactinがブロードキャストされるまで貰えないがこの0.1BTCは必ず送金されることが保証されているので実質送金されたみたいなもんっていうのがLightning Networkにおける即座の送金というやつです。
これについてはLightningがトラストレスに送金できると豪語する理由を理解するとよりわかりやすいかもしれません。
ここから、Lightningが不正を防止する仕組みをBobの会社が悪徳業者だった場合として考えます。
Bobのインターネット広告代理店は悪徳業者だった。
Bobの会社は悪徳業者でした。
上の例の場合、Bobは最終的にAliceに対して3BTCを払わないといけません。
Bobの会社が優良企業だった場合、「Commitment Tx31」を最終的な支払い結果としてBitcoinにブロードキャストします。
しかし、Bobは不正を働いて、「Commitment Tx2」を最終的な支払いとして、ブロードキャストします。
Commitment Tx2の内容は以下のようになっています。
つまり、Bobが2.9BTC分の得をするtransactionを最終的な結果と嘘を付くわけです。
こんな悪いことは許されません。これを防ぐための方法が確立されているのがLightningの真のすごいところです。
Bobは不正を働いてCommitment Tx2をブロードキャストし、コインを入手したいです。そのために入手条件を見てくださいBobは赤い枠で囲った
・このTxがブロックに入って1000ブロック経過したら入手可能
の条件をクリアすることで4.9BTCを獲得しようと試みます。
そのためにCommitment Tx2をブロードキャストしたあた、1000ブロック経過するまで待ちが発生します。
Aliceの反撃
Aliceにはこの1000ブロック経過するまでが反撃のチャンスです。
Commitment Transactionは新しく作られる時、古いCommitment TransactionのSecretを公開します。**なのでAliceはこの時Secret3を持っています。**Aliceは自分のsecret A3を使ってAlice宛の0.1BTC、さらに公開されたBobのSecret B3を使ってBobの4.9BTCを取り出せます。結果として不正を働いたBobはマルチシグを開設した時の5BTC全てをAliceに没収されてしまいました。Lightning Networkは悪を成敗できるように作られているのです。
####Lightning Networkの決済の流れの図を再確認
難しいかもしれないのでLightning Networkの決済の流れの決済フェーズの画像をもう一度確認して見てください。
取引の最初にSecret2を新しく作り取引の終わりに古い秘密鍵であるSecret1を交換しています
つまりこの時すでにSecret1によって作られたCommitment Tx1は古い状態であり、お互いにSecret1を知っているので、もしCommitment Tx1を最新状態のTxと嘘をつき不正にブロードキャストをしてしまうと、Secret1を使って相手によってマルチシグのコインを全て引き出せてしまうのです。
結果として不正を働いたBobのお金をAliceが引き出せるようになるわけです。これは不正を働いた場合、全額没収される、ということを意味します。
#終わりに
なんでここまでガチガチのルールが必要なのかというとオフチェーンで決済はブロックチェーンの「みんなが同じ情報を持っているから信用できる」という基本理念が通じないため、みんなが見ていないとこでも確実に支払いができるようにしないといけないわけです。
今回は2者間の解説のみに絞ったが、3者、4者とマルチホップに繋げてネットワークを作ろうというのこそがLightning Network。
参考文献:
The Bitcoin Lightning Network:Scalable Off-Chain Instant Payments
eltoo: A Simple Layer2 Protocol for Bitcoin
【動画で学ぶブロックチェーン】新しいオフチェーンコントラクトeltooとSIGHASH_NOINPUT