ビットコイン

二重支払いを防ぐための方法

ビットコインを使用した安全な取引を実現するために、

送金者が本人であること(悪意のある第三者による送金者のなりすましを防止する)
送金者が二重支払いをしていないこと

が必要であるとこちらで書きました。

今日は送金者による二重支払い防止のための技術について書いていきます。

二重支払いを防止するため使用されている技術が、

1.タイムスタンプ機能
2.Proof Of Work
3.P2Pネットワークによる情報の共有

です。

二重支払いを防止するために必要なこと

Aさんが仮にNo1という番号を持つお金を、BさんだけでなくCさんにも送金していたら、それは二重支払いになります。

現金であれば、お金を同時に複数の人に渡すのは不可能ですが、コンピュータ上でやり取りする場合、二重支払いが可能です。

これを防ぐためにどうすればいいでしょうか。

まず、最初の送金取引のみを正当なものと決めます。そのとき、重要になるのが送金日時のタイムスタンプ。タイムスタンプ次第でそのトランザクションが正当か否かを判断するのです。
→タイムスタンプが一番早いものが正当なトランザクションとする

しかし、タイムスタンプをつけても、そのタイムスタンプ自体がはたして信じられるのかという問題があります。というのも、コンピュータ上ではタイムスタンプを書き換えることができるからです。トランザクションのタイムスタンプが正しいことを証明する必要があります。
→タイムスタンプが正しいものであることを証明する

タイムスタンプが正しいと証明されたのち、問題になるのが、タイムスタンプを含むトランザクション情報の検証です。
→タイムスタンプとその他の情報が正しいかどうかを検証する

また改ざんできない仕組みも併せて必要になります。
→正しいタイムスタンプとその他の情報が改ざんされないようにする

つまり二重支払いを防ぐためには、送金情報に対して

1.タイムスタンプをつける
2.そのタイムスタンプが正しいことを保証する
3.保証されたタイムスタンプ付トランザクションを検証する
4.保証されたタイムスタンプ付トランザクションの改ざんを防止する方法を確立する

の4つが必要になるのです。

ビットコインシステムでは、上記4点は、ブロックチェーンを形成するマイニングの過程で実行されます。

マイニングによるブロック生成

ビットコインシステムでは、マイニング作業によってブロックが生成されています。ここでは、その作業によってどのように二重支払いが防止されているのかを説明します。

マイニングとは

マイニングとは、「新しいビットコインがマネーサプライに追加されるプロセス」であり、「不正なトランザクションや、同じビットコインが二度使用されるダブルサスペンド(二重使用)と呼ばれる不正から、システムを保護すること」※です。

マイナーは、トランザクションの検証、膨大な計算によるトランザクションのmerkle rootの算出、nonceの算出とブロックハッシュの算出などのProof of Workを実行。ほぼ改ざんは不可能なブロックを生成し、ビットコインシステムのブロックチェーンのセキュリティを支えています。
マイナーはその報酬として、ブロック生成ごとに新しいビットコインとトランザクションに添付されている手数料を獲得することができます。

つまりマイニングにより

1.ブロックの生成
2.管理者のいないブロックチェーンで、ブロックの内容が改ざんされない堅固なセキュリティを確立
3.報酬という形で新たなビットコインの発行

が実現しているのです。

※「ビットコインとブロックチェーン」アンドレアス・М・アントノプロス NTT出版より引用

ブロックの生成プロセス

マイナーによるブロック生成プロセスを順を追って説明します。
下記の手順の中で、黒太字の部分が、二重支払いを防ぐ方法になっています。

1.トランザクションが発生
例えば、AさんがBさんにビットコインを送金します。このトランザクション情報は、ビットコインシステムに参加しているすべてのノードに送信され、それぞれのノードのメモリプールに保管されます。
※この時点ではトランザクションはまだ承認されていません。

2.トランザクションの検証と選択
マイナーが、マイニングの作業を開始します。
自らのノードのメモリプールにたまったトランザクションの中から、ブロックに入れるものを選択します。その際、トランザクションに不正や二重支払いがないかを検証し、正しいもののみを選択します。検証の方法はこちらを参照してください。

3.Proof of Work(PoW)を実行
マイナーは、ブロックを生成したら、Proof of Work(PoW)を行います。
このブロックを作った時刻が、タイムスタンプとして記録されます。タイムスタンプは、各トランザクションではなく、ブロックを生成した時間として設定されます。
ブロックには全トランザクションデータ、タイムスタンプ、前のブロックのハッシュデータなどが含まれています。PoWの作業を通して、ブロックハッシュ値、タイムスタンプやトランザクションが含まれたブロックが生成され、改ざんは、(現在の技術では)ほぼ不可能になります。
Proof of Workの詳細はこちらをどうぞ。

4.ブロック生成完了を通知
マイニングは競争です。最初にPoWを終えてブロックを生成したマイナーが、ビットコインシステムに参加している全ノードに、ブロック生成完了を通知します。
ただし、この時点では、このブロックは全ノードに承認されていません。

5.ブロックの中身を検証し、正しければ承認
通知を受けたノードは、そのブロックの中身(ブロックハッシュ値、トランザクションやタイムスタンプ等)の有効性を検証し、二重支払い等の不正がないことが証明されれば、そのブロックをいったん承認します。

6.マイナーは次のブロック生成に着手
マイナーは、ブロック承認後、直ちに次のブロックの生成に取り掛かります。その際、上記で作成したブロック内のハッシュ値を新しいブロックに加えます。前のブロックのハッシュ値を次のブロックに入れることにより、データ改ざんが困難になります。
更新されたブロックチェーンは全ノードで共有されます。

ブロックチェーンに分岐が発生してしまったら

ブロックチェーンのシステムには、多くのノードか参加していて、あちこちでブロック生成が行われています。各ノードはP2Pによってつながっているため、ブロック生成の通知が届くまでにタイムラグが発生することもあります。また、ある時点で二のつブロックが同時に生成されて、チェーンが分岐してしまうこともあります。

そのようなときは、しばらく様子見となり、ブロックが5つつながったほうが正当なチェーンとみなされます。

なので、あるブロックの後ろに5つのブロックがつながったとき、はじめてそのブロックは正式に承認されたとみなされます。

参考文献
「ビットコイン: P2P電子通貨システム」 Satoshi Nakamoto  日本語版 英語版
「ビットコインはどのようにして動いているのか」 大石哲之 tyk publishing
「ブロックチェーン」 岡嶋裕史 講談社ブルーバックス
ビットコインとブロックチェーン」 アンドレアス・М・アントノプロス NTT出版
「ビットコイン論文から探るブロックチェーンのヒント」   オージス総研 樋口匡俊
第5回 PoW       第6回ネットワークと誠実なノード