世界を動かす技術を、日本語で。

モネロのプルーフ・オブ・ワークの仕組み

概要

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

Hackerたちの意見

RandomXには、Monero以外にも面白い使い道があるよ。RandomXを使ったJavascript(ウェブマイニング?)のプロジェクトがあるみたいだね。https://github.com/l1mey112/randomx.js/ あと、RandomXを使ったビットコイン(エージェンティックキャッシュ?)についても。https://scashnetwork.org/ https://miningpoolstats.stream/satoshicash

もし、古いMoneroのPoW機能(それが変更された理由も含めて)に興味がある人がいたら、昔に書いた記事があるよ。https://da-data.blogspot.com/2014/08/minting-money-with-mone... GPUやASICに抵抗するプルーフ・オブ・ワーク機能を設計しようとした歴史は長いけど、ほとんど成功してないんだ。RandomXについてはまだ調べてないけど、もしかしたら成功してるかもしれないし、あるいはEthereumがプルーフ・オブ・ステークに移行した後、アルトコイン市場のマイニングの利益が下がって、あまり意味がなかったのかも。

これはすごく面白い読み物だったし、暗号通貨の強みをまさに強調してるね。ゲーム理論を自分たちに有利に働かせることで、自己中心的なプレイヤー(攻撃的な意味ではないよ)が、他の人たちにとってより強くて安全なものを作るのに貢献してるんだ。シェアしてくれてありがとう!

イーサリアムで成功しなかった提案(progpow)があったけど、すでにPoSへの移行の後半に入ってたからね。イーサリアムはASICの優位性をうまく抑えてた(最大で100%のスピードアップだったし、桁違いではなかった)。RandomXは基本的に成功したprogpowだよ。ChiaのProof of Space and Timeにも興味があるかもしれない…そしてその崩壊についてもね!

RandomXは、RandomX ASICを設計するとCPUを設計したことになるように作られてるんだ。ランダムなプログラムを書いて実行する。命令セットアーキテクチャに合わせた効率の向上を最小限に抑えるために、同じプログラムを何千回も実行して、別のISAに翻訳する際の相対的なオーバーヘッドを減らしてる。

家の暖房を古いXeonでデフォルトのモネロクライアントを動かして部分的に行ってるよ(デスクの近くで熱が出るから)。外が寒いときだけマイニングするから、実際の電気代はかからないんだ。個人的には、仮想通貨をマイニングするために特別に機材を買うのは「価値がない」と思うけど、古いマシンを持っていて、ヒートポンプなしで暖房をしているなら、無料の趣味・ヒーターになるよ。---- 新しいモネロのブロックチェーンコピーを同期している人には、カスタムノードフラグ --db-sync-mode safe を使うことをおすすめするよ。これは遅いけど、破損を避けるためのものだから、ノードの初回起動前に設定してね。セーフモードなしだと、クライアントが停止するとローカルブロックチェーンが破損する可能性が高いから、数日分のダウンロードや検証が失われることになるよ。また、モネロチームが推奨しているSSDを使ってブロックチェーンを保存する場合(私は推奨しないけど)、常にIOアクセスがあるから寿命が大幅に短くなることを知っておいてね。個人的には、7200RPMのHDDでセーフモードを推奨するよ(HDDはIOアクセス中に劣化しないから)。---- xmrigとgetmonero.orgのデフォルトクライアントを動かすことについてどう思う?モネロはASIC耐性があるって一般的に同意する?

専用の検証機能を設計しなきゃいけなかったんだけど、これが簡単に壊す方法になるんじゃないかな。ビットコインの素晴らしいところは、非常に広く知られている暗号の基本を使ってるところだよね。検証は、正しいシードを得るのと同じなんだ(ただ、正しいシードが何かを教えてもらえるだけで、発見するためにお金を払う必要はない)。

うーん、それが理由で変更したわけじゃないんだ。単にASICを防ぐために調整するのに疲れたんだよね。最初の頃にマイナーが大量に流入したから、(統計的に)元のアルゴリズムを弱体化させるのはかなり無駄だったみたい。効果は短命で、影響も最小限だった。もう10年以上経って、最初の1ヶ月にマイニングしてた人は(あの不公平なアドバンテージがあったにもかかわらず)モネロの発行の意味のある割合を得ることはできなかった。RandomXは、GPUやASICに抵抗できるPoWアルゴリズムを作ることが実際に可能だって証明したよ。もっと掘り下げてみることを勧めるよ。「ASIC」に最も近いのは、たくさんのRISC-V CPUを搭載したマルチCPUマイナー(Bitmain X9)だね。

この辺のことはよく分からないんだけど、誰か助けてくれないかな。暗号通貨は現実のお金の代替になるべきものなの?少なくとも、ビットコインの動機はそう理解してたんだけど。もしそうなら、なんで人々が「労働を証明することで」現金を「生成」できるのが理にかなってるの?普通のお金ではそんなことできないよね。これらの暗号通貨の主な機能は「人々が通貨を送り合うこと」なのか、それとも「人々が通貨を生成して(数字として)それを現実のお金に売ること」なの?

Lyn Aldenの「Broken Money」はこのテーマについての良い本だよ。

もしそうなら、なんで人々が「労働を証明することで」現金を「生成」できるのが理にかなってるの?こう考えてみて:物理的な現金で支払うと、どこかで鉱石を掘り出して、精錬して、コインに形を整えたり、紙を切ったり印刷したりする人たちがいるよね。これらの人たちは、自分たちが作った通貨で報酬をもらうから、そういうことをしてるんだ。デジタルで分散型の通貨を作る方法は、通貨の生成を促すという似たような概念を取り入れないと、まだ誰も見つけていないみたい。

これはマイニングを促進するためのメカニズムに過ぎないよ。代わりに、マイナーが手数料だけで報酬を得ると、取引が非常に高くつくリスクがあるからね。新しいコインを発行することで、マイニングのコストを全ての保有者に分散させて、通貨を少しインフレさせるんだ。スパムを避けるためには手数料も必要だよ。

Hacker Newsで議論の続きを見る