概要
- 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 として機能