This article has been translated from English to Japanese.

ビットコインのマイニングはどのように機能するのか?

前回のレッスンではビットコインマイナーとは何か、新しい取引をメモリプールに保存し、候補ブロックを作成することで「採掘」プロセスを開始する方法を学んだ。

もし今私が書いたことが外国語のように聞こえるのであれば、私の「ビットコインマイニング入門」の最初のレッスンから始めることを強くお勧めする。

まだついてきてくれているなら、候補ブロックについて詳しく見てみよう。

ブロックは頭部と胴体の2つの基本部分に分けることができるように、候補ブロックも2つの部分に分けることができる。

  1. ブロックヘッダー(黄色の部分)
  2. ブロック本体(灰色のエリア)
    Block Header and Body

候補ブロックを詳しく見てみると、実際にはトランザクションだけを含んでいるわけではない。

Candidate Block Anatomy

マイナーが候補ブロックを作成する際には、「ブロックヘッダー」(黄色のエリア)が含まれる。

ブロックの「本体」(灰色のエリア)には取引が格納される

候補ブロックには多数のトランザクションが含まれるが、ブロックの「要約」を提供するいくつかのメタデータも含まれている。

メタデータとは、他のデータに関する情報を提供するデータのことである。この場合、メタデータはブロック自体に関する情報を提供する。この情報は「ブロックヘッダー」として知られている。

ブロックヘッダーの中には、いくつかのデータがある。

このレッスンでは、ブロックヘッダーの内容を単純化して説明する。

タイムスタンプ

ブロックヘッダー内の最初のデータは「タイムスタンプ」である。

タイムスタンプはブロックが作成された日時を示す。

Timestamp

前のブロックハッシュ

次のデータは「Previous Block」またはより具体的には「Previous Block Hash」と呼ばれる。

Previous Block Hashは、ブロックチェーンにおける直前のブロックのブロックハッシュである

Previous Block Hash

この意味を理解するには、ファイルを詳しく見てみる必要がある。

Look inside blockchain

ファイルの中身を見てみると、データが特定の方法で構造化されていることがわかる。

Look inside the file and see blockchainstructure

これをブロックチェーンとして視覚化してみよう

マイナーが作成したブロック候補は、最新のブロックの一番上に追加されなければならない。

Block must bee added on top of the most recent block

最新のブロックが青で塗られたブロックだとしよう。

Most recent block in blockchain

青く塗られた ブロックのブロックハッシュは、ファイル(「ブロックチェーン」)内の最新ブロックであるため 、マイナーがその上に構築したいブロックとなる。

ブロックハッシュは、ブロックに カスタム生成されたID番号のようなものだと考えてほしい。

マイナーがすることは、これを自身の候補ブロックのブロックヘッダーの「前ブロックハッシュ」として追加することである。

Block hash added as Previous Block Hash of Candidate Block

「トランザクションサマリー」ハッシュ

次に紹介するデータは、私が「トランザクションサマリー」ハッシュと呼んでいるものである

その名の通り、ブロック内のすべてのトランザクションの「要約」を文字列で表したものである。

詳細は省くが、ブロック内のすべてのトランザクション(赤でハイライトされている)がハッシュ関数に入れられ、特定の順序でハッシュ化され、最終的に1つのハッシュが生成される。

Merkle Root

このハッシュが「取引サマリー」ハッシュとして使用される。Merkle Root Example

このハッシュが提供するのは、ブロックに含まれるすべてのトランザクションに基づく固有の「指紋」である。

これにより、トランザクションが改ざんされていないことを確認できる。

この「Transaction Summary」ハッシュは、実際には「Merkle Root」として知られている。

データにほんの少し変更を加えるだけでハッシュは完全に変わってしまうことを覚えておいてほしい。つまり、もし誰かが将来ブロック内のトランザクションを変更しようとした場合、「トランザクションサマリー」ハッシュは変更され、ブロックヘッダー内の元の値とはまったく異なるものになってしまうということだ。Merkle Root as Fingerprint

基本的に、取引を変更すると、まったく異なる「フィンガープリント」が作成され、元の「フィンガープリント」と一致しなくなる。

この変更により、誰でも即座にそのトランザクションが改ざんされたことが分かる。

ブロックハッシュ

これまでのところ、ブロックヘッダーには3つのデータが含まれている。

  1. タイムスタンプ
  2. 前のブロックのハッシュ
  3. 「トランザクションサマリー」ハッシュ

次のステップでは、このブロックヘッダーのデータをハッシュ関数に入力する。

