25歳海外駐在員の暗号通貨ルポ

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

25歳海外駐在員の暗号通貨ルポ

25歳の東南アジア某国に居住する駐在員。Bitcoinなどの暗号通貨をメインに、英語や駐在生活に関して情報発信中。

Layer2解説 第1回 マイクロペイメントチャネル

BitcoinでLightning Networkを実現する方法はいくつか提唱されていますが、いずれの実装方法もマイクロペイメントチャネルを拡張することで実現しようとしています。今回は、マイクロペイメントチャネルの仕組みを見ていきたいと思います。

マイクロペイメントチャネルの概要と理解のための前提

マイクロペイメントチャネルとは、二者間でブロックチェーンを利用せずに複数回の少額送金を実施するための技術です。複数回の少額送金をブロックチェーン上で実施しようと思うと以下のような問題に突き当たります。


送金者側の負担:取引ごとの手数料
現在Bitcoinでは1トランザクションあたり、数十円から数百円の手数料がかかっており、例えば継続して少額の決済をするような場合(例えば、ガス代金の支払いなど)には、毎回毎回手数料がかかることで手数料負担が重くなってしまいます。


受取人側の負担:非効率なトランザクションによる手数料上昇
少額決済を繰り返すと、ウォレットの中には細かな単位のBitcoinが積み重なることになります。Bitcoinの取引手数料は、送金額ではなく、送金トランザクションのサイズで決まるため、それらのBitcoinを送金に利用しようとすると、トランザクションサイズが大きくなり、取引手数料が高くついてしまいます。


マイクロペイメントチャネルを利用すると、一定期間の間に実行された送金/受金を相殺して一つのトランザクションにまとめた上でブロックチェーンに書き込むため、送金者の取引手数料を節約することができます。また、トランザクションがひとつにまとまるので、受け取ったトランザクションを利用するときにトランザクションサイズが大きくなることも防げます。


さて、これからマイクロペイメントチャネルの仕組みを解説していきますが、マイクロペイメントチャネルを理解するにはいくつかの前提となる知識をおさえる必要があります。

  • マルチシグ (2 of 2)
  • Locktime

トランザクションの構造(Input / Output)はわかっている前提です。)

マルチシグ

通常のBitcoinの送金は、「送金先のアドレス」を指定します。アドレスはPublic Keyに対してハッシュ値をかけたものなので、この送金方法をP2PKH (Pay-to-Public-Key-Hash)と呼びます。この場合、受け取ったBitcoinを受取人が使うためには、受取人であることを証明するために受取人の秘密鍵で送金トランザクションに対して署名する必要があります。


これに対して、複数人が署名することで、はじめてBitcoinを利用できるということにしたい場合があります。例えば、企業の調達部門が資材の対価をBitcoinを使用して支払う場合に、調達担当者に加えて経理担当者の承認を必要とするといった場合です。これを実現するのがマルチシグです。


マルチシグを使いたい受取人は、まず受取人のPublic Key全て(上の例の場合は、調達担当者と経理担当者のPublic Key)を送金者に教えます。送金者は受け取ったPublic Keyの両方を受取人とする形で、トランザクションを作成しネットワークに送信します。受取人は、受取人全員(上の例では、調達担当者と経理担当者)が署名したトランザクションをネットワークに送信することで、受け取ったBitcoinを送金に利用できます。


なお、マルチシグは一般的に「2 of 2」のように、「数字1 of 数字2」の形で表現されます。数字2は受取人の数を表し、数字1は受け取ったBitcoinを利用するために必要な署名の数を表しています。例えば「1 of 2」の場合は、受取人は2人いますが、受け取ったBitcoinを利用するには2人のうち1人の署名があれば十分ということになります。

Locktime

「一定時間経過しないとBitcoinを利用できない」ということを実現するための仕組みがLocktimeです。


送金者はLocktimeにブロックの高さ、または時刻を指定します。指定されたブロックの高さ、または時刻以降にならないと、そのトランザクションは各ノードに伝播されたり、ブロックに取り込まれたりすることはありません。

マイクロペイメントチャネルの仕組み

