最近思ったことのメモ -2ページ目
冬休みで暇になってきたので、ビットコインの仕組みについて調べてみました。

ビットコインの特性や概要はいくらでも説明があるので省略します。なお、参考にしたリンクは以下の通りです。
http://www.imponderablethings.com/2013/07/how-bitcoin-works-under-hood.html
http://www.bitcoin.co.jp/docs/SatoshiWhitepaper.pdf

結局のところ、上記のサイトの概要となってしまうわけですが、Bitcoinは以下のようなものです。

1.ある口座からお金が支払われることの証明には、既存の電子署名を使う。
 ⇒他人の口座や、存在しない口座から送金することはできません。なぜなら、受け取る側が電子署名を検証するからです。

2.”1”のような取引履歴を全て連結して保存すれば、あなたの口座に入金されるお金の正当性は保証されます。


3.取引履歴は全てのBitcoinクライアントにそれぞれ保存されます。新しいBitcoinクライアントを作成した際には、後述のように、P2Pネットワークにブロードキャストされる取引履歴を保存します。その際に、全ての取引履歴を検証します(P2Pネットワークに流れている情報は信用ならないので、取引履歴に載っている全ての取引の署名検証を行う)。この検証には24時間程度かかるようです。

4.”3”までは、何も新しくありません。既存の仕組みで実現出来ます。Bitcoinが新しいのは、世界中で非同期に発生する送金要求に対して、世界中のBitcoinクライアント間で唯一の送金順番を合意する仕組みを提供していることです。

 以下のように考えると、Bitcoinを比較的容易に理解できるのではないでしょうか?
 送金者の口座が間違いなく存在することを確認する手段はもともと存在していました。送金履歴を全て並べて保存することで、お金の由来(偽札ではないこと)を保証することもできます。ただし、これだけでは貨幣として流通させることはできません。なぜなら、世界中のクライアント間で唯一の送金順番を合意する仕組みが存在しなかったためです。そのことを指摘し、送金要求を一列に並べる手段を提示したのが、Nakamoto Satoshiという人物(もしくはグループ)の論文です。

 「間違いなく存在する口座から、偽札ではないことが保証された貨幣を、世界中で一意に決定される送金順で送ってもらえる」のであれば、貨幣として何の問題ないように感じますよね。


 以下に、Bitcoinクライアント間で送金順番を合意する仕組みについて記述します。

 世界中の送金要求は、P2Pネットワークにブロードキャストされます。ここで、すべてのクライアントは、同じ取引履歴を持っていると仮定してください。採掘者と呼ばれる人たちが提供するPCは、複数の送金要求から一つを選び(実際には、複数の送金要求をまとめたグループの中から一つのグループを選ぶ)、取引履歴に追加を試みます(つまり、各PCごとに異なる送金要求を追加しようとする可能性がある)。
 取引履歴に追加するためには、かなり多くの計算量を必要とする問題を解く必要があり、採掘者のPCは、その問題の解く早さを競います。早く解けたPCの選んだ送金要求が新たに取引履歴に追加され、その取引履歴がP2Pネットワークにブロードキャストされます。
 Bitcoinの場合、この問題の難易度は、世界中の採掘者のPCを使って計算しても10分に1回解ける程度に調整されているようです。なお、解答を見つけた採掘者には報酬としてBitcoinが支払われます(採掘と呼ばれる作業は、まさにこのこと。全ビットコインを掘り尽くした後には、送金にかかる手数料(もちろん送金者の負担)が採掘者に払われるようになります(現在は送金手数料はない))。
 なお、送金要求が存在しない場合でも、採掘者は採掘を行い報酬を得ることが出来ます。その場合、「送金元と送金先の存在しない履歴」が、取引履歴に追加されることになります(2013年12月30日追記)。
 複数の採掘者のPCが同時に解答を見つけた場合、複数の異なる取引履歴がP2Pネットワークにブロードキャストされてしまいます。その場合、各Bitcoinノードは、最初に受け取った取引履歴を(とりあえず)使いますが、それ以外の取引履歴も保存しておきます。
 
