コンピューターどうしが情報を交換する手段の一つにネットワークがあります。
ネットワークにもさまざまな種類がありますが、パソコンやスマホなどで一般的に使われているインターネットも当初は電話回線が使われ、その後ADSLや光ケーブルを使った光通信などが使われるようになりました。さらに現在ではスマホ・パソコンでもWi-Fiなどの無線通信によるネットワーク接続が利用されるようになってきました。本書では、このような「通信インフラによる接続」や通信自体のことをネットワークと呼びます。
本章では、ネットワークを実現する方式について見ていきます。過去には、高価なホストコンピューターに端末を接続して利用されてきましたが、現在は主にクライアント・サーバー方式と呼ばれる形に移行してきました。さらにブロックチェーンの世界では、P2Pネットワークと呼ばれる方式が使われています(図2.1)。
まずはこれらの仕組みと違いについて知っておきましょう。
2.1 クライアント・サーバー方式
クライアント・サーバー方式では、処理を依頼するクライアントと、その依頼を受け取って処理を実行して結果を返すサーバーという役割が決められています。典型的な例としては、企業内システムやWebサーバーなどが挙げられます(図2.2)。
Webサーバーの場合、クライアントとなるWebブラウザーからの要求がサーバーに送られ、サーバーの処理結果がブラウザーに送り返されて表示されます。
クライアント・サーバー方式の大きな特徴は、ネットワークに参加するコンピューターの役割が、クライアントやサーバーとしてあらかじめ決められていることです。さらに、「サーバー」と一口に言っても、「Webサーバー」や「DBサーバー」など、複数のサーバーにそれぞれの役割が決められて構成されることが一般的です。
2.1.1 クライアント・サーバー方式の問題点
図2.3に示すように、クライアント・サーバー方式では、サーバーやネットワークに障害が起きた場合、システム全体が停止してしまう可能性があります。また、クライアントが多くなりすぎると、送られてくる要求が特定のサーバーに集中して、処理が遅延したり障害が起こったりしてしまいます。
それらに対応するためには、
- 高速に大量データを処理できるようにサーバーを増強する
- 障害時もサービスを継続するために複数台のサーバーを組み合わせて冗長化する
といった対策が必要です。ネットワークも障害に備えて回線を二重化(または多重化)したり、ネットワークアダプターやポートを二重化してリンクアグリゲーションの設定をしたりします。また、複数のサーバーそれぞれに役割が決められている場合は、その役割ごとに台数を調整したり、冗長化したりすることも必要です。他にも、場合によっては「DNSのラウンドロビン機能」「ロードバランサー」といった処理を分散させる仕組みを導入することも必要になってきます。
その結果、システムが非常に高価かつ複雑になってしまいます。
2.2 P2Pネットワークとは?
一方、ブロックチェーンでは、ビットコイン以来ピアツーピア(P2P)ネットワークという方式を使っています。ちなみに「P2P」とはPeer to Peerの略であり、ピア(peer)という単語は「同等の人」「同輩」「友だち」などの意味を持っています。
図2.4のように、P2Pネットワークでは、ネットワークに参加するコンピューターをピア、もしくはノードと呼びます。それぞれのピアが同等の役割を持っており、複数のピア間で対等に通信が行われます。P2Pネットワークによる通信は、ビットコインなどのブロックチェーンの他にもLINEやSkypeなどの通話サービスでも広く利用されています。
2.3 ブロックチェーンでP2Pが利用される理由
ビットコインをはじめ、多くのブロックチェーンでは、以下の理由からP2P方式のネットワークを利用しています。
- 実質的にゼロダウンタイム
- 安価にシステム構築が可能
- 非中央集権的である
それではそれぞれについて詳しく見ていきましょう。
2.3.1 実質的にゼロダウンタイム
先述のように、クライアント・サーバー方式では、攻撃や故障など何らかの原因でサーバーやネットワークが障害を起こした場合、サービスが停止しかねません。またクライアントの数が多くなりすぎた場合など、多くの要求が特定のサーバーに集中するとサーバーに負荷がかかり、最悪の場合にはシステムが停止してしまいます。
しかも、その対策として処理能力の高いサーバーを用意したり、複数台のサーバーを用意したりするのも、費用が非常に高額になってしまうこともあり容易ではありません。
一方、P2Pネットワークでは、対等な機能を持ったコンピューターがピアとして参加して、互いに通信をすることでシステムを構成しています。そのため、ネットワークを構成する多くのピアの中に障害を起こして停止したものがあったとしても、それ以外のピアはネットワーク上の他のピアと通信を行うことができ、影響なく処理を継続することが可能です。また、特定ピア間のネットワークが障害を起こしたとしても、同様の理由で他のピアとの間のネットワークで通信することが可能です。
つまりP2Pネットワークでは、実質的にシステム停止時間がゼロ、つまりゼロダウンタイムが実現できるわけです(図2.5)。
また、負荷分散の点でもP2Pネットワーク方式は重要な特徴を持っています。P2Pネットワーク方式においてピアはあくまで対等な存在であり、クライアント・サーバー方式のサーバーのように特定のコンピューターに処理が集中することはありません。そのため、自由にピアを追加して、処理を分散することができます(スケールアウト:増強)。このような特性を、「スケーラビリティに優れている」といいます。
実際にP2Pネットワーク方式で構成されているビットコインネットワークは、稼働を開始した2009年から10年以上たつ現在も停止することなく動き続けており、「実質的にゼロダウンタイムである」ことが証明され続けています。
2.3.2 安価にシステム構築が可能
ここまで見てきたように、P2Pネットワーク方式では、クライアント・サーバー方式とは違ってピアとして対等な役割の複数のコンピューターでネットワークが構成されています。それは経済的な利点にもつながります。P2Pネットワーク方式を使うと、安価にシステムを構築することが可能なのです。
P2Pネットワーク方式では、サーバー・クライアント方式の場合のように「役割に応じた高価なコンピューターを複数用意する」ような必要はありません(図2.6)。
また一般的に、P2Pネットワークに参加する個々のコンピューターはサーバーに比べて非常に安価なものです。それでも、先述のとおり障害にも対応でき、スケーラビリティにも優れています。また、クライアント・サーバー方式のようにそれぞれのコンピューターが特別な役割を持っているわけではないため、ネットワークを構成する際に複雑なシステム構成を設計/構築する必要もありません。
これらの特徴から、P2Pネットワーク方式を使えば安価にシステムを構築することが可能となるのです。
2.3.3 非中央集権的である
さらに、ブロックチェーンでP2Pネットワーク方式が使われるのは、非中央集権的であるためです。
図2.7では、クライアント・サーバー方式とピアツーピア方式を、それぞれ中央集権的/非中央集権的なネットワークとして示します。
クライアント・サーバー方式では、すべての情報を集約し、アクセス権なども管理するサーバーが存在し、そこに接続するクライアントはサーバーと対等とはいえません。
一方P2Pネットワークでは、参加するコンピューターがサーバー/クライアントのような役割を持たず、権限が特定のサーバーに集中することがありません。また情報も、参加しているすべてのピアによって対等に共有されています。
このことから、特定のサーバーに集められた情報が独占・隠蔽されることによる権力の集中を防ぐことができます。特にビットコインの場合には、参加しているノードが過去からのすべての情報を分散台帳として対等に参照することができることで、取引の信頼性、セキュリティを確保する仕組みとなっています。
2.4 P2Pネットワークの接続
それでは、P2Pネットワークでノード立ち上げ時などネットワークに参加する際、どのようにしてインターネット上で通信する相手先を決めているのでしょうか。以下で、ブロックチェーンで実際に行われている方式を見ていきましょう。
ブロックチェーンは、第3章で詳しく見るように、参加できるノードを制限するか否かによって「プライベートブロックチェーン」と「パブリックブロックチェーン」に分けることができます。それぞれの場合によって、ネットワークへの参加方法が異なってくるため、個別に見ていくことにしましょう。
2.4.1 プライベートブロックチェーンの場合
まず、Hyperledger FabricやHyperledger Irohaに代表されるプライベートブロックチェーンでは、許可されたノードだけがネットワークに参加することができます。つまり、あらかじめ決められたノード、または明示的に追加されたノードによりネットワークが構成されるわけです。
プライベートブロックチェーンは、図2.8のように特定のノードだけが参加できるネットワークであるため、通信の相手先も容易に決定することができます。
2.4.2 パブリックブロックチェーンの場合
一方、ビットコインやイーサリアムに代表されるパブリックブロックチェーンでは、参加できるノードは制限されておらず、不特定多数となっています(図2.9)。そのため、ノードを立ち上げた場合には通信先となる不特定の相手を探し出す必要があります。
ビットコインの場合
ただ、「不特定の相手」とはいえ、何も手がかりがなければ通信の相手先を決めることは不可能です。実際には定められた方法で通信の相手先を決めています。
それではその方法を、ビットコインを例に見てみましょう。ビットコインでは、次のような方式を組み合わせることで確実に通信先を探し出すことができる仕組みになっています(参考:https://en.bitcoin.it/wiki/Network#Bootstrapping)。
- 固定IPアドレスリスト
- DNS
- IRC
①に示す「固定IPアドレスリスト」とは、ビットコインのソースコード中に書かれた「ここは確実に接続できる」というアドレスを利用する方法です。具体的なIPアドレスは、以下のURLから確認することができます。ここには、IPv4アドレスとIPv6アドレスを合わせて700以上のアドレスが記述されています(リスト2.1)。
②に示す「DNS」とは、DNSサーバーに問い合わせて返ってくるアドレス一覧をもとに接続する方式です。バージョン0.6.x以降は、これが既定の方式とされています。DNSサーバーのアドレスも、ソースコード中に記述されていますが、例としてseed.bitcoin.sipa.beにdigコマンドで問い合わせを行うと、以下のような内容を返してきます。
$ dig +short seed.bitcoin.sipa.be 145.239.254.226 124.122.254.251 178.143.52.84 216.38.129.164 193.84.116.22 178.238.236.248 188.155.235.244 13.112.109.34 193.119.100.113 (以下略)
③は、IRC(Internet Relay Chat)というチャットプロトコルを利用する方法です。ただし、この方法はバージョン0.6.x以降はデフォルトで無効になっており、バージョン0.8.2からは機能自体が削除されています。この方法では、#bitcoin00から#bitcoin99までのチャネル(チャットグループ)に参加することでIPアドレスを入手できる、という仕組みになっていました。
他にもbitcoin-cli(ビットコインのコマンドラインインターフェースアプリケーション)で-addnodeコマンドを実行するといった方法もあります。
イーサリアムの場合
もう一つ、イーサリアムで利用されている方法についても見ておきましょう。イーサリアムでは、「ブートノード」というソースコードに埋め込まれたコンピューターを起点として接続先を探し出す方式となっています。具体的な内容は、以下のURLから確認することができます(リスト2.2)。
・https://github.com/ethereum/go-ethereum/blob/v1.9.2/params/bootnodes.go
イーサリアムでは、接続先としてIPアドレスだけでなく、enode URL形式(参考:https://github.com/ethereum/wiki/wiki/enode-url-format)と呼ばれるURLスキームで記述されたノード情報を用います。enode URL形式は、以下の内容を含んでいます(図2.10)。
- 16進数のノードID
- ホスト名(IPアドレス指定のみ)とポート番号
- TCPとUDP(検出用)のポート番号が異なる場合には、「discport=」に続けてUDPポート番号
このスキームはノード検出プロトコルで使われており、第9章で紹介するgethクライアントのコマンドラインオプション--bootnodesや、JavaScriptコンソールで使用することができます。詳しく知りたい方は、以下のURLが参考になります。
このように、パブリックブロックチェーンでは、P2Pネットワークを構成する通信の相手先を確実に探し出すために、さまざまな方法を組み合わせて利用しています。