読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

双方向Payment ChannelでのHTLCsの利用

techmedia-think.hatenablog.com

techmedia-think.hatenablog.com

と続いて最後の第3部では、オフチェーンである双方向Payment ChannelでどうやってHTLCsを使った取引を行うかという点について解説されてる↓

bitcoinmagazine.com

Lightning Network

前回までの内容でアリスとボブは既にお互い5 BTCずつ資金を出して、双方向Payment Channelをオープンしている。それぞれCommitment Transactionを2つ作成しており、現在二人の残高は5 BTCずつで、この状態でChannelを抜けると、ブロックチェーン上でそれぞれ5 BTC入手することになる。

続いて、Channel内でHTLCsを導入する。第2部ではHTLCsを使ってアリスからボブを経由してキャロルに資金を送る仕組みが解説されたが、これを第1部で解説されたオフチェーンの双方向Payment Channelで実現し、オフチェーンでもキャロルがシークレットと引き換えにボブからBitcoinを得る際、ボブはアリスからBitcoinが得られることを保証できるということを確認する。

前回のステップと同様、アリスとボブはそれぞれ新しいCommitment Transactionを作成する。第1部で作成したCommitment Transactionと同様、作成するCommitment Transactionには通常の出力と、(ハッシュロックとCSVによるタイムロックがされた)マルチシグアドレスを使った出力が含まれる。前回のステップと同様アリスとボブは古いCommitment Transactionを無効にするため古くなったシークレットを交換する。そしてアリスとボブは新しく作成したトランザクションにそれぞれ自分の署名を付加し交換する。交換するとそのCommitment Transactionはいつでもブロードキャスト可能になる。

第1部の内容とほぼ同じように思えるが1つだけ異なる。アリスとボブが作成したCommitment Transactionに1BTCを持つ1つの新しい出力を加える。そのためトランザクションは計3つの出力を持ち、その残高はアリスへの4 BTC、ボブに向けた5 BTC、新しい出力の1 BTCとする。

この新しく追加した出力がHTLCとなる。この出力はアンロックの方法が3つあり、他の出力よりも変わっている。

(アリスとボブそれぞれのCommitment Transaction内の)新しい出力の解除条件の1つは、ボブの署名とこの後のトランザクションで明らかになる(キャロルとのBitcoinの交換で入手する)シークレットである。アリスかボブのどちらがCommitment Transactionに署名してブロードキャストするかに関わらず、この出力が解除できるのは(シークレットを入手している必要があるが)ボブのみとなる。しかしアリスとボブがそれぞれ作成する2つのCommitment Transactionには小さな違いがあり、ボブがChannelから抜ける(ボブがブロードキャストする)場合は、解除条件CSV-timelockが付与されており、Bitcoinを入手するまで1000ブロック待たなければならない。逆にアリスがChannelを抜けた(アリスがブロードキャストする)場合、ボブはすぐにBitcoinを入手できる。

ボブがChannelを抜けた場合に1000ブロック待たないといけないというのは、Part1で出てきたボブが古いCommitment Transactionをブロードキャストした場合アリスにBitcoinを総取りされる仕組みに似ている。そう2つめの解除条件というのが、アリスがボブのブロードキャストされたCommitment Transactionのシークレットを知っている場合、アリスは資金を盗むことができる。逆にアリスが裏切って古いCommitment Transactionをブロードキャストすれば、ボブはアリスのシークレットを使ってBitcoinを入手できる。

3つめの解除条件は、他のHTLCと同様にアリスとボブが作成したCommitment Transactionには指定期間が過ぎるとアリスが取り戻せるCLTV time-outが設定されている。ボブが2週間たってもキャロルから取得するはずのシークレットを言わない場合、アリスは1 BTCを取り戻すことができる。アリスとボブどちらがChannelを抜けるかは、この条件には関係ない。

この3つの解除条件が、どのように作用するようになるかというと。

