ビットコインネットワークに参加しているノードは、他のノードを信用することなくブロックチェーンに記録されたデータを「真実」として信じています。他ノードに対してトラストレスな状態で、ある事実に対して合意形成(コンセンサス)を行えているのです。
このように中央管理者がいないP2Pの状態で一体どのようにしてコンセンサスを取っているのでしょうか。つまり、どのようにして信用していないノードから受け取ったトランザクションを正しいトランザクションだと判断し、不正なトランザクションは拒否しているのでしょうか。そして、どのようにして個々のノードが下した判断をネットワーク全体のひとつの合意としてまとめているのでしょうか。
当記事ではビットコインネットワークにおいて分散型コンセンサスを形成する流れについて具体的に紹介していきます。分散型コンセンサスは以下のような流れで行われていきます。
- トランザクションの検証
- 候補ブロックへのトランザクションの追加
- 新規ブロックの検証
- ブロックチェーンの選択
また当記事ではUTXOの知識が前提となるのでこちらの記事も併せてご覧ください。
参考:ビットコインのトランザクションにおける「UTXO」を分かりやすく解説してみた
トランザクションの検証
UTXOを集めて作られたトランクザクションは隣接のノードに伝播され、受け取ったノードはそのトランザクションを検証した後にさらに隣接ノードに送ることでビットコインネットワーク全体で検証済みのトランザクションが共有されることになります。
トランザクションはインプットとアウトプットから成っており、UTXOを介して連鎖的につながっています。つまり、悪意のあるノードが不正なトランザクションを追加したり、トランザクション自体を改ざんしたりしても、そのようなトランザクションは過去のトランザクションを適切に参照できていないため、各ノードによるトランザクションの検証の際にはじかれてしまうのです。
具体例を見ていきましょう。例えば以下のような検証項目があげられます。
- トランザクションのデータ構造は正しいか
- インプットとアウトプットが空ではないか
- トランザクションのサイズが大きすぎないか
- トランザクションプールかブロックに同じトランザクションがあるか
- インプットが参照しているアウトプットがトランザクションプールかメインブロックチェーンに存在するか。(なければそのトランザクションはオーファントランザクション)
- インプットにあるScriptSigは対応しているアウトプットのScriptPubKeyを解除できるか
トランザクションの検証はある特定のノードだけが行うのではなく、ネットワークに参加しているさまざまなノードが検証を行います。後述するマイニングのように計算量自体は多くないため、特別な集積回路を使用する必要などはありません。
また、トランザクションはあるノードから波紋のように次々と隣接ノードに伝搬されていきますが、それぞれのノードが特定のトランザクションを受け取るタイミングは異なります。
例えば、ノードAにとって遠いノードBよりも近いノードCから伝わるトランザクションの方が受け取るのが数秒早くなります。一方、ノードAとは逆にノードDにとってノードBの方がノードCより近いと、ノードBからのトランザクションをより早く受け取ることになるのです。
候補ブロックへトランザクションの追加
上記の手順で検証されたトランザクションは、各ノードによってトランザクションプールに送られます。そして、マイニングノードはトランザクションプールにある検証済みトランザクションを候補ブロックに追加していきます。
このとき候補ブロックに追加されるトランザクションは、マイニングノードに到達したトランザクションから順番に追加されるのではなく、あるアルゴリズムに則って優先順位を決めて、優先度の高いトランザクションから候補ブロックに追加していきます。
まずは、古く、ビットコイン量(value)の大きいトランザクションが優先的に候補ブロックに追加されます。その後、データサイズに対して手数料の大きいトランザクションが追加されていくのです。
構築した候補ブロックを使ってマイナーはマイニングを行なっていきます。マイニングはプルーフ・オブ・ワークアルゴリズムに対する解(ナンス)を見つけるための膨大な計算です。プルーフ・オブ・ワークの仕組みについてはこちらの記事をご覧ください。
参考:プルーフオブワーク(PoW)の仕組みを知らずにビットコインは語れない
マイニングに成功したマイナーはビットコインネットワークの全てのピアにそのブロックを送信します。他のマイナーは、マイニングされたブロックを受け取り、下記のブロック検証を行い、正しくマイニングされたことが分かると次のブロックのマイニングに移ります。
その際、すでに受け取ったブロックに含まれるトランザクションはトランザクションプールから削除することで、次のブロックに重複したトランザクションが含まれないようにしているのです。このようにマイナーはマイニングの計算を行いつつ、次の候補ブロックにトランザクションを集めています。
新規ブロックの検証
あるマイナーがマイニングに成功すると、そのブロックをビットコインネットワークの全てのノードに送り、ブロックを受け取ったノードはそのブロックが正当であるか検証を行います。
トランザクションの検証のようにブロックの検証も以下のようにさまざまな検証項目が存在します。
- ブロックのデータ構造が正しいか
- PoWのナンス探しができているか
- ブロックサイズが大きすぎないか
- ブロックに含まれるトランザクションが上述のトランザクションの検証項目を全て満たしているか
それぞれのノードによって独立したブロックの検証が行われ、有効であると判断したノードはそのブロックをブロックチェーンに追加します。もしノードがそのブロックが不正であると判断した場合はブロックチェーンに追加されることはありません。
なのでマイナーが自身に有利である不正なブロックを作っても、ネットワークのノードに拒否されマイニング報酬を受け取ることはできないのです。さらに、マイニングにかかった多大な電気代が無駄になってしまうので不正を試みることはリスクが大きいのです。
ブロックチェーンの選択
ブロックチェーンは上述の流れで次々のブロックが追加されつながれていくことで形成されます。しかし、ブロックチェーンは一本鎖でまっすぐつながっているのではなく、たまにフォーク(分岐)することがあります。
どのようなタイミングでフォークするのかというと、複数のマイナーがほぼ同時にナンスを見つけマイニングに成功したときです。すると、それぞれのマイナーがブロックをブロックチェーンに追加できるのでフォークすることになります。
ビットコインのブロックチェーンはメインチェーンを軸に構築されていきますので、このフォークは解消されなければなりません。このフォークは「累積difficultyが最も多くなっているチェーンをメインチェーンとする」というルールに基づき解消されていきます。つまり、最も長いチェーンがメインチェーンになるのです。
例えば、ブロックチェーンがあるタイミングで2つにフォークしたとします。それぞれの先端にあるブロックを親として、マイナーは次の子ブロックを追加しようとマイニングを行なっていきます。
すると、どちらかの一方の親ブロックの子ブロックの方が先に見つかるはずなので、そのブロックが含まれるチェーンがメインチェーンとなるのです。(ほとんどの場合、1ブロックでフォークは解消されます。)フォークし、追加されることのなかったもう一方のチェーンはデータとして存在しなかったことになります。
ブロックチェーンの選択は上記のような流れで行われていきますが、注意しなければならないのはブロックチェーンは分散化されているため、個々のノードが持っているブロックチェーンは常に一致しているとは限らないということです。
分かりやすく説明するためにノード間の距離が物理的な距離であるとイメージします。イギリスのマイニングノードがブロックAを生成すると同時に、日本のマイニングノードがブロックBを生成したとします。すると、上述したようにマイニングノードは近くのノードからそのブロックを送信していきますので、ドイツのノードはブロックAが最新のブロックになりますし、韓国のノードはブロックBが最新のブロックになります。
ドイツのノードには後からブロックBが送られてきますが、すでにブロックAが存在しますのでブロックBはフォークしたセカンダリーチェーンとして追加されます。韓国のノードでも同様のことが起こり、ブロックAがセカンダリーチェーンに追加されます。
そこで、この次にマイニングに成功したノードが中国であったとします。中国は距離的に日本の生成したブロックBを最新のブロックとして持っていたので、このとき生成したブロックCはブロックBを参照した新規ブロックになります。
ブロックCが中国のノードから送られると、ブロックBを最新のブロックとして持つ日本や韓国の場合は問題なくブロックCをブロックチェーンに追加することができます。
一方、イギリスやドイツのノードはブロックAを最新のブロックとして持っており、ブロックCをブロックAの先につなげることはできません。この時点で、ブロックB-ブロックCとつながるブロックチェーンの方が累積difficultyが大きい、つまり長いブロックチェーンであるので、イギリスやドイツのノードでもブロックCが最新となるブロックチェーンがメインチェーンになるのです。
このように、各ノードが持っているブロックチェーンの状態は一致していないことがあるので注意しなければなりません。