マイニングプールの概要
Bitcoinでは、コンセンサスメカニズムに参加するためには暗号パズルを解くことが必要とされる。このパズルを解いたマイナーはリーダーになりブロックを生成することができる。
PoW難易度(Difficulty)は10分になるようにおよそ2週間ごとに変動するため、コストの影響を回避するために、ソロマイナーは供託してマイニングプールを形成し、貢献度に基づいて報酬を分配することが最適戦略とされている。つまりマイニングプールとは、Bitcoinブロック生成作業を複数のノードで分担する分散コンピューティングといえる。
現在、ソロマイナーに生成されたブロック割合はほぼ無視できるほどに減少した。一方、Bitcoinのマイニングプールでは、BTC.com, ViaBTC, AntPoolが過半数のハッシュレートを占めている。マイニングプール間による競争激化により、サービス妨害攻撃、Block withholding、スパイマイニングなどのいくつかの攻撃も考えられた。
マイニングプールにおける貢献度を可視化するために、まずマイニングプールオペレータがネクストブロックのためのテンプレートをマイナーに配布し、PoWソリューションを提出させる。その部分的ソリューションを「シェア」としてマイナーの貢献度の尺度に用いる。
コンピューティングタスクの分担
マイナーの貢献度を計測するために、プール管理者は簡単なパズルを解かせる。このパズルの解をpartial solutionという。マイナーがpartial solutionを提出すると、自分のシェアを入手できる。
計算タスク分配は以下のステップで行われる。
- プール管理者はブロックヘッダを作成する。
- プール管理者は、マイナーごとに特定範囲のnonceを割り当てたハッシュ生成タスクを作成する。
- マイナーがnonceを発見した場合、その結果をpartial solutionとしてプールに送信する。プールサーバーは提出されたsolutionが有効かチェックする。
- solutionがブロックヘッダのチェックもパスした場合、full solutionとしてブロックを提案する。
基本的に、一度partial solutionを提出したら終わりでなく、別範囲のnonceに設定された計算が新たに依頼され、同様に計算を繰り返す。
報酬分配メカニズム
マイナーのシェアに基づいて報酬を分配するが、シェアの計算アルゴリズムにはいくつかの種類が挙げられる。このアルゴリズムの調整により、ゲーム理論的にマイナーがpartial solutionを早期かつ継続的に提出する傾向にあるか決まる。
- Geometric Method
partial solutionの提出順序に基づいて等比級数を使用してラウンドごとのシェアの比率を決定する。ラウンドサイズによってfeeは変動する。 - IC Method
ラウンドの長さに応じて報酬を比例的に分配する。ラウンドが短い場合は全員が均等にシェアを受け取り、長い場合はfull solutionを提出したマイナーが多く受け取る。つまり、固定報酬とfull solution提出のインセンティブを満たす。 - Slush’s Method
full solutionが提出される直前に提出されるほどシェア比率が高くなる。そのため、マイナーは継続してpartial solutionを提出するインセンティブが生まれる。
報酬分配パターン
マイニングプールは自分のアドレスでブロック生成報酬を受け取り、それをプール参加者のアドレスへ分配する。その分配パターンにはいくつかの傾向がある。実際には目的が不透明なアドレスもある。
- BTC.com
常に同じリワードアドレスA1でブロック生成報酬を受け取り、一つのコレクターアドレスからマイナーに報酬分配を行う。コレクターアドレスはチェンジアドレスとしても使用される。 - AntPool
ほとんど単一のリワードアドレスA1でブロック生成報酬を受け取り、一つのコレクターアドレスからマイナーに報酬分配を行う。コレクターアドレスは分配のみを行い、チェンジアドレスは別のアドレスが担う。 - ViaBTC
数十あるコレクターアドレスに10BTCずつ報酬を分配し、そこからマイナーに報酬を分配する。
プールごとのマイニング報酬分配パターン。A1がコインベースアドレスでA2が報酬分配アドレス。 https://arxiv.org/abs/1905.05999
マイニングプールの集中化問題
下の図ではマイニングプールごとのハッシュレート占有率を示している。図を見る通り、ほぼ4つのサービスでハッシュレートの50%に到達していることが分かる。つまり、この4つのサービスが結託すると51%攻撃をされるリスクが高い。
マイニングシェアの推移。黒線がジニ係数を示し、高いほど不平等性が強い。 https://arxiv.org/abs/1905.05999
次に下の図では各マイニングプールにおけるクラスターが占めるハッシュレートの累積分布を示している。
ViaBTCは7クラスター、AntPoolは14クラスター、BTC.comは18クラスターでシェアの50%に到達していることから、マイニングプール内においても一部のクラスターにハッシュレートが集中していることが分かる。
AntPool, BTC.com, ViaBTCにおけるプール内のマイニングシェアの累積分布 https://arxiv.org/abs/1905.05999
上記より、マイナーの集中化は課題の一つとして挙げられる。
プラクティス
ウチでも実際に研究室にあるGPUを用いてMoneroなどのいくつかのチェーンのマイニングプールを走らせています。
マイニングプールへの参加は非常に簡単で、参加したいマイニングプールを選んだらホームページからビルドファイルをダウンロードし、そのファイルを手元でビルドするだけです。
おかげで毎日GPUがブオオオと音を立てています。
収益は一日100円くらいです。これが継続的にあるため、たしかにソロマイニングよりいい戦略と言えます。
考察・議論
マイニングプールあたりのクラスタは数百程度もあり、こんなにタスク分散して本当に計算が速くなるのか?通信オーバーヘッドはどれくらいに登るんだろう?という疑問はあります。マイニングプールとデータセンタのどっちが収益効率が高いのか比較があると面白いと思います。
また、タスクアルゴリズムにも個人差があります。どの範囲にDifficultyを設定してマイナーに計算を依頼するのか、そのあたりの比較もあると面白いです。
上記の課題の通り、マイニングプールの集中化は問題になっているので、誰でも任意のマイニングプールを立てられるP2Pマイニングプールのようなものがあっても面白いです。
まとめ
まず私はBitcoinという非常に身近な例に分散コンピューティングが使われていることに驚きました。さらにそれがある程度実用的なレベルで普及していることに衝撃を受けました。
タスクの割り振りも非常に簡潔で、そこにもBitcoinの設計の美しさを感じました。