話を簡単にするため、例を用いて説明していきます。登場人物は以下の通りです。
Alice:Bitcoin送金者。ガス会社であるBob Corporationと契約してプロパンガスを利用している。
Bob:Bitcoin受取人。Bob Corporationを経営している。

基本的な仕組み

マイクロペイメントチャネルでは、AliceとBobのマルチシグアドレスに対して、Aliceが一定額のBitcoinをDepositすることで取引開始となります。ここでは仮に、Aliceがマルチシグアドレスに対して、10 BTCをDepositしたと仮定して話を進めます(このDepositトランザクションOpening Transactionと呼称することとします)。


Opening Transactionをブロードキャストする前に、Aliceの10BTCがマルチシグアドレスにロックされたままにならないように下準備が必要になります。例えば、以下のような事態が考えられます。

  • Bob Corporationが倒産
  • Aliceがガス会社を乗り換えようと思った時に、Depositしている10BTCをBob Corporationに人質として取られる


この事態を防ぐため、Opening TransactionのDeposit額全額(10 BTC)をAliceに返金するトランザクションにAliceとBobが署名して、Aliceがそのトランザクションを保持しておきます (以後、Refund Transactionと呼称します)。また、すぐにDepositがAliceによって引き出されることを許容すると、今度はBob CorporationがAliceに騙されてしまうおそれがあるため、このトランザクションにはLockTimeを設定しておきます。例えば、ガス契約期間を1ヶ月間と仮定して、このトランザクションが利用できる日を1ヶ月後のX月31日としておきましょう。BobはX月31日を過ぎた後もマイクロペイメントチャネルを閉じないでいると、このトランザクションによって全額をAliceに戻されてしまうので、X月31日までにマイクロペイメントチャネルを閉じる必要があります。


f:id:steinith310:20170512012446p:plain


さて、Bob CorporationはAliceとガス契約を結んでいます。話の単純化のために、Aliceが1回ガスを使用すると、使用量に関わらずAliceはBobに対して1BTCを支払わなければならないとします。


X月1日、Aliceはガスを一回利用しました。AliceはBobに対して1BTCを支払わなくてはなりません。そのために、AliceはOpening TransactionをInputに利用したトランザクションを作成してAliceの署名を施し、Bobに対してこのトランザクションを送信します (以後、Pay-to-Bob Transaction1と呼称します)。この時点ではまだBobの署名がなく、ブロードキャストされていないため、このトランザクションがブロックチェーンに書き込まれることはありません。


Pay-to-Bob Transaction1
■Input
Opening Transaction
■Output
to Bob Address 1BTC
to Alice Address 9BTC


BobはもうこれでAliceとの契約を終わりにしたければ、Aliceへのガス供給をストップして、Pay-to-Bob Transaction1にBobの署名を加えた上で、他のノードにブロードキャストします。しばらくした後、このPay-to-Bob Transaction1はブロックチェーンに書き込まれて、取引が確定します。すなわち、マイクロペイメントチャネルがクローズされることとなります。


ここでは、BobはAliceと引き続き契約を継続したいため、このトランザクションをブロードキャストせず、Bobの手元にとっておいたとします。


X月2日、Bobの思惑通り、Aliceは再びBob Corporationの高額なガスを利用したため、AliceはBobに1BTCを追加で支払わなければなりません。ここでAliceは新たなトランザクションを作成して、Aliceの署名を加えた上でBobにこのトランザクションを渡します(Pay-to-Bob Transaction2とします)。


Pay-to-Bob Transaction2
■Input
Opening Transaction
■Output
to Bob Address 2BTC
to Alice Address 8BTC


このトランザクションはPay-to-Bob Transaction1と同様に、Opening TransactionのOutputをInputとして消費します。同じOutputが二回使われることはないため、Pay-to-Bob Transaction1とPay-to-Bob Transaction2は両方とも利用されることはなく、どちらか片方だけが利用されることになります。受け取ったBobが取引を確定させたい場合は、当然受け取る額が大きいPay-to-Bob Transaction2をブロードキャストすることになります(仮にBobがPay-to-Bob Transaction1をブロードキャストした場合は、Bobは1回分のガス利用料を取り逃がすことになります。Bobが損するだけなので、Bobがそれを選ぶのは自由ですが、BobがPay-to-Bob Transaction1をブロードキャストするインセンティブはありません)。