これにより、「ブロックハッシュ」と呼ばれるランダムな数値が生成される。

(ただし、ブロック全体ではなくブロックヘッダーのみのハッシュであるため、より正確な名称は「ブロックヘッダーハッシュ」である。)

前述の「Previous Block Hash」と同様に、「Block Hash」は候補ブロックに割り当てられるカスタム生成のID番号だと考えてほしい。

Run block header through hash function
マイナーはなぜこのようなことをするのか?

マイナーがブロックをブロックチェーンに追加するには、 特定の要件を満たすブロックハッシュを見つけなければならない

この要件を満たさない場合、ブロックは有効とは見なされず、マイナーはそのブロックをブロックチェーンに追加することはできない。

より具体的には、ブロックハッシュは特定の数のゼロで始まる数字でなければならない。

正確に何個のゼロなのか?

さまざまです。ビットコインシステムのソフトウェアが、ブロックハッシュが何個のゼロから始まるべきかという最小値を決定します。

当初は、ゼロの数はわずか数個でよかったが、マイナーが次々と参加するにつれ、ビットコインのソフトウェアはより多くのゼロを必要とするようになった。

Bitcoin mining process without nonce

採掘者は、ビットコインソフトウェアによって設定された出力閾値を満たす出力(「ブロックハッシュ」)を生成しなければならない。

この「しきい値」は、ブロックハッシュが何個のゼロで始まらなければならないかを指定するだけである。

それは「リンボー」ダンスのようなものだ。

Bitcoin mining is like a limbo dance

しきい値が低いほど、より多くのゼロが必要となる。

必要なゼロの数が増えるほど、「正しい」ブロックハッシュを見つけるのが難しくなる

これは、先頭のゼロが多いほど、可能な解の数が少なくなるため、正しいブロックハッシュを「見つける」のに多くの時間が必要になることを意味する。

「000123…」のように3つのゼロで始まる値を見つけるのは、「000000123…」のように6つのゼロで始まる値を見つけるよりもはるかに難しい。

以下は、最近の有効なブロックハッシュの例である

0000000000000000000586b367c292dfd274bf2e67575cf8b4d00735fc1df6ff

ゼロがいくつ並んでいるかに注目してほしい。

「特定のゼロの数」は、いわゆる「採掘の難易度」から生じる。これは、ビットコインネットワークを稼働するソフトウェアによって自動的に上下に調整される。難易度は採掘者の数に基づいて変化する。採掘するコンピュータの数が増えれば増えるほど、難易度は高くなり、先頭にゼロを多く必要とするため、勝利するノンスを見つけるのが難しくなる。

ブロックハッシュは非常に大きな数として解釈され、ある閾値以下でなければならない。これが、ブロックハッシュがゼロの連続に続いて英数字の文字列で始まる理由である。ブロックによっては先頭に20個ものゼロが並ぶものもあるが、初期のブロックでは8個のゼロで済む。ゼロの数は、そのブロックが公開された時点での採掘の難易度を大まかに示す。

ブロックハッシュが要求される数のゼロで始まらない場合はどうなるのか?

そのブロックはファイル(「ブロックチェーン」)に追加できない。

幸いにも、マイナーは複数回試行することができる

しかし、マイナーがタイムスタンプ、前ブロックのハッシュ、および「取引サマリー」のハッシュのみを含むブロックヘッダーをハッシュ関数に再度通した場合、常に同じ結果が得られる

マイナーはブロックヘッダーを再度ハッシュ化する前に、何らかの方法でデータを変更する必要がある。

ビットコインは、その方法を提供している!

ノンス

ブロックヘッダーには、「ノンス」と呼ばれる追加のフィールドがある(水色のボックス)。

Block header contains a nonce

ブロックヘッダーには、マイナーが任意の数値を入力できる特別な部分がある。

マイナーは自由に任意の数値を入力できる。

ノンスはブロック内のトランザクションとは完全に独立している。その唯一の目的は、マイナーが任意の数値を入力できるようにすることであり、ブロックハッシュが特定のゼロ数で始まるという要件を満たさない場合は、その数値を変更することである

ノンスを使用することで、マイナーはハッシュ関数の出力を操作して、望ましい出力を「推測」することができる。

ブロックヘッダー内の他のデータは変更できないため、変更可能なデータはノンスだけである。

したがって、ブロックヘッダーの最初のハッシュ化が失敗した場合、マイナーはノンスの値を変更する。

このプロセスは、ダイヤル式の南京錠の組み合わせを見つけようとするようなものだと考えてよい

Combination Lock