Bitcoinノードごとにネットワークの状況は異なるため、複数の取引履歴がブロードキャストされた場合に、どの取引履歴を一番始めに受け取るかは分かりません。このような全クライアント間で通用する唯一の取引履歴が決定できない状況の場合はどのように処理するのでしょうか。最終的に、どの取引履歴が”本物”になるかは、次の送金要求がどの取引履歴に追加されるかで決まります。つまり、次の送金要求を追加することに成功した採掘者のPCが本物と判断していた取引履歴が、全クライアント間で唯一の取引履歴と判断されます。これは、その取引履歴が他の取引履歴より長い履歴を持つようになるためです(Bitcoinクライアントは、一番長い取引履歴を本物と判断します。同じ長さの取引履歴が存在すれば、引き続き唯一の取引履歴は決まらない状況になる)。
 偶然同時に問題が解けることは、滅多にありません(通常、1つの問題を解くのに、全採掘者のPCを使っても10分かかるため)。そのため、複数の取引履歴がP2Pネットワークに残り続ける可能性(=偶然同時に問題を解くようなケースが起こり続ける可能性)は無視して良いほどに小さくなり、全Bitcoinクライアント間で唯一の取引履歴を同意することが可能となります。

 ところで、悪意のある攻撃者が、偽の取引履歴をP2Pネットワークに流した場合はどうなるのでしょうか?
 悪意のある攻撃者が十分な計算資源を持っていれば、本物の取引履歴より長い偽の取引履歴を計算して作り出すことが出来るかもしれません。現実的には、本物の取引履歴の末端に近い履歴が異なる偽の取引履歴がブロードキャストされる可能性があります。
 たとえば、AがBにお金を送金した後に、Bはブロードキャストされた取引履歴からAの送金を確認し、Aに対して商品を送ったとします。商品を送った後に、Bが確認した取引履歴より長く、また送金内容の異なる取引履歴がAよりブロードキャストされたらどうなるでしょうか。後からブロードキャストされた取引履歴が本物の取引履歴として、全Bitcoinクライアントにて使われるようになってしまうため、Bはお金を受け取れません(長い履歴の方が本物として扱われるため)。
 なお、過去に、一つの採掘者グループが、6回連続で送金要求を追加することに成功したことがあるため、少なくとも6回以上の新たな送金が履歴に追加されるまでは、その取引は成立したと考えない方が安全と言われています。時間にすると、1時間以上は完全に取引が成立したと思わない方が安全と言うことになります。
 上記のように、取引履歴の末端に使い送金は信用ならないということになるわけですが、現実的に善良な採掘者の計算機資源に比べ、攻撃者の計算機資源が上回るような事態にならなければ、大規模な取引履歴の改竄は不可能です。
 また、取引履歴の改竄を防ぐためには、送金履歴を追加する際に解かなければならない問題の難易度を上げることより、取引履歴の長さに頼る方が良いという論文があるようです。LTCなどでは、Bitcoinに比べて送金の成立にかかる時間が大幅に短いわけですが、その代わりに、攻撃者はより長い取引履歴を改竄しなければならず、その方が難しいということなのでしょう(?)

以上、簡単にですが、Bitcoinの仕組みを説明しました。
英語になってしまいますが、最初に記述したリンクに書かれた動画を見ると、より直感的に理解できると思います。


時間があれば、冬休み中にBitcoinのソースコードを読んでみたいと思います。
MITライセンスで公開されているようなので、オレオレ通貨を作るのも簡単そうですね。
送金要求の追加にかかる処理の手間を変更すれば、LTCのようなBitcoinと特質の異なる仮想通貨を作ることもできるでしょう。

そもそも、どのようなグループがお金に直接かかわるコードをオープンソースで管理しているのかも気になるような・・・。