ブロックチェーンについて

 一般的には、ビットコインや、そのあとで開発されたイーサリアムなどで使われている技術を総称してブロックチェーンと呼んでいます。
 ビットコインではP2Pネットワークや暗号など、多くの既存の技術が使われていますが、新しいのは「取引の履歴を記録する方法」であり、この方法がブロックチェーンと呼ばれています。

ハッシュ関数について

 ハッシュ関数は、とても便利な特徴を持っているため、ブロックチェーンのあらゆる場所で頻繁に利用されています。
 ハッシュ関数は入力したデータを、一定のデータに基づき異なるデータに変換する関数です。ブロックチェーンにおけるハッシュ関数の重要な特徴として、以下の4点が挙げられます。
 1. 一方向にしか計算できず、逆算ができない(不可逆性)
 2. 入力データが少しでも変われば、出力データが大きく変わる(機密性)
 3. 入力データの長さを問わず、出力データは同じ長さのデータとなる(固定長)
 4. 入力データから出力データを簡単に計算できる(処理速度)

マイニングと合意形成

 ブロックはトランザクションを取り込んだ時点では完成していません。ブロックのハッシュ値を計算し、その値があらかじめ定められた難易度よりも小さくなければ、ブロック生成は成功とならないのです。

[図1]マイニング

 もしブロック生成に失敗した場合は、ナンスと呼ばれる値を変更します。ハッシュ値の特徴として、もとになるデータが少しでも変わると、結果となるハッシュ値は大きく変わります。そのため、ナンスを変えて再度ハッシュ値を計算すると、まったく違う値になります。
 こうして何度も何度も、ハッシュ値が難易度より小さくなるまで、つまり成功するまで「ナンスの変更」→「ハッシュ値の計算」を繰り返します。この処理のことをブロックのマイニングと呼び、処理を行うノードのことをマイナーと呼びます。
 ビットコインにおいて、難易度は「マイニングに成功するのがおよそ10分に1回の頻度になる」ように調節されています。

Nonceを変えてハッシュ計算

 以下では、実際にハッシュ計算をPythonで行ってみました。
まず、ハッシュ関数において入力値の変化に対して、どのくらい出力値が変わるのかを実験してみました。
 [リスト1]のプログラムは「目白祭」という文字列に対して、Nonceに該当する数字を1ずつ加えながらハッシュ値を計算するものです。Nonceとして0〜19までの20個を使いました。

[リスト1]少しずつ値を変えた時のハッシュ値の計算
[input]

[output]

 このように、1つ数字を変えただけでも、ハッシュ値は大きく異なることが分かります。

PoWとは

 「計算パワーに応じてマイニングの成功確率が上がる」仕組みをPoW(Proof of Work:仕事による証明)といいます。「正しいブロックとは何か」というノード間の合意を、計算パワーにもとづいて合意形成をしています。
 ビットコインをはじめ多くの仮想通貨がPoWを採用しています。

PoWは[図2]に示すようなプロセスで行われます。

[図2]Proof of Workのプロセス(1)

PoWの大まかなプロセスは以下の通りです。
 0. ネットワーク上を伝搬する取引データを受信して記録しておく。
 1. 取引データをまとめてブロックを生成する。
 2. ナンスを少しずつ変えながら大量のハッシュ計算を行う。
 3. 条件に合うナンスを見つけた人が、ブロックを完成させて他のノードに報告する。
 4. 他のノードはブロックの中身とナンス値が正しいかどうかを検証する。
 5. ナンス値が正しければ、ブロックを完成させた人に報酬が支払われる。

 PoWは、不特定多数のコンピュータによる演算を行いブロックチェーン全体の整合性を保つためのアルゴリズムです。具体的には、取引データを要約したデータやタイムスタンプなどのデータをひとまとめにします。そのデータに「ナンス(Nonce)」を加えて、ハッシュ関数に掛けてハッシュ値を求めます。このハッシュ値が一定値(目標値)よりも小さな値になるまでナンスを変えて計算を行います。この計算を行うことを「マイニング」といいます。なお、ここでタイムスタンプやナンスをまとめたものがブロックヘッダになります。

[図3]Proof of Workのプロセス(2)

 ナンス以外のデータは固定されているので、ナンスを少しずつ変えるだけになります。しかし、ハッシュ関数の性質から少し入力値が変化するだけでも、出力されるハッシュ値は大きく変動します。そのため、一定の値よりも小さくするためにナンスを推測することは基本的にできません。そのため、マイナーはナンスを総当たりで計算するしかなくなります。
 条件に合うナンスを見つけるとマイニング成功となり、成功したマイナーはマイニング報酬を受け取ることができます。

承認

 トランザクションとしての取引は、ブロックに追加された時点で承認されます。つまりトランザクションは、ブロックに取り込まれていない状態であれば未承認状態です。
 さらに、マイニングによってブロックチェーンにつながるブロックが増えていくことで、取引を実行したトランザクションの取り込まれているブロックにつながるブロックが増えていきます。この結果、承認数が増えていきます。

[図4]ブロックの承認

 [図4]では、マイニングに成功したブロックがチェーンにつなげられて承認数が増えている様子を示しています。
 ビットコインでは10分間ごとにブロックチェーンが生成されているため、取引が承認されるためには約10分間ほど待つ必要があります。
 また、およそ6ブロックつなげられた状態で取引が覆る可能性が低いといわれているので、そのためには、およそ1時間ほど経過するのを待つ必要があります。

難易度調整

 マイニングでは難易度(Difficulty)が設定されています。これは、ハッシュパワー(ブロックチェーンのネットワーク上での計算能力)が大きくなることで極端にマイニングが速くなったり、逆に小さくなってマイニングが遅くなったりすることを防ぐために設けられています。PoWにおける難易度は、ナンスを含めたブロックヘッダをハッシュ化した値の小ささを指定しています。値が小さければ小さいほど条件が厳しくなるため、ハッシュ値の計算に手間がかかります。ビットコインの場合、マイニングは約10分に1回成功するように難易度が設定され、2016ブロックが生成されるごとに自動的に調整されます。

難易度調整が行われる理由

 現在マイニングに利用されるマシンは著しく性能が高くなっており、それに伴いマイニングに成功する時間間隔が短くなっています。仮に難易度調整が行われなかった場合、マイニング報酬が生成されるスパンが短くなりインフレーションが起こってしまう可能性が高くなります。一方、マイニングに成功する時間間隔が長くなる場合、なかなかトランザクションが承認されないという事態が起こります。そのため、安定してほぼ同じ間隔でブロックが生成されるようにするために難易度調整が行われるのです。