ロックを解除する数字の組み合わせを見つけようとする場合、近道は存在しない。あらゆる組み合わせを試して、ある時点で偶然に正しい組み合わせを見つけるしかない。

何度も何度も試して、運よく当たるまで続けるしかないのだ。

そして、ロックの組み合わせが正しいものであるかどうか(ロックが解除されるか、されないか)を調べるのは非常に簡単かつ迅速であるように、マイナーやその後の他のノードにとって、ノンスが確かに正しいものであるかどうかを調べるのは非常に簡単かつ迅速である。

マイナーは他のマイナーとも競合している。有効なブロックハッシュを生成するノンスを最初に発見したマイナーには、そのブロックをブロックチェーンに追加する権利が与えられ、その報酬が支払われる。

例えば、ブロックハッシュが少なくとも4つのゼロで始まる必要があると仮定しよう。

必要な数のゼロで始まるブロックハッシュを見つける唯一の方法は、ランダムにノンス値を選択し、ブロックヘッダーをハッシュ関数に通すことである。

このシナリオでは、マイナーはノンス値として「0」から開始する(水色のボックス)。

Nonce is 0

期待通りの結果が得られなかった場合、マイナーができることは、 異なるノンスで再度試してみることだけである。

マイナーはノンスを変更し、ゼロが少なくとも必要最低限の数含まれるブロックハッシュを見つけられるまで、最初からやり直す。この場合、ゼロが4つ必要だ

ハッシュ関数では、ほんのわずかな調整でも、まったく異なる結果が得られることを忘れないでほしい。

そのため、マイナーはまず、ノンスに「0」という数字を使用してみた。次に、ブロックヘッダーをハッシュ関数に通し、ブロックハッシュが4つのゼロで始まっているかどうかを確認する。

ご覧の通り、ブロックハッシュは ゼロが2つしか始まっていないため、ブロックチェーンにブロックを追加するための基準を満たしていない。

出力が有効でない場合、マイナーは異なるノンス値で試行を続ける。

「0」がうまくいかなかったため、マイナーはノンスの値を「1」(水色のボックス)に変更し、ブロックヘッダーをハッシュ関数に再度通すことができる。

Nonce changed to 1

ご覧の通り、ブロックハッシュはゼロでまっていないので、これも機能しない。

「1」の値がうまくいかなかったため、マイナーはNonceの値を「2」に変更し(水色のボックス)、ブロックヘッダーをハッシュ関数に再度通すことができる。

Nonce changed to 2

この場合、ブロックハッシュ は最終的に4つのゼロで始まり、基準を満たす。

ブロックハッシュの結果は成功だ!🎉

ご覧の通り、どのノンスが正しいゼロの数を持つブロックハッシュを生成するかは予測できないため、マイナーは正しい値を見つけるために異なるノンスを試行し続けなければならない。

マイナーは、正しいノンスを見つけられる保証がないまま、長期間採掘を続けることになる。ほとんどの場合、正しいノンスを見つけることはできないのだ!

ノンスはカウンターとして使用され、正しいブロックハッシュが見つかるか、他のマイナーが見つけるまで、その値は常にインクリメントされる。

数字当てゲームのようなものだ!

ノンスの値を変更しながら、特定のゼロ数で始まるハッシュを見つけようとしているだけだ。

マイナーはこれを繰り返し行う。そして、その結果が条件を満たすブロックハッシュを生成することを期待する。

コンピュータの性能が高いほど、より多くの「推測」を行うことができる。

この「推測」プロセスはマイニングと呼ばれている。

「勝利」したマイナーには、「ブロック報酬」と呼ばれる一定数のビットコイン(および取引手数料)が与えられる。

およそ10分ごとに、ひとりのマイナーがブロック報酬を獲得する。

ブロック報酬

マイナーは、ビットコインのブロックチェーン上で正しいノンスを「推測」し、取引を承認するために膨大な時間と労力を費やすため、ビットコインのソフトウェアは彼らの努力に報いるために、以下を報酬として与える。

  1. 新たに発行されたビットコインマイナーが取引を承認すると、取引はブロックにまとめられ、ビットコインブロックチェーンに追加される。ブロックチェーンに追加される新しいブロックごとに、マイナーには新しいビットコインが支払われる。これはブロック補助金として知られている。ビットコインの具体的な金額は、ブロック作成時のプロトコルによって決定される発行スケジュールに基づいている。2024年4月20日現在、直近の半減期イベントに続いて新しい発行は1ブロックあたり3.125BTCである。次の半減期は2028年4月2日頃に予定されており、ブロック報酬は1ブロックあたり1.5625BTCに減少する。
  2. 取引手数料。ビットコインで取引を行う場合、マイナーに手数料を支払うことで、取引の確認を促すことができる。マイナーが取引の束を確認すると、個々の取引から徴収した手数料もすべて受け取ることができる。

