プールマイニングの仕組みと、ソロマイニングとの違い
今回は、プールマイニングとソロマイニングの違いについて解説します。プールマイニングとソロマイニングについては、すでにお話しました。しかし、今回はもう少し深く掘り下げていきます。
![]()
Proof of Workは、以前こちらの記事で解説した通り、マイナーが正しい答えが見つかるまでnonceを使って計算をし続けるという手法です。これは、プールマイニングが登場する以前の、マイナーがソロマイニングを行っている場合にのみ (部分的に) 適切だと言えます。
プールマイニングでは事情がもう少し複雑になります。ソロマイニングの際にマイナーが行ったジョブは他のマイナーに分配されるため、2つ以上のマイナーが同じnonceを使って計算を行わないようにしなければなりません。
プールからマイナーにworkが分配される仕組みを理解すれば、マイニングとは何かについて理解しやすくなります。
ソロマイニングでのnonceの推定方法
最初に、ソロマイニングについて知識を整理しましょう。
このノード (実はブロックチェーン上のマイナーでもあります) は、処理待ちのトランザクションをすべて収集し、トランザクションブロックに含めます。これがいわゆるブロックです。ビットコインのブロックには、含めることができるトランザクションの数に制限があるため、ブロックには一定量のトランザクションしか含まれません。
その後、マイナーはトランザクションとnonceのハッシュ出力がある桁数のゼロが続く数字 (ネットワーク難易度) になるまでnonceの推測を行います。。
正しいハッシュ値が見つかると、マイナーはその答えをネットワークに送信し、すべて問題なければ、ブロック報酬を得ます。
以下のフォームを使って、正しいハッシュ値が得られるまでnonce推測を行うことができます。DATA欄にランダムな値を入力して、フォームが緑色になるまでnonceを探してみて下さい。また、MINEボタンを押すと、自動的にnonceを探すことができます。
プールマイニングでのnonceの推定方法
さて、これでマイナーが正しいハッシュ値を得るためにnonceを推測しなければならないことがわかりました。しかし、必要な難易度 (上記のフォームのゼロの数) が大きくなりすぎるとどうなるでしょうか?ソロマイニングをしていたマイナーが、正しいnonceを見つける確率が下がり、その結果、ブロックをヒットさせる頻度も下がってしまいます。
ここに至って、ソロマイナーは、友人とマイナーのグループを組んでマイニングを始めるよう相談するという解決策を思いつきます。マイナーのグループはプールと呼ばれます。プールはブロックチェーン上でより強い存在感を発揮し、正しいnonceを見つけてブロック報酬を獲得する確率が高くなります。
ところで、プール運営者はマイナーが同じnonceを利用していない状態を実現する必要があります。もし2つ以上のマイナーが同じ範囲のnonceを利用していたり、同じ開始位置 (例えば、全員が0からnonceを推測し始めて、1ずつ増やしていく場合) であれば、マイナーは同じnonceを利用してしまうことになります。すべてのマイナーが同じハッシュレートを持っていたとしたら、全員がほぼ同じ時間で答えを見つけるので、全員がソロマイニングを行うことと違いがありません。
このようなことを防ぐために、プール運営者はnonceの「開始位置」を各ワーカーに分散させることでnonceを分割し、すべてのワーカーにジョブを分散させます。これにより、プールはnonceの範囲の一部を最初のマイナーに送り、もう他の部分を次のマイナーに送ることができます。このようにして、より多くの範囲をより速くカバーすることができる体制がプールマイニングです。

解説
上のフォームにあるように、nonceは推測値です。ここでは話を簡単にするために、トランザクションブロックを解くnonceを0〜100,000の範囲にあるものとします。
マイナーが1つしかない場合、つまりソロマイニングの場合は、マイナーは0からnonceを推測し始め、100,000まで試していきます。0から100,000までの数字のうち1つが、目標とする難易度 (ハッシュ値の上位の桁のゼロの数) に一致するハッシュ値を生成します。正しいnonceを見つけるたマイナーは報酬を得ることができます。
プールが複数のマイナーにジョブを分散させる場合、プールはnonceを2つの部分に分割します。メッセージの最初の部分は、マイナーが受け取る固定値で、例えば20 000 (万の位、千の位) です。メッセージの第二の部分 (可変値) はマイナーが操作する部分で、20 000 (百の位以下) です。マイナーは第二の部分の推測のみを担当します。
このケースでマイナーが推測するnonceは、20+001、20+002、20+003・・・20+999となります。2つ目のマイナーも同様に30000の範囲を、30+001、30+002・・・30+999を担当します。ここで検討している例では、プールに接続された99のマイナーが01000〜99000を分担すると考えられます。
nonceをどの様に分割するか
Nonceは、extranonce1と呼ばれる部分とextranonce2と呼ばれる部分に分割されます。
extranonce1は、プールに接続したマイナーごとに割り振られる固定値です。
extranonce2は、ブロック生成のためにマイナーが計算に使用する値です。
ソロマイニングとプールマイニングの違いは、ソロマイニングの場合は、マイナーはnonceの全範囲を推測しているのに対し、プールマイニングではマイナーはnonceの範囲の一部しか推測していない点です。
プールマイニングでもう1つ考慮すべき点は難易度です。ソロマイニングの場合、ソロマイナーは目標とするネットワークの難易度のみに関心を持ちます。一方、プールマイニングでは、ネットワークではなく、プールが提供する目標難易度を使用します。プールの目標難易度は、常にネットワークの目標難易度より低くなります。
例えば、ネットワーク難易度がハッシュ値の最初に10個のゼロを必要としていて、プールの目標難易度はハッシュ値の最初にゼロが2個あれば受け付けるように設定したとします。この場合、ハッシュ値は2つのゼロで始まる必要がありますが、3つ以上のゼロで始まる場合も含まれます。場合によっては、プール難易度にマッチしたnonceが、ネットワーク難易度にもマッチする可能性があります。この場合、ブロックをヒットした運営者は、貢献したジョブに基づいてすべてのマイナーに報酬を分配します。
答えを見つける前に、プールから割り当てられたnonceの全範囲をマイナーが使い果たした場合、プールの目標難易度はマイナーにとって高すぎます (または反対に、マイナーのハッシュレートが非常に高いです)。
このフォームでは、マイナーがどのようにプールに貢献しているかを確認することができます。まず、DATA欄にランダムなデータを入力し、ネットワーク難易度を選択して、「MINE」をクリックします。
マイナーは、答えが見つかるまで利用可能なすべてのextranonce2の推測を繰り返します。答えが見つからない場合は、extranonce1を増加させます。
なお、この解説では説明を簡易化するためにプール難易度の説明を省いています。プール難易度は答えの発見を早める役割の他に、この難易度を達成したシェアをアクセプトシェアとして受け取ることで、ブロック発見後の報酬分配時にマイナーの貢献度を図るために利用されます。プール難易度をクリアしたからと言って必ずしもネットワーク難易度をクリアするわけではありませんが、クリアする可能性はあります。アクセプトシェアにより、プールは各マイナーの貢献度を知ることができ、公正な報酬の分配ができるのです。
上記の例は非常に簡略化されており、簡易的な説明であることにご留意下さい
私たちのDiscordサーバーやsubredditへお気軽にご参加下さい!