採掘の難易度

ブロックの追加権を獲得するためのブロックの採掘の難易度であるが、初期の難易度1はおおよそ2の32乗回のHash計算に1回の採掘という頻度に設定されていた。しかし、採掘能力が向上するにつれて発掘頻度が増えてくるので、10分間に1回のペースを保つためには、発掘の難易度を上げて行く必要がある。難易度100は、Hash計算あたりの発掘頻度が初期の1/100となるようにターゲット値を下げるということを意味する。

ブロックの追加の速度であるが、2016ブロックが発掘されるのに掛かった期間をタイムスタンプから計算して、それが10分間に1回(2016ブロックの発掘におおよそ2週間かかる)より短いか長いかの比率で難易度を更新する。現実には、採掘者は、他の採掘者とのし烈な競争に勝つために、より強力なHash計算ハードウェアを導入するので、採掘に必要な期間は短くなり、それに対応して難易度を上げて行くという図7に示すような歴史になっている。

図7 難易度の改定の歴史

そして、現在の難易度は27,428,630,902.262106となっている。つまり、おおよそ、10の19乗回Hashを計算すると平均的に1回見つかるという程度の頻度である。

Merkle Rootを変えてnonceの不足をカバーする

発掘には、nonceの値を変えながら、繰り返しハッシュを行ってターゲット値以下のHash値になるnonceを探す訳であるが、32ビットのnonce値を0から232-1まで変えて探しても、ターゲット値より小さいHash値が見つかるとは限らない。一般的にいうと、最上位の32ビットが0になるケースは見つかる可能性は半々であるが、現在の難易度が要求する最上位の67ビットがすべて0(16個とか17個のゼロという記述が良く見られるが、それは16進数で記述した場合である)になるターゲット値が見つかる可能性は、ほぼ、ゼロである。

追加するブロックの最初のトランザクションは、実はcoinbase transactionという特別トランザクションで、採掘報酬と2番目以降のトランザクションの取り扱い手数料の合計を採掘者に与えるトランザクションになっている。通常のトランザクションの場合は、原資となる受取トランザクションの情報が必要であるが、coinbase transactionの場合は天から(あるいは、ビットコインシステムのプログラムに組み込まれたロジックから)支払われるので、原資となるトランザクションの情報は不要である。そのため、この欄は発掘者が任意の情報を書くことができ、ここに書く値を変えることにより、coinbase transactionのHash値が変わり、結果としてMerkle RootのHash値が変わり、同じnonce値でもブロックヘッダのHash値が変わる。

すべてのnonce値を試してもターゲット値より小さいHash値が見つからない場合は、このようにしてMerkle RootのHash値を変えて、また、nonce値を0から232-1まで変えてHashがターゲット値を下回るケースを探す。現在の難易度では、平均的に言うと、1回の採掘に、このMerkle RootのHash値を変えるという操作を2の35乗回くらい繰り返す必要がある。

ブロックチェインの分岐の問題

ブロックチェインへの新しいブロックの追加は多くの採掘者が競っているので、2つの採掘者がほぼ同時に採掘に成功し、ブロックの追加を広報するということが起こり得る。こうなると、前の「Block-i」の後に「Block-i+1(0)」と「Block-i+1(1)」と2つ後続ブロックができてしまう。

この時は、採掘者は自分のところに届いた時刻が早い「Block-i+1(0 or 1)」を正当なものと考え、それに次のブロックを追加しようとする。Peer-to-Peerネットワークは、広報したノードと自分のノードの位置関係で到着時間が変わるので、ネットワークの一部のノードは「Block-i+1(0)」を正当な後続ブロックと考え、それ以外のノードは「Block-i+1(1)」を正当と考えて、後続のブロックを繋ごうと努力するということが起こる。しかし、両方のグループが、後続のブロックの採掘に、また、同時に成功することは稀なので、どちらか一方が「Block-i+2」の採掘の成功を先に広報することになる。

そうすると、全ノードが長いチェインの方が正当とみなすので、「Block-i+1(0)」、「Block-i+2」がつながった方のチェインにその次のブロックを繋いで行く。そして、「Block-i+1(1)」の方は孤児となって、ブロックの追加は取り消され、採掘報酬も取り消される。なお、採掘報酬を与えるcoinbase transactionは、それが与えられた時点から100ブロックが追加されるまで(約1000分)は使えないというスクリプトになっている。このため、孤児になることが判明した時点では、まだ、支払には使われていないので、そのcoinbase transactionを取り消すことができる。