![見出し画像](https://assets.st-note.com/production/uploads/images/65129759/rectangle_large_type_2_f7cc5958019df512cb078c087d10c8e0.png?width=1200)
ビットコインに学ぶブロックチェーンの真髄#8 コンセンサス・アルゴリズム編1
昨今話題のブロックチェーン技術について、その概要と詳細な仕組みを10 回くらいの連載を通じて詳しめに解説していくシリーズの第8回目になります。
第7回目はこちら
シリーズ全体はこちら
今回からはブロックチェーンの真髄であるコンセンサス・アルゴリズムについての解説に入っていきます。
ルールの必要性
私たちは「頭の中でトラストレス(分散型)なデジタル通貨システムを構築する」ことを通じてブロックチェーンとは何たるかを理解するということを目的にここまで話を進めてきました。
今までの流れをおさらいすると、P2P通信によって分散型のネットワークを構築し、電子署名によってトランザクションの正真性を検証できるようになりました。通貨システムにとって不可欠な「自分の資産は自分にしか使えない」という条件はクリアできています。
これらのトランザクションをノードが全て記録していけば通貨システムとして成り立ちそうです。しかし、ノードが勝手にトランザクションを記録していってしまうと、各ノードごとに別々の帳簿ができてしまいます。すると悪意のあるユーザーによる二重支払いが可能になってしまいます。
たとえばAさんが「1BTCをBさんに送る」というトランザクションを作成し、ノードであるCさんに送ったとします。続いてAさんは先ほどと同じビットコインを使用して「1BTCをDさんに送る」というトランザクションをノードであるEさんに送ります。すると、Cさんは自分の帳簿に前者のトランザクションを追加し、Eさんは後者のトランザクションを自分の帳簿に追加します。これにより、同じビットコインを使って二か所に支払いを行うことが可能になってしまうのです。
このような二重支払いを防ぐためには、すべてのノードが全く同じ帳簿を共有する必要があります。つまり、上の例で言えばCさんもEさんも同じトランザクションを自分のブロックチェーンに追加した状態にならなければならないということです。ではどうすればノード間で合意を取りながら帳簿を作成していくことができるでしょうか?
全員で同じ帳簿を共有するためには、帳簿の作り方に関してルールを決める必要があります。このルールをコンセンサス・アルゴリズムといい、ビットコインではプルーフ・オブ・ワーク(PoW)というコンセンサス・アルゴリズムが採用されています。
ブロックの構造
コンセンサス・アルゴリズムの解説に入る前に、ブロックチェーンのブロックについて解説します。ブロックチェーンにおけるブロックとは、共有されている帳簿のページに相当するものです。
ブロックチェーンでは一定間隔でブロックが生成されます。たとえばビットコインであれば約10分に1回、イーサリアムであれば約15秒に1回の間隔でブロックが作られます。この時間は誰かが厳密に決めているわけではなく、「どれだけ高速でブロックを作ろうとしても、平均で10分かかってしまう」という意味です。
ブロックの連なりによって帳簿を表現しているので「ブロックチェーン」と呼ばれるようになりました。
このブロックには多数のトランザクション(誰が誰にいくら送るのかという情報)が詰め込まれています。ビットコインであれば直近の約10分間で作成されたトランザクションがブロックに入るということです。
ブロックは主にブロックヘッダーとトランザクションによって構成されています。ブロックヘッダーには「1つ前のブロックのブロックヘッダのハッシュ値(Previous Block Hash)」「生成時刻(Timestamp)」「マークルルート」などのブロックの基本情報が書き込まれています。
マークルルートとは、そのブロックに含まれる「トランザクションの集合体」を証明する数値です。マークルルートを算出するには、トーナメント形式のように、隣り合うトランザクションを足し合わせてそのハッシュ値をとり、そのハッシュ値と隣り合うハッシュ値を足してそのハッシュ値をとります。この操作を繰り返すと、ブロック内にいくつトランザクションが含まれていたとしても、最終的に一つのハッシュ値になります。これがマークルルートです。
マークルルートはそのブロックに含まれる全てのトランザクションに依存するハッシュ値であるため、トランザクションのうちどれかひとつでも改ざんされれば、マークルルートも全く別の値になります。
さらにPrevious Block Hashは1つ前のブロックの全てのデータに依存するため、1つ前のブロックのマークルルートが変わってしまうと、当然Previous Block Hashも変わってしまいます。したがって、過去のどこかのブロックでトランザクションが改ざんされればそれ以降のブロックのブロックヘッダも連鎖的に変わってしまいます。つまり、このブロックヘッダが直前のブロックとのつながりを証明していると言えるのです。
そしてブロックヘッダにはビットコインのコンセンサスアルゴリズムであるPoWに欠かせない「ナンス」という値も書き込まれています。このナンスは簡単に言うと計算問題の解にあたるものです。この値が正しくないと「このブロックは正当ではない」と判断されてしまいます。
一方、トランザクションのフィールドには大量のトランザクションが入れられています。このトランザクションのフィールドがブロックの容量のほとんどを占めます。ブロックのサイズが決まっているため、1つのブロックに入れられるトランザクションの数には限りがあります。
トランザクションのサイズにも依りますが、ビットコインであればだいたい1つのブロックに1500~2500トランザクションが含まれています。つまり、1つのブロックが10分でできるとすると、ビットコインの処理スピードは1秒あたり3~4トランザクションということになります。1秒あたり1000件以上処理できるクレジットカードと比べると、処理能力にかなりの差があります。
プルーフ・オブ・ワーク(PoW)
さて、ブロックの構造を一通り理解できたところで、コンセンサス・アルゴリズムの解説に戻ります。コンセンサス・アルゴリズムにはPoW以外にもいくつか種類があります。しかし現在ビットコインが採用している方式はPoWなので、ここではPoWに絞って解説していきます。
Proof of Workとは、直訳すると「仕事の証明」となります。これは「計算問題にどれだけの力が費やされたかの証明」と言い換えることが可能です。そしてビットコインではルールとして「一番多くの仕事がなされた(力が費やされた)チェーンを正しいチェーンとみなす」と決められています。
これは抽象的な話なのでもう少し具体的に掘り下げていきます。先ほど述べた通り、個々のノードは自分勝手に帳簿を作成していきます。ここで言う帳簿の作成とは「ブロックの生成」のことです。つまり、トランザクションを集めて、そのブロックの基本情報を示すブロックヘッダーを作るということです。このようにブロックを作るノードを特に「マイナー」と呼び、ブロック生成およびナンス発見のための計算処理を行うことを「マイニング」と呼びます。
しかし、このままの状態では全員がバラバラの帳簿を保有することになり、二重支払い問題を解決できないため、大量に作られたブロックの中から採用するブロックを一つに絞る必要があります。
そこでビットコインでは「最初にブロックを作った人のブロックを採用する」というルールを決めています。つまり早い者勝ちというわけです。トランザクションをまとめるだけなので、一見簡単そうに思えるかもしれません。しかし、ブロックを作ることはそう簡単ではありません。ある計算問題を解いて、正しいナンスを見つける必要があるからです。
この計算問題は非常に難しいです。実際にどんな問題なのか見てみましょう。
PoWにおける計算問題
その問題とは「ブロック自体のハッシュ値が、決められた値より小さくなるようなナンスを見つけること」です。
ナンスはブロックヘッダーに含まれる要素であるためナンスの値を変えればブロック自体のハッシュ値も別物になります。
マイナーは自分で作ったブロックのハッシュ値が決められた値以下になるまでランダムにナンスを変えてハッシュ値を計算するという作業を繰り返します。決められた値とは、難易度(difficulty)によって決定される値であり、「ハッシュ値の上から何桁が0になる」という形で定められます。この難易度が大きいほど、閾値が小さくなるため、計算に時間がかかります。
ビットコインではこの難易度は2016ブロックごとに変更されます。約10分に一度ブロックが追加されるので、およそ14日に一度難易度が変更されることになります。
この変更では、過去2016ブロックの追加にかかった時間の平均をとり、それが10分以内であれば想定よりも簡単だったということなので難易度が上がり、逆に10分を超えていれば難易度が下がるというルールになっています。難易度の変更はアルゴリズムに沿って行われるため、どのノードも同じ難易度を共有することになります。
そしてこの問題の解法ですが、今のところまともな解法は存在しません。ハッシュ関数には一方向性があり、出力から逆算して入力するということができないため、ナンスを見つけるためには地道にランダムな数値を入れて試してくしかないのです。
これはハッシュ関数の「入力を少し変えると出力が全く別物になる」、「出力から入力を特定できない」という性質を利用したものですが、これは従来の暗号学的なハッシュ関数の使い方とは全く逆の発想で使われていると言えるでしょう。
おわりに
ブロックチェーン上で帳簿を共有するために必要なルールである、コンセンサス・アルゴリズムについて解説を進めました。次回以降は「なぜこんなルールが必要なのか」や「コンセンサス・アルゴリズムの利点」などについて解説していきます。
このシリーズは『あたらしい経済』で私が執筆した「ブロックチェーンは今までのシステムと違って何がすごいのか〜ノンプログラマーでも解るブロックチェーン入門」シリーズを大幅に加筆修正したものになっています。
この記事が気に入ったらサポートをしてみませんか?