採掘は単調で繰り返し行われるプロセスである。

Bitcoin Mining Process

ブロックヘッダーにノンスを挿入し、ハッシュ化し、ハッシュが特定のゼロの数で始まるかどうかを確認し、始まらない場合は異なるノンスでプロセスを繰り返す。

考えただけで眠くなってくる。

マイニングが「複雑な数学的問題の解決」を伴うという話を読んだり聞いたりした場合は、それが正確な表現ではないことを今なら知っている。

マイニングに複雑な要素などない!プロセス自体は 極めてシンプルだ。 正しい数値をできるだけ早く、あるいはブロックチェーンに追加される候補ブロックを最初に正しく推測するマイナーになるために十分な速さで推測するだけだ。それだけだ!

「ハッシュレート」はマイニングコンピューターの「推測能力」を示す。1秒間に推測できるハッシュの数が多いほど、ハッシュレートは高くなる。例えば、1秒間に1兆(1,000,000,000)回の推測は、ハッシュレート1テラハッシュ(TH/s)に相当する。

プロセスが単純だからといって、簡単だということにはならない。それが「マイニング」と呼ばれる理由である。正しい数値を「掘り当てる」ためには多大な労力が必要であり、それは現実世界での実際の採掘と似ている。

マイナーが、要件を満たすブロックハッシュを生成できるノンス(nonce)を見つけた(少なくとも4つのゼロで始まる)場合、ブロックはマイナーのファイル(「ブロックチェーン」)に追加される。

青いブロックがマイナーのブロックチェーンで最も新しいブロックであったことを覚えているだろうか? もうそうではない。

マイナーが正しいノンスを推測できたため、ブロックチェーンにブロックを追加することができた(緑色で表示)。

Block added to blockchain

したがって、全体像としては、マイナーのコンピュータ上のファイルが更新された(緑色で表示)。

Miner's blockchain updated

そして、ノードは、直接接続されている近くのノードにこのブロックを送信する。

ノードはそれを確認し、検証し、ブロックヘッダーが基準を満たすブロックハッシュを生成していることを確認する。この場合、ブロックハッシュは4つのゼロで始まる必要がある。Bitcoin miner propogates new block

これらのノードは、ブロックをファイルに追加することで、ファイル(「ブロックチェーン」)を更新する。

彼らのファイルは更新され、勝者となったマイナーのファイル(緑色のファイル)と同じバージョンになる。

この当選ブロックの一部である彼らのメモリプール内のすべての取引は、「fresh」(または「unconfirmed」)から「confirmed」ステータスに移動し、ファイルに恒久的に追加される。

矛盾する取引はすべて除外される

マイニングプロセスのおかげで、紫色のトランザクションのみがブロックチェーンに組み込まれる。Blockchain synced across network

その後、これらのノードはブロックを他のノードに渡す。Nodes will pass on the block to other nodes.

新しいブロックが採掘者の過半数に承認されると、すべての採掘者が最初からやり直し、まったく新しい候補ブロックを作成し、採掘プロセスが繰り返される。

マイニングは、コンピュータネットワーク上のトランザクションを分類する仕組みとして機能し、「マイニングされた」ブロックがブロックチェーンに追加するトランザクションを最終的に決定する。

この新たに作成されたブロックのブロックハッシュは、マイナーが候補ブロックの「前ブロックハッシュ」として使用する。

Newly created block will now be used by miners

ブロックハッシュは「チェーン」の役割を果たす。

マイナーは、作成中の新しいブロックに、前ブロックのブロックハッシュを含める必要がある。

Miner include new block hash in new block

例えば、ブロック101を採掘するには、マイナーはブロック100のハッシュを知っておく必要がある。

ブロック101が採掘されるまでは、 ブロック102は採掘できない。

これにより、マイナーはブロック101に集中せざるを得なくなり、ブロック100のハッシュが含まれることになる。マイナーは先を飛ばすことができないのだ。

しかし、各ブロックに「ブロック番号」を付ける代わりに、各ブロックはブロックハッシュによって前のブロックを参照する。

これは、すべてのブロックが互いにリンクされていることを意味し、これがブロックチェーンとして知られる「ブロックの連鎖」を作り出す。

この「ブロックの連鎖」は、ブロック番号ではなくブロックハッシュによって結び付けられている。

