ビットコインP2Pネットワークは、さまざまな種類のノードから成り立ち分散化されたネットワークです。これらのノードの関係は平等で、中心的なノードは存在しません。
当記事では、このようなビットコインネットワークの特性をふまえて、特徴的なノードの種類についてお伝えしていきます。特に、代表的なノードであるフルノードとSPVノードについて詳しく見ていきましょう。
ビットコインネットワークの特徴
ビットコインネットワークとは、ビットコインのP2P(Peer to Peer)ネットワークにおけるビットコインノードの集合体のことを言います。
ビットコインネットワークに参加しているノードは同等の立場を持ち、階層的な関係はありません。つまり、中心的に管理をするノードは存在せず、ネットワーク内の負担もそれぞれが分担しています。
このようにビットコインネットワークはP2Pでつながり、分散化(Decentralized)され、かつフラットでオープンなネットワークなのです。
ノードの種類と機能
ネットワークに参加しているノードの立場はフラットですが、ノードの種類はいくつか存在しそれぞれの役割も異なります。
ノードが持つことができる機能には以下の4つがあります。
- ウォレット
- マイニング
- フルブロックチェーンデータベース
- ルーティング
それぞれの機能については名称からイメージが湧くと思います。ウォレットとマイニングはその名の通り、ウォレットとしての機能とマイニングができる機能です。フルブロックチェーンデータベースとは、genesisブロック(最初のブロック)から最新のブロックまでの完全なブロックチェーンのコピーを持つ機能のことです。
ルーティングは、ネットワークにおいて他のノードとの通信経路を判断する機能になるので、全てのノードがこのルーティング機能は持っています。しかし、他の3つの機能はノードの種類によって持っているものと持っていないものがあります。
ビットコインP2Pネットワークにはさまざまな種類のノードが存在しますが、代表的なノードは以下の通りです。
- リファレンスクライアント(ビットコインコア):4つの全ての機能を持つノード
- フルノード:フルブロックチェーンデータベースとルーティング機能を持つノード
- SPVノード:ウォレットとルーティング機能を持つノード
- ソロマイナー:マイニング、フルブロックチェーンデータベース、ルーティングの機能を持つノード
ここからは特に重要なフルノードとSPVノードについて見ていきましょう。
フルノードとは
フルノードは、完璧なブロックチェーンを保持しトランザクションの検証、具体的には「トランザクションがブロックチェーンに記録されたか」「トランザクションの二重支払いはないか」といったことを検証するノードです。
フルノードとは、従来であればフルブロックチェーンノードと呼ばれ、上述のようにgenesisブロックから最新のブロックまで全てのブロックチェーンのコピーを持っているノードを指していました。
しかし、現在ではフルノードはアーカイブノードと剪定ノード(Pruning Node)に分けることができます。アーカイブノードは従来のフルブロックチェーンノードと同じで全てのブロックチェーンを持っているノードです。
一方、剪定ノードは過去の不要なブロックは削除して持っていません。つまり、完璧なブロックチェーンは持っていないのです。しかし、剪定ノードの立ち上げ時は全てのブロックチェーンをネットワークからダウンロードするのでフルノードに分類されています。全てのブロックチェーンをダウンロード後、不要な過去のブロックは削除してしまうことで、ストレージの負担を減らしているのです。
なので剪定ノードは過去のトランザクションをすべて検証することはできませんが、UTXOについては全て保持しているので、二重支払いなどの検証は行うことができます。
参考:ビットコインのトランザクションにおける「UTXO」を分かりやすく解説してみた
フルノードを運用するモチベーション・メリット
ソロマイナーなどのマイニングを行うノードは、マイニング報酬や取引手数料を得ることがモチベーションでノードを運用しています。それに対し、フルノードはマイニングは行わずトランザクションの検証を行うだけです。この検証に対する報酬はないにも関わらず、フルノードを運用するモチベーションはどこにあるのでしょうか。
まずあげられるのがプライバシー保護です。詳しくは次項のSPVノードで解説しますが、フルノードは他のノードにアドレス情報を伝達する必要がないので、プライバシーが漏れる心配がありません。例えば、資産家や著名人などプライバシー情報が漏れると困る場合にメリットになります。
もうひとつの考えられるモチベーションはネットワークへの貢献です。ビットコインネットワークの中でフルノードが減少してしまうと、トランザクションの検証を行うことができず大きな問題となってしまいます。
実際には、トランザクションの検証はマイナーも行うので、フルノードのみの役割ではありませんが、フルノードを運営することはビットコインネットワークへの貢献になります。
ちなみにトランザクションの検証は、ネットワーク内のノードが持っている未検証のトランザクションのリストであるトランザクションプールから参照することで行われます。
検証されたトランザクションはブロックに追加されていきますが、子トランザクションが先に来てしまった場合、その子トランザクションが参照している親トランザクションが来るまでオーファンプールに保存されます。親トランザクションが到着次第、その子トランザクションはオーファンプールから削除され、トランザクションプールに移ります。
このように連鎖的に成っているトランザクションを順番に検証するように工夫されているのです。
SPVノードとは
SPV(Simplified payment verification)ノードとは、フルノードが持っているブロックチェーンを参照することで、自身がブロックチェーンをダウンロードすることなくトランザクションの検証が行えるノードのことです。
SPVノード自体は、ブロックのヘッダー部分(全体サイズの1/1000程度)のみダウンロードするので軽量に動作します。なのでウォレットの最も一般的な形式になっています。
SPVノードは完璧なブロックチェーンを持っていないので変わった形式でトランザクションの検証を行います。トランザクションの存在を検証する場合は、ブロックのヘッダにあるトランザクションのマークル木を使うことで容易にチェックすることが可能です。
二重支払いに関しては、対象のトランザクションを含むブロックから6個以上のブロックが生成された段階で「二重支払いは起きていない」とします。ただし、これは確率的な検証で100%断定できる検証ではありません。
このようにSPVノードは他のフルノードなどに特定のトランザクションを含むデータを要求するので、SPVノードの持つウォレットのアドレスなどが分かってしまう可能性があります。つまり、SPVノードはフルノードに比べて軽量にトランザクションの検証が行えますが、プライバシーが漏れてしまう恐れがあるのです。
このリスクを削減するためにブルームフィルタという機能が存在しています。ブルームフィルタとは、確率的な探索フィルタで欲しいパターンを正確に特定しなくてもパターンを記述できる方法です。
つまり、ブルームフィルタを使うことでどのアドレスを要求しているか明らかにすることなく、特定のパターンに合ったトランザクションを要求し検証することが可能になります。