f:id:steinith310:20170512013029p:plain

双方向での送金

さて、Aliceはここに来てやっと、ガス料金が高すぎることに気づきます。Bobに文句を言い、ガス料金を1回あたり1BTCから、1回あたり0.1BTCに減額してもらうことができました。しかも、過去分にも遡求して適用してくれるそうです。


BobはAliceに対して1.8BTC (2 - 0.2)を返金する必要があります。通常の取引であれば、BobからAliceに1.8BTCを送るだけですが、せっかくなので既に作られているマイクロペイメントチャネルを利用して返金することにします。返金するためには、以前の取引をなかったことにして、新たに0.2BTCをAliceからBobに送ることにすればよさそうです。そこでAliceは、以下のトランザクションを作成・署名して、Bobに送りました。


Pay-to-Bob Transaction3
■Input
Opening Transaction
■Output
to Bob Address 0.2BTC
to Alice Address 9.8BTC


f:id:steinith310:20170512094218p:plain


これに安心したAliceは、Bob Corporationは返金に応じてくれて、Bitcoinも使えるいい会社だと友達にも紹介し始めます。紹介された友達はAliceの勧誘に応じて続々とBob Corporationと契約を結びました。


しかし、Bob Corporationの経営は悪化していました。できる限りのBitcoinを受けとった上で計画倒産するべく、最後に送られてきたPay-to-Bob Transaction3ではなく、2BTCを受け取ることができるPay-to-Bob Transaction2をブロードキャストして、ペイメントチャネルをクローズしてしまいます。これにより、Aliceは0.2BTC支払うだけでよかったはずが、2BTCを支払うことになってしまいました。さらには勧誘した友達からもそっぽを向かれてしまいます。Aliceは裁判所で戦うことを決意しました。


f:id:steinith310:20170512094055p:plain


このままAliceとBobの法廷闘争を続けてもいいのですが、法廷闘争になる前にこの事態を防ぐことはできなかったのでしょうか?よくよく考えてみると、Bobの詐欺行為を防げなかった原因は過去分のトランザクションを取消しできていなかった点にありそうです。

過去トランザクションの取り消し

それではどのようにすれば、過去トランザクションを取消すことができるでしょうか?ここでは再びマルチシグとLocktimeを利用することで、この問題を解決します。どういう発想をするかというと、「もし過去のトランザクションをBobが使ってしまった場合、Depositしていた全額をAliceに戻してしまうという約束にしておけば、Bobが過去のトランザクションを使うインセンティブをなくすことができる」と考えます。


さて、AliceとBobのマルチシグにAliceが10BTCをDipositしたところまで時間を遡ります。
今回Aliceは、Bobに騙されない方法を考案しました。最初の1BTCのガス代支払いのために、Aliceは以下のPay-to-Bob Transaction1をBobに送ることにしました。


Pay-to-Bob Transaction1
■Input
Opening Transaction
■Output
to マルチシグ (Bob Temporary Address1 & Alice Address) 1BTC
to Alice 9BTC


f:id:steinith310:20170512015210p:plain


騙されてしまった最初のPay-to-Bob Transaction1からの変更点は、「Bobに1BTCを送金するOutoput」が、「マルチシグへ1BTCを送金するOutput」になっている点です。注意が必要なのは、マルチシグで使われているBobのAddressはTemporary、つまり捨てアドレスである点です。ここではその意味には深く入らず、先に進むことにします(後で過去トランザクションを無効化するタイミングで、なぜ捨てアドレスを利用したかがわかります)。


さて、Bobが1BTCを最終的に獲得するには、このトランザクションに加えて、マルチシグからBob Addressへの支払いトランザクションを作成する必要があります。そこで、Aliceは以下のトランザクションに署名して、Bobに送っておきます。なお、このトランザクションにはLockTimeを設定しておきます。ここではOpening TransactionのLocktimeより1日だけ前のX月30日にLockTimeを設定しておきましょう。


