例えば、「12345」という数値に☆を適用してみる。まず各桁の数を足し合わせて「1+2+3+4+5=15」である。次にもとの数値をその15でわるので、「12345÷15=823あまり0」となる。したがって「12345」のハッシュ値(ここでは「☆値」と呼ぶことにする)は「0」となる。もとの数値を1だけ増やして「12346」として適用してみると、「1+2+3+4+6=16」となり「12346÷16=771あまり10」なので☆値は「10」である。このように、☆値は元の数値より小さく、元の数値を少し変えただけで☆値が大きく変わることがある。これは(☆値ではない)一般的なハッシュ値にも言える性質である。
さて、ここで再び図表5の「ブロック#2」を考えていこう。ヘッダを構成する「ブロック#1ヘッダのハッシュ値」「マークルルート」「タイムスタンプ」「採掘難易度」「ナンス」はすべて数字である。そこで例えば「ブロック#1ヘッダのハッシュ値」を「6」、マークルルートは「345」、タイムスタンプは「0525」、採掘難易度は「1」としてみよう
9。
9 親ブロックの数値は適当、マークルルートは「取引3・4・5」が含まれていることから、タイムスタンプは「5月25日」から、採掘難易度は「一番容易」ということから1の数値を選んだが、もちろん本物のビットコインのブロックヘッダに格納されている数値はもっと複雑である。ただし、いずれにしても数字の羅列である。
そうすると、ブロック#2のヘッダ部分は「634505251???」という数値になる。
ここで、最後の「???」に相当する「ナンス」については説明していなかったが、マイニングでは実はこの数値が重要である。「ナンス」の数値は外部から与えられるものではなく、
「ナンス」はネットワーク参加者(採掘者)が探しあてる数値である(図表5で「ナンス」を黄色にしているのは金発掘のイメージのため)。
では、採掘者はどのような「ナンス」(「???」の数値)を探しているのだろうか。それは、ブロックヘッダからハッシュ値を計算したときに、そのハッシュ値が閾値(target)を下回るような「ナンス」である。この閾値を下回るとブロックが作成される(そこに含まれる取引が承認される)。
これを具体例で示してみたい。ここでは閾値としてハッシュ値(この例では「☆値」)が10未満となるような「ナンス」を探している状況を想像してみる。
採掘者がナンスとして「001」を選んでブロックヘッダの「☆値」を計算してみたとする。この場合、「ブロック#2のヘッダ」=「634505251001」(下3桁がナンスで今回は「001」)となり、この☆値は25である
10。☆値が10以上であるためブロックは作成できない。
10 6+3+4+5+0+5+2+5+1+0+0+1=32で、634505251001÷32=19828289093あまり25
次にナンスとして「045」を選んでみる。この場合、「ブロック#2のヘッダ」=「634505251045」であり、☆値は5となる
11。☆値が10未満であるためブロックが作成できる。
11 6+3+4+5+0+5+2+5+1+0+4+5=40で、634505251001÷40=15862631276あまり5
したがって、「ブロック#2」は「ヘッダ部分」が「634505251045」、これに「取引リスト」が加わったものとして作成できる(前掲図表5)。これ以外の「ナンス」でも☆値が閾値以下になるような「ナンス」であればブロックは作成できるが、どの"あたり"の「ナンス」がブロックとして採用されるかは早いもの勝ちである(1番早く見つけられた"あたり"の「ナンス」でブロックが作成される)。
また、「ブロック#2」のヘッダである「634505251045」の☆値となった「5」は「ブロック#3」のヘッダの先頭部分
12の数字となる(「ブロック#2」ヘッダの先頭部分が「ブロック#1」のヘッダのハッシュ値であったことと同じ)。
12 実際にはソフトウェアのバージョン情報がさらに先頭につく(脚注8と同様)。
このように
前ブロックのヘッダ部分のハッシュ値が次ブロックに組み込まれていることから、ブロックがチェーン状に繋がっているイメージが持てる。そのため、このブロックの連なりがブロックチェーンと呼ばれる。そして、前のブロックが作成されてはじめて次のブロックのヘッダに格納すべき数値が分かる。そのためブロックは1列にしかつながらず、いわば
ブロックのハッシュ値はその前までに繋がっているブロックすべての情報が集約されているのであり、これがチェーンの役割を果たしていると言える。
このブロック作成で重要なのは、もちろん「ナンス探し」であるが、これは"
あてずっぽう"で探すしかない(今回の例で「☆値」をやや込み入った計算にしたのは、"あてずっぽう"でしか探せなさそうな雰囲気を出すためでもある)。
また、先ほど述べたように"あたり"の「ナンス」探しは早いもの勝ちである。早くナンスを探せた参加者(ノード)はブロックを作成し、その報酬として新しいコインを得ることができる
13。それ以外の参加者(ノード)には報酬はなく、次のブロックでナンス探しをしなければならない。
13 取引リストに含まれている取引の手数料も得ることができる。
繰り返すと、
「ナンス探し」という仕事(計算)をして"あたり"のナンスを見つけることがブロック生成であり、このブロック生成でブロックに含まれている「取引」が承認されたと見なされる。こうした仕組みは「プルーフオブワーク(PoW:Proof of Work)」と呼ばれている
14。仕事をしたという証拠("あたり"のナンスを見つけたこと)が取引を承認させているのである。取引の承認は管理者によりなされるのではなく、
「ナンス」探しという仕事(計算)の結果、ある参加者が適切な結果を得た(閾値以下の「ナンス」を見つけた)という結果でなされている(そして後述するように、これには大量の電力を消費することがある)。
14 プルーフオブワークはビットコインに限らず一般的に使われる用語で、ある課題(仕事)に取り組んだこと(そして成果をだしたこと)をもって「証拠」とする(取引の承認根拠とする)という仕組みのことを指す。
これで、前述の「AからBへの送金(移転)取引はどのように承認されているのだろうか。」とい疑問の回答が得られた(回答は、「ブロックの作成によりなされている」)。ただし、まだ「不正取引をどのように防いでいるのだろうか」という疑問は解消されないかもしれない。
この疑問についても説明していきたいが、その前に、閾値の設定について触れておきたい。閾値が大きければ適当に選んだ「ナンス」が"あたる"確率は高まり、発見されやすくなり、閾値が小さければ適当に選んだ「ナンス」はなかなかあたらずに発見されにくくなることから、この閾値の調整をどうするのか、という点は重要であるからだ。
結論を述べれば、ビットコインでは、
10分間に1回、どこかの参加者がナンスを見つける、というように難易度が調整される15。具体的には2016ブロック(1ブロック10分換算で20160分、つまりちょうど2週間)毎に、想定時間(20160分)より早くブロック作成されたとすれば難易度が上がり、それより遅ければ難易度が下がるというように調整される(この難易度の数値はブロックヘッダ内にも含まれている(前掲図表5))
16。なお、この10分という時間の根拠は不明なようだが、「ブロック」がネットワーク参加者に共有されるのに必要な時間といったの意見があるようである。
15 したがって10分に1回新しいコインが誕生している(採掘されている)ことになる。ただし、ブロック生成で誕生する(採掘される)ビットコインは幾何級数的に減少する。ビットコインが生まれた当初(2009年)は1ブロックで50ビットコインが報酬として与えられていたが、12年11月には25ビットコインに半減、16年7月には12.5ビットコインにさらに半減、20年5月には6.25ビットコインにさらに半減している。この報酬が半減する周期は半減期と呼ばれる(実際は前回の半減期が高さ63000のブロック、次の半減期が高さ84000のブロックというようにブロック数で決まっているが、10分に1ブロック生成されるよう採掘難易度がコントロールされていることから半減期が約4年周期であることが分かる)。
16 (「ナンス」には桁数制限があるため)難易度が高い場合、すべての「ナンス」を調べても"あたり"が見つからないという可能性もあるのではないか、と疑問を持つ人もいるかもしれない。その通りである。ただし、ブロックヘッダに「タイムスタンプ」があるため、時間が経過してこのタイムスタンプの数値が変わるたびに(たとえば1秒毎に)"あたり"が変わるので、延々に見つからないという事はなく、いつかは発見されるだろうという期待が持てる(本コラム上の「タイムスタンプ」の例では月日だけしか使わなかったが、実際のビットコインはもっと細かい時刻を記録している)。ちなみに、ブロックの取引リストの先頭に保管される生成取引(マイニングによる報酬として生まれた取引)にも数値を格納する部分があり、ここも「拡張ナンス(extra nonce)」として使われる。ここに数値を適当に格納することで「マークルルート」の値が変わり、(拡張ではない)"あたり"の「ナンス」が変わる。このように、計算を続ければいずれ"あたり"が見つかるという工夫もされている。
したがって、ネットワーク参加者が増えたり、マイニング(「ナンス探し」)に使うCPU・GPUの性能が向上するなどして、閾値以下の「ナンス」が発見されやすくなると、2016ブロックを作成する時間が20160分(2週間)より短縮され、閾値の設定が下がり難易度が上がる。
マイニングには常に一定の計算時間を費やさなければならないようになっている。
上の☆値は1桁や2桁の数だったが、実際のビットコインのブロックヘッダのハッシュ値の計算はSHA-2(SHA256)と呼ばれるハッシュ関数(アルゴリズム)が用いられており、その結果の数値(出力)が取り得る値は2進数の桁数で256桁、16進数で64桁、10進数だと78桁である。桁数(長さ)で見ると長い訳ではないが、数としては相当大きな数である
17。
具体的に、執筆時点でのビットコインのブロック作成の閾値を見てみよう。