モネロのプルーフ・オブ・ワークの仕組み
概要
- MoneroのProof of Work(PoW)はRandomXという独自アルゴリズムを採用
- CPUに最適化され、ASICなどの専用ハードウェアによる中央集権化を防止
- 動的なプログラム実行と大容量メモリアクセスが特徴
- 検証と採掘で異なるモード(fast modeとlight mode)を用意
- ハードウェア経済性を重視した設計思想
MoneroのProof of Work「RandomX」概要
- RandomXは、Moneroが採用するCPUフレンドリーなProof of Workアルゴリズム
- ビットコインのSHA-256のような単純なハッシュ計算ではなく、仮想マシン上でランダムなプログラムを実行し、その結果をハッシュ化
- ASIC(専用チップ)による最適化を困難にし、一般的なCPUでの採掘を有利に設計
- メモリ負荷を高めることで、DRAMアクセスやキャッシュ活用などCPUの多様な機能をフル活用
RandomXの設計思想と背景
- 単純なハッシュ関数だと、ハードウェア設計者がそれ専用のASICを開発しやすく、中央集権化が進む
- MoneroはCryptoNightファミリーから進化し、2019年にRandomXへ移行
- **「CPU全体を使わせる」**という設計目標
- 複数キャッシュレベル、整数・浮動小数点演算、分岐、アウトオブオーダー実行など、現代CPUの特徴を積極的に活用
RandomXのワークフロー
- 2つの主要入力:キーK(過去ブロックのハッシュ)、ハッシュ入力H(候補ブロック+nonce)
- Kは約2.8日ごと(2048ブロックごと)に更新し、大規模メモリ構造を再構築
- Hは毎回nonceを変えて繰り返し試行
ステップ1:キャッシュ構築
- Kに対してArgon2d(パスワードハッシュ関数)を実行し、256MiBのキャッシュを生成
- メモリ負荷を高めるための設計
ステップ2:データセット展開
- キャッシュから約2080MiB(2GiB強)のデータセットを構築
- DRAMアクセスを強制し、ASICの最適化を困難に
ステップ3:スクラッチパッド初期化
- HをBlake2bでハッシュし、AESベースの生成器で2MiBのスクラッチパッドを埋める
- スクラッチパッドはCPUキャッシュに収まるサイズ
ステップ4:ランダムプログラム生成
- 独自命令セットの**VMプログラム(256命令)**をランダム生成
- 整数演算、64bit積算、浮動小数点演算、128bitベクトル演算、メモリアクセス、分岐を含む
- 分岐命令も適度に含め、ハードウェア最適化を難化
ステップ5:プログラムループ実行
- 256命令のプログラムを2048回ループ実行
- 各イテレーションでメモリアクセス、整数・浮動小数点演算、状態のミックス、低確率分岐などを実施
- 「実際のソフトウェアらしい」ワークロードを実現
ステップ6:8連鎖プログラム
- 8つのランダムプログラムを連鎖して実行
- チェーン途中でプログラム内容を知ることができず、「楽な仕事だけ選ぶ」戦略を排除
ステップ7:最終ハッシュ生成
- 最終状態をAESベースのハッシュとBlake2bベースの256bitハッシュでまとめ、出力
- 出力がネットワークのターゲット値未満ならブロック採用
Fast modeとLight mode
- Fast mode:2080MiBデータセットをフル活用、採掘用
- Light mode:256MiBキャッシュのみで逐次データセット計算、検証用
- 両モードとも同じ結果を返すが、検証は軽量・採掘は重い設計
- Light modeでの採掘は非効率となるよう調整
CPUフレンドリーな理由
- 大容量キャッシュ・DRAM帯域・AES・64bit演算・浮動小数点・アウトオブオーダー実行・JITコンパイラなど、現代CPUの強みを活用
- ASIC専用設計の利点を小さくし、「高性能なCPU+多メモリ」構成に近づける
RandomXの狙いと経済設計
- 一般ユーザーの採掘参加を維持
- ASICによる優位性・中央集権化を抑制
- 複数ハードウェアベンダー依存の回避
- 検証コストを抑制しつつ、採掘コストは十分に高く
RandomXの簡易モデル
-
ビットコイン:単一小型回路で単純作業を繰り返す
-
Monero:CPUらしい複雑ワークロード+大量メモリアクセスを連続生成し、耐性を確保
- Argon2dによるキャッシュ構築
- 2GiB超のデータセットでDRAM負荷
- キャッシュサイズのスクラッチパッド
- VMによるランダムプログラム実行
- 整数・浮動小数点・ベクトル・分岐命令
- 8連鎖プログラムで「楽な仕事」排除
- 採掘用fast modeと検証用light modeの分離
-
これらを組み合わせ、Moneroの分散的・耐ASICなProof of Workとして機能