はじめに
マイニングについて学んでいく中で、こんな疑問や驚きを感じませんでしたか?
- 「え、ハッシュ値って一つじゃないの?」
- 「ターゲット値ってそもそも何?」
- 「ターゲット値ってそれ以下の値ってことなの!?」
- 「というか、ターゲット値とnBitsは違うの?」
- 「ブロックヘッダーって何?」
- 「ナンスとは?」
- 「最初にハッシュ値見つけるってそのままの意味じゃないの?」などなど
私自身が実際に感じたこれらの疑問や驚きを軸に、マイニングについて分かりやすく解説していきます。
まずは単語の簡単なイメージとマイニングの流れをざっくり説明した後に、疑問に沿って深掘りしていきましょう。
①単語の簡単な説明(テストの例え)
マイニングを「テスト」に例えると、以下のようになります:
- ハッシュ関数 = 採点マシン(答案用紙を入れると点数が出てくる)
- ハッシュ値 = あなたが出した点数(例:35点、12点、98点など)
- ターゲット値 = 合格ライン(例:60点以下で合格)
- ブロックハッシュ(唯一のハッシュ値) = 一番早く提出された”合格点”
- ブロックヘッダー = 答案用紙(6つの項目が書かれている)
- ナンス = 答案用紙の「試行回数」欄(何回目の挑戦かを示す数字)
- メルクルルート = 全てのトランザクション(取引)を1つにまとめたデジタル指紋
②マイニングのざっくりとした流れ
【ステップ1】 6つの情報を準備(ブロックヘッダーを作成)
【ステップ2】 ハッシュ関数を2回かける(SHA256を2回)
【ステップ3】 出た結果(ハッシュ値)がターゲット値以下かチェック
【ステップ4】 条件を満たさなければナンスを変更して再挑戦
【ステップ5】 条件を満たした最初の人がブロックをネットワークに伝播し、そのブロックが承認されればマイナーが報酬(ビットコイン)を獲得
【補足】どうやってビットコインをもらうの?
成功したマイナーは、そのブロックの中に「自分にビットコインを送るトランザクション(=コインベーストランザクション)」を含めておきます。
これによって、新たに発行されるビットコインと手数料の合計を報酬として受け取ることができます。
ただしこの報酬は、100ブロック分の承認が完了するまで使えません(約16時間半後)。
疑問1:「ブロックヘッダーって何?」
答え: ブロック全体の「要約情報」を80バイトにまとめたもの
ブロックヘッダーの6つの構成要素:
- バージョン(4バイト)
ブロックのルールバージョン - 前のブロックのハッシュ(32バイト)
一つ前のブロックのハッシュ値
これによりチェーン構造を形成 - メルクルルート(32バイト)
そのブロックに含まれる全トランザクションの「まとめ」 - タイムスタンプ(4バイト)
ブロック作成時刻 - nBits(4バイト)
難易度ターゲットの圧縮表現 - ナンス(4バイト)
マイナーが変更して試行錯誤する数値
なぜ80バイトなのか?
- ハッシュ関数への入力サイズを一定にするため
- 効率的な計算とネットワーク送信のため
疑問2:「ターゲット値ってそもそも何?」
答え: マイニングの「難易度」を決める基準値
ターゲット値とは:
- マイニングの合格ラインを決める数値
- この値以下のハッシュ値を見つけることが目標
- ビットコインネットワーク全体で共有される共通の基準
疑問3:「ターゲット値ってそれ以下の値ってことなの!?」
答え: そうなんです!ターゲット値以下(その値を含む)が条件
多くの人が「特定の値を当てる」と勘違いしがちですが、実際は:
✅ ハッシュ値 ≤ ターゲット値(以下)
❌ ハッシュ値 = ターゲット値(一致のみ)
これにより:
- 難易度調整が可能(ターゲット値を小さくする = より小さいハッシュ値を要求 = 難しくなる)
- 複数の正解が存在(ターゲット値以下の値は無数にある)
疑問4:「というか、ターゲット値とnBitsは違うの?」
答え: nBitsはターゲット値の「圧縮版」
nBits(4バイト)
- ターゲット値を圧縮して表現したもの
- ブロックヘッダーに含まれる(容量節約のため)
- 科学記号のような仕組み(例:1.23 × 10^8)
ターゲット値(32バイト)
- nBitsから復元された実際の比較用の値
- マイニングソフトウェアが実際に使用する値
変換例
nBits: 0x1b0404cb
↓(復元)
ターゲット値: 0x0404cb000000000000000000000000000000000000000000000000
疑問5:「え、ハッシュ値って一つじゃないの?」
答え: ハッシュ値自体は一つだけど、「正解となるハッシュ値」は複数あります
テストで例えると:
- 合格ラインが「60点以下」の場合
- 59点でも30点でも5点でも、全部合格
- つまり「正解(合格点)」は複数存在する
ビットコインでも同じで:
- ターゲット値が「1000以下」なら
- 999でも500でも100でも、全部正解
- でも、その中で最初にネットワークに認められた1つだけがブロックとして採用される
ハッシュ関数の特性
- 同じ入力(ブロックヘッダー)→必ず同じ出力(ハッシュ値)
- だから「そのブロックのハッシュ値」は確実に1つ
- でも「条件を満たすハッシュ値の候補」は無数にある
疑問6:「ナンスとは?」
答え: マイナーが自由に変更できる「試行回数カウンター」
ナンス(nonce)の特徴
- “Number used ONCE”(一度だけ使う数字)の略
- 通常0から始めて1ずつ増加
- 32ビット = 約43億通りの値が可能
マイニングでの役割
- ナンス = 0 → ハッシュ値計算 → 条件不合格
- ナンス = 1 → ハッシュ値計算 → 条件不合格
- ナンス = 2 → ハッシュ値計算 → 条件不合格
- …
- ナンス = 1,234,567 → ハッシュ値計算 → 条件合格!
ナンスだけでは足りない場合
現在の難易度では、43億回試しても正解が見つからないことがほとんど。
そのため
- タイムスタンプを更新(数秒ごと)
- コインベーストランザクションを微調整
- エクストラナンスという追加の変数を使用
疑問7:「最初にハッシュ値見つけるってそのままの意味じゃないの?」
答え: 「計算の速さ」と「ネットワーク伝達の速さ」の両方が重要
多くの人が思う「最初」:
❌ 単純に計算が一番早く終わった人
実際の「最初」:
✅ 最初にネットワークに伝播し、多数のノードに承認されたブロック
なぜこの違いが重要?
伝達時間の影響
- 計算完了から他のノードへの伝達に時間がかかる
- ネットワークの場所や接続状況で差が出る
分岐(オーファンブロック)の発生
- ほぼ同時に複数のマイナーが成功することがある
- 最終的に長いチェーンが採用される(最長チェーンルール)
マイニングプールの優位性
- 地理的に分散したサーバー
- 高速なネットワーク接続
- これらにより伝達速度で優位に
まとめ:マイニングの本質
ハッシュ値は一つでありながら、一つではない。
✅ 特定のブロックヘッダーから生成されるハッシュ値は確実に1つ
✅ でも「条件を満たすハッシュ値」は無数に存在
✅ その無数の可能性の中から、最初にネットワークに受け入れられた1つがブロックハッシュとなる
✅ このブロックハッシュが次のブロックの「前のブロックのハッシュ」として使われ、チェーンが続く
マイニングは、誰でも参加できる計算競争です。
世界中のマイナーが同時に挑戦し、最初に正解を見つけた人が報酬を得ます。
この競争があるからこそ、ビットコインは中央に頼らず、分散したまま安全に成り立っているのです。
私自身もまだ勉強中の初心者ですが、学びながら「なるほど」と思えたことを、できる限りわかりやすく共有していきたいと思っています。
もしこの記事の中に訂正すべき点や、わかりにくい表現があれば、随時見直して改善していきます。
また、ここで登場した用語についても、今後少しずつ深掘りした記事を追加していく予定です。
コメント