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

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

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

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

Mastering Bitcoinを読み解く 第2回 ネットワーク

「Mastering Bitcoinを読み解く」第2回です。今回はネットワークに関してまとめます。

 

第1回(トランザクション編)はこちら

cryptocoin.hatenablog.com

参考文献

Mastering Bitcoin

Mastering Bitcoin

 

 

ノード立ち上げ時の動作

BitcoinネットワークはP2Pネットワークであり、中央集権的なサーバーが存在しません。そのため、何かしらのウォレットアプリをダウンロードしてPC上にBitcoinノードを立ち上げたタイミングで、ネットワーク上のいずれかのノードを選択して接続する必要があります。

 

このノードの選択にはDNSが使用されます。DNS seedとよばれるDNSサーバー群がBitcoinノードのIPアドレス情報を管理しており、いずれかのDNS seedに問い合わせることで、接続先のノード情報をランダムに手に入れることができます。Bitcoin Coreクライアントの場合は、6つのDNS seed情報をデフォルトで含んでいます (Mastering Bitcoinでは5つと記載されていましたが、ソースコードを見る限り現在は6種類のようです)。

 

chainparams.cpp

f:id:steinith310:20170130225933p:plain

 

DNSについては、念のためリンクをはっておきます。

DNSとは - JPNIC

 

ブロックチェーンのSync

さて、Bitcoinネットワーク上の他のノードへの接続が完了した後で、フルノードの場合はブロックチェーン情報をダウンロードする必要があります。他のノードからこの情報を受け取るわけですが、その際には以下のようなステップで情報が交換されます。

 

  1. まずお互いにgetblocksメッセージを送信し、自分が持っている最後のブロックのハッシュ値を交換する。
  2. 1で受け取ったハッシュ値から、自分と相手のどちらが最新のブロックチェーンを保持しているかを確認する。
  3. 最新のブロックチェーンを保持している側は、invメッセージを使用して、不足しているブロックのハッシュ情報を相手方に送信する。
  4. 不足しているブロック情報をgetdataメッセージを利用して最新のブロックチェーンを持つノードに要求し、ブロック情報を受け取る。

 

一方SPVノード(Lightweightノード、全ブロックチェーン情報を保持しない軽量クライアント)は、ブロックヘダー情報のみを接続しているノードから受け取ります。

 

SPVノードのトランザクション検証

ルノードは全ブロックチェーン情報を保持しているため、トランザクションがブロックチェーンに含まれたか」、また「二重支払いされていないか」を容易に検証できます。一方、SPVノードの場合は全ブロックチェーンの情報を保持していないため、検証には工夫が必要になります。

 

トランザクションがブロックチェーンに含まれたか

SPVノードは、マークルツリー、マークルパスとよばれる仕組みを利用し、トランザクションを含むブロックを特定します。マークルツリーは二分木構造になっており、各リーフはそれぞれのトランザクションハッシュ値を格納しています。

 

ここでは、AとBという2つのトランザクションを保持する二分木を例に考えてみます。まず、AとBにそれぞれハッシュ関数を適用し、リーフA'とリーフB'を作成します。さらに、A'+B'にハッシュ関数を再適用することで、ルートAB'を作成します。

 

このツリーを使用すると、あるトランザクションがこのブロックに含まれることを簡単に検証することができます。例えば、Aというトランザクションがこのブロックに含まれているかを、あるSPVが検証したい場面を想定してみましょう。

 

SPVが「Aを検証したい」ということを接続しているノードに告げると、ノードはルートノード (AB') とリーフノード (B')の情報を送ってきます。SPVはAトランザクションにハッシュをかけてA'を作成して、B'の情報と組み合わせてAB'を作成します。SPVが作成したAB'と送られてきたAB'が一致しない場合は、トランザクションAの情報がそのブロックに含まれていないということになります。

 

二重支払いされていないか

マークルツリーを使用することで、すべてのブロックチェーン情報を持たないSPVでも、あるトランザクションが、ブロックに含まれているかどうかを検証可能であることがわかりました。しかし、二重払いが行われたかどうかは、全ブロックチェーン情報を持たないSPVでは検証できません。

 

そこで一般的には、対象のトランザクションを含むブロックの上に、6ブロック以上が積み重なったことをもって、二重支払いなしとみなします。

 

Alert System

Bitcoinコア開発メンバーが保持する秘密鍵で署名したメッセージを、全ノードに送付する機能です。一応、過去に利用されたこともあったようですが、現在ではコミュニティが発達してアラート機能を利用して周知する必要性が薄れてきたため廃止されました (Mastering Bitcoinにはまだ存在している前提で記載されていましたが、すでに完全廃止が決まった模様)。

btcnews.jp

 

まとめ

Mastering Bitcoinは2014年12月の販売から約2年しか経過していないにもかかわらず記述が古くなっている点が散見され、Bitcoinを取り巻く環境の変化するスピードの早さを感じました。

 

本やブログから情報を収集するにしても、最後は最新のソースコードを見て確認する癖が大事そうですね。

 

第3回はこちら

cryptocoin.hatenablog.com