アリスとボブはそれぞれ、半有効(相手が署名済み)なCommitment Transactionを保持しており、アリスがそのCommtment Transactionに署名&ブロードキャストしてChannelを抜けると、すぐに5 BTCがボブに送られる。アリスはその後1000ブロック待つと4 BTCを入手できる。そして残りのHTLCの1 BTCについては、ボブが2週間以内にシークレットを明らかにすればボブが入手するか、2週間経過した場合はアリスに渡る。

ボブも同様に任意のタイミングでCommitment TransactionをブロードキャストすることでChannelを抜けられる。その場合、すぐにアリスに4 BTC送られ、その後1000ブロック待って5 BTCを自分が手にする。またHTLCの1 BTCはボブがシークレットを2週間以内に明らかにすることで入手できる(2週間経過するとアリスに取り戻される)。

もちろんアリスかボブのどちらかが無効になったCommitment Transactionに署名してブロードキャストすると、Channel内の全てのBitcoinを相手方に盗られる。

Channelの状態維持

この時点でボブは、シークレットと引き換えに1 BTCを受け取ることが保証されている。ボブがやることはアリスから受け取ったCommitment Transactionに署名してブロードキャストし、その後にシークレットを含むトランザクションに署名しブロードキャストする。シークレットを含むトランザクションがブロードキャストされていれば、アリスはもうボブに渡った1 BTCを盗むことはできない。

このようなChannelのクローズによってHTLCが終了するかもしれないし、それ以外にボブが単純にアリスにシークレットを伝えることで、アリスはHTLCとそのタイムアウトの期限を除いた形でChannelのステータスの更新に同意するということもある。両者がChannelを継続したい場合は、Channelを抜けるよりも簡単で、両者が合意した内容で新しくCommitment Transactionが作られるだけ。

Channelのクローズ

アリスとボブが平和的にChannelをクローズしたくなったら、Opening Transactionを入力にし、Channelの最後の状態に基づいたClosing Transactionを作成する。Closing Transactionはタイムロックやシークレット等は含まず、単純にChanelの最後の残高をアリスとボブのアドレスに送るトランザクションとなる。

アリスがこの時点でChannelをクローズしたい場合、ボブに6BTC、自分に4BTC送るトランザクションを作成し自分の署名を行い、ボブにトランザクションに署名してブロードキャストするよう依頼する。ボブは特に断る理由は無いので、協力してChannelを閉じる。

アリスとボブの間に何百万回の取引があったとしても、最終的には2つのトランザクション(Opening TransactionとClosing Transaction)がBitcioinネットワークを介してブロードキャストされるだけで、ブロックチェーンに大きな負担をかけることはない。

↑の処理フローをまとめるの↓のようになる。

f:id:techmedia-think:20160823115706p:plain

所感

  • Bitcoin MagazineのLightning Networkの記事はオフチェーンで行う双方向Payment ChannelとHTLCsについてとても分かりやすく説明されてる良い記事だった。
  • HTLCな出力をCommitment Transactionに加えることで双方向Payment ChannelでもHTLCを実現すると。
  • HTLCな出力を含むCommitment Transactionに署名してブロードキャストするのはChannelのクローズを意味するが、シークレットを相手に明かすことで両者がChannelの更新に合意し、Channelをクローズすることなく引き続きオフチェーンでの取引が可能になるのね。
  • 双方向Payment ChannelとHTLCsを組み合わせることで、既にChannelを開いているユーザが対象の取引相手とのChannelを持っている場合、取引相手毎に毎回Channelを開かなくて済むというのはメリットだけど、仲介するユーザにハッシュ渡したりトランザクション作ってもらったりしないといけないので、(仲介手数料などが取れたとしても)仲介者にとっては本来自分の取引ではないのに手間が発生するのと、取引を行っている両者からすれば仲介者のアクションを待つ必要があるというのは、サービス提供する上では結構メンドクサイ。