ビットコインを不正に操作できない理由

例えば、全員がブロック101に取り組んでいるとしよう。

しかし、あるマイナーがブロック80の取引を変更したいと考えている。

変更を加え、ブロック80から100までのすべての計算をやり直す必要がある。さらに、ブロック101も処理しなければならない

21ブロック分の高価な計算が必要になる!

それだけでなく、マイナーは、ビットコインネットワーク上の他のマイナーが現在作業中のブロック(ブロック101)を終える前に、それらすべてを完了させなければならない。これは基本的に不可能である。

ブロックチェーンの一部となっている取引を改ざんしてやり過ごすのは非常に難しい。

これがブロックチェーンが不変であると表現される理由である。

プルーフ・オブ・ワーク(PoW)

マイニングのプロセスは、しばしば「Proof-of-Work」 またはPoWと呼ばれる。

PoWは、ビットコインがすべてのノードにビットコインのブロックチェーンの「公式」コピーに同意させるために使用する「合意メカニズム」として知られている。ビットコインが紛争解決や中央当局の介入を必要とせずに合意に達することができるのは、この仕組みによるものである。

「プルーフ・オブ・ワーク」という用語は、特定の閾値以下のブロックハッシュ を見つけるには「作業」が必要であるという事実を指している。そして、一度見つかれば、誰でもそれを検証することができ、これが「証明」となる。

「ノンスを推測」し、ブロックヘッダーをハッシュ関数に通すというプロセスは、ブロックに必要な量の「作業」を行ったことを証明する方法として用いられている。

最初に有効なハッシュを生成したマイナーは、ブロックチェーンに新しいブロックを追加することが許可され、ビットコインの報酬を受け取る。

マイナーがビットコインネットワークに殺到すると、PoWは調整され、有効なブロックハッシュを見つけることがより困難になる。この難易度上昇により、あまりにも多くのマイナーが落胆し、採掘を止めてしまうと、難易度は下がり、採掘が容易になる。

このプロセスは「難易度調整」と呼ばれ、およそ2週間ごとに発生し、マイナーのネットワークへの参加や離脱の数に関わらず、およそ10分ごとに新しいブロックがブロックチェーンに追加されることを保証する。

難易度調整は、マイナーが新しいブロックを作成する速度に基づいて行われる。

採掘の難易度を調整することで、ビットコインは、ネットワークに参加するコンピューティングパワーの量に関わらず、あらかじめ定められたレートで新しいビットコインが作成されることを保証できる。

難易度調整は、マイナーがビットコインの供給量を急速に過剰に採掘できないようにする上で重要である。

マイニングに必要な特殊なコンピュータハードウェアと電力は、ネットワークへの攻撃が法外なほど高額になることを意味する。これにより、ビットコインのブロックチェーンの安全性と完全性が確保される。

ネットワークを攻撃するのに十分なコンピューティング能力を持つ者は、正々堂々と採掘を行い、ブロック報酬(新しいビットコインと取引手数料)を得た方が得策である。

ビットコインの技術的な側面についてもっと詳しく知りたい方は、ビットコインの仕組みを理解するための素晴らしいガイドを掲載しているlearnmeabitoin.comをご覧ください。

まとめ

おめでとう!これでビットコインの「マイニング」の仕組みがわかったね!

  • マイナーは、ノンスを選択し、ハッシュ関数を実行し、出力を確認することで、「ブロックハッシュ」となる許容可能なハッシュを探索する。
  • ハッシュの先頭に適切な数のゼロがない場合、マイナーはノンスを変更し、ハッシュ関数を実行し、再度確認する。
  • 最終的にマイナーがうまくいくノンスを見つけ、「勝利」すると、ブロックはビットコインネットワーク内の他のノード(他のマイナーも含む)に送信され、各ノードは勝利したマイナーのノンスでハッシュ関数を実行し、それが機能することを確認できる。
  • もしその解がノードの過半数によって承認された場合、ブロックはブロックチェーンに追加され、そのブロックを獲得したマイナーはブロック報酬を受け取ることができる。
  • すべてのマイナーは「リセット」し、新たにブロック候補の作成に取り掛かり、最近採掘されたブロックのハッシュをブロックヘッダーの「前ブロックヘッダー」として参照する。
  • マイナーが正しいノンスを「推測」または発見しようとするこのプロセスは、「プルーフ・オブ・ワーク(PoW)」として知られている。

マイナーとマイニングについて学んだところで、ビットコインシステムの地図を更新しよう。

Bitcoin as a System (Mining Added)