Pay-to-Bob Transaction1-a
■Input
Pay-to-Bob Transaction1
■Output
to Bob 1BTC
LockTime付き


Bobは1BTCの受け取りで取引を確定させたければ、Pay-to-Bob Transaction1とPay-to-Bob Transaction1-aトランザクションに署名をしてブロードキャストすれば取引を確定できます(Locktime分、受け取りを待つ必要はありますが)。


さて、Aliceはガスを再び利用してしまったので、もう1BTCを支払う必要があります。今回はPay-to-Bob Transaction2を送るのに加えて、過去分のトランザクション(Pay-to-Bob Transaction1)を取り消してみたいと思います。まずは、さきほどと同様にAliceはトランザクションを作成します。


Pay-to-Bob Transaction2
■Input
Opening Transaction
■Output
to マルチシグ (Bob Temporary Address2 & Alice Address) 2BTC
to Alice 8BTC


このトランザクションをBobに送り、Bobがこの新規トランザクションの状態を承認した場合は、BobはBob Temporary Address1を作成するのに利用した秘密鍵をAliceに送ります。これで準備完了、Bobは過去のトランザクションを使えなくなりました。捨てアドレス (Temporary Address)を使用していたのは、秘密鍵をAliceに暴露するためだったのです。


ここで例えばBobがTransaction1を誤ってブロードキャストしたとします。Bobとしては「Pay-to-Bob Transaction1-a」を利用して、BitcoinをBobのアドレスに送ろうと考えます。しかし、このトランザクションはLocktimeが設定されていてX月30日までは送金を確定することはできません。そこでAliceは、約束を破ったBobに対して制裁を加えるべく、さきほど受け取った「BobのTemporary秘密鍵」と「Aliceの秘密鍵」を利用して、以下のトランザクション (以下、Remedy Transactionと呼称します)を作成してブロードキャストします。これにより、AliceはDipositしていた10BTC全額を回収することができます。


Remedy Transaction
■Input
Pay-to-Bob Transaction1
■Output
to Alice 1BTC


f:id:steinith310:20170512015931p:plain


このように、Bobが過去のトランザクションを使用した場合には、Aliceは(LockTimeが到来するまでは)いつでもDepositしていた全額を回収可能ですので、Bobが過去のトランザクションを利用するインセンティブはなくなります(今の例ではそもそもBobが過去トランザクションを利用するインセンティブはありませんでしたが、Transaction3を作成した時のようにBobの取り分が少なくなるパターンでは、Bobが過去トランザクションを利用するインセンティブが生まれるので、このような仕組みで過去のトランザクションを無効化する必要があります。)


以上の通り、過去トランザクションを取消すことができました。あとは、Bobが最新のトランザクションを確定させたくなったら、最新トランザクションをブロードキャストすることで、トランザクションをブロックチェーンに書き込み、いつでもペイメントチャネルを閉じることができます。


さらに、Aliceの側からもペイメントチャネルを閉じることができるように、Bobもトランザクションを作成・署名してAliceに渡しておくというステップを追加すれば完成です。ここは大した話ではないと思うのですが、文章で書くとダラダラ長くなってしまうので、詳細を知りたい方は以下のリンクの解説記事その1をご覧ください。


Layer2解説、第2回はアトミックスワップ
cryptocoin.hatenablog.com

参考資料

概要記事
ビットコインによるマイクロペイメント概況と実現方法 | ビットコイン研究所
ビットコインの Lightning Network メモ - Qiita
Working with micropayment channels (英語)


解説記事 (英語)
解説記事その1。体系的にまとまっていて、なおかつわかりやすい。
Lightning Networks Part I: Revocable Transactions – Rusty Russell's Coding Blog

解説記事その2。Lightning Networkの解説資料だが、前半はほぼマイクロペイメントチャネルの説明。詳細解説版。
https://lightning.network/lightning-network-paper.pdf


マルチシグやLocktime
安定のMastering Bitcoin

Mastering Bitcoin: Programming the Open Blockchain

Mastering Bitcoin: Programming the Open Blockchain

cryptocoin.hatenablog.com