ビットコイン相場で話題の「マイニング(採掘)」って何?
3――「マイニング」とは何か
さて、ここまでビットコインのデータイメージについて大まかに説明してきた。ここからは、いよいよ「マイニング」について説明したい。
By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block. This adds an incentive for nodes to support the network, and provides a way to initially distribute coins into circulation, since there is no central authority to issue them. The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation. In our case, it is CPU time and electricity that is expended.
上記は、ビットコインを考案したとされるサトシ・ナカモトの論文からの引用である7(太字・下線は筆者)。
-----
7 Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System
下線部分を意訳すれば、
「ブロック」を作成した人が「新しいコイン」を得る事ができ、この「新しいコイン」を安定して獲得し続けることは、採掘者が金を掘って金を流通させていくことに似ている。我々の(コインの)採掘ではCPUの時間と電力が使われる
となる。このサトシ・ナカモトの論文の比喩表現を用いて今日でも「ブロック」を作成する試みのことを「マイニング」と呼んでいると見られる。したがって、マイニングを理解するには、「ブロック」の作成について理解できれば良いことなる。そして、「ブロックが作成される」ことは、そこに含まれている「取引」の「承認」であるため、重要な仕組みである。
つまり、この「ブロック」作成の仕組みを理解することが、「AからBへの送金(移転)取引はどのように承認されているのだろうか、不正取引をどのように防いでいるのだろうか」の手がかりになる。
図表1に書いた「ブロック」では、「ブロック」を構成するものは数本の取引だけであったが、実際の「ブロック」にはより多くの情報が記載されている。図表5のように、「ブロックヘッダ」と呼ばれる部分を持ち、この部分がとりわけ重要で、いくつかの情報が付加されている。この情報は、具体的には「親ブロック(図表5の場合はブロック#1)ヘッダのハッシュ値」「マークルルート(Merkle Root)」「タイムスタンプ(Timestamp)」「採掘難易度(Difficulty Target)」「ナンス(Nonce)」である8。
-----
8 これらの先頭にソフトウェアのバージョン情報も付加される。
一気に専門用語だらけになってしまったが、順に解説していきたい。
まず、「タイムスタンプ」は現在の時刻のことでイメージは湧きやすいと思われる。「マークルルート」は専門用語で聞きなれない言葉だと思われる。これも重要なデータだが、長くなるため、詳しい説明は割愛したい。簡潔に言えば「マークルルート」は「ブロック」に含まれる取引の束(図表5のブロック#2の場合は「取引3」~「取引5」)から得られる、これらの取引を要約した数値と言える。「採掘難易度」はブロック生成の難しさを表した数値である。そして「ナンス」については後述したい。
そして、先頭にあるハッシュ値は「データから算出した小さな値。各データを区別・表現する目的に用いる」(Wikipedia)などと解説されているが、ブロックチェーンを理解する上では重要な概念と思われるので、例(イメージだが)を挙げて説明してみたい。
そこで、ここでは次のような関数を考えてみる(なお、これはあくまでもハッシュ値のイメージのために筆者が勝手に作成したアルゴリズムで、ビットコインに使われているハッシュ値とは全く関係ない)。
例えば、「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の数値を選んだが、もちろん本物のビットコインのブロックヘッダに格納されている数値はもっと複雑である。ただし、いずれにしても数字の羅列である。