ハクソク

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

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

概要

  • 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」はこのテーマについての良い本だよ。
> もしそうなら、なんで人々が「労働を証明することで」現金を「生成」できるのが理にかなってるの?こう考えてみて:物理的な現金で支払うと、どこかで鉱石を掘り出して、精錬して、コインに形を整えたり、紙を切ったり印刷したりする人たちがいるよね。これらの人たちは、自分たちが作った通貨で報酬をもらうから、そういうことをしてるんだ。デジタルで分散型の通貨を作る方法は、通貨の生成を促すという似たような概念を取り入れないと、まだ誰も見つけていないみたい。
これはマイニングを促進するためのメカニズムに過ぎないよ。代わりに、マイナーが手数料だけで報酬を得ると、取引が非常に高くつくリスクがあるからね。新しいコインを発行することで、マイニングのコストを全ての保有者に分散させて、通貨を少しインフレさせるんだ。スパムを避けるためには手数料も必要だよ。
うん、ビットコインは中央銀行の通貨の代替になるんだ。それはホワイトペーパーの最初の数行に書いてあることだよ。お金の仕組みはこうなんだ。商品やサービスのための交換手段や会計単位を使うなら、その手段は商品やサービスの増加と同じ速度で増えなきゃいけない。そうしないと、インフレや収縮、失業率の上昇などの二次的、三次的な影響が出て、会計単位としての機能に直接影響を与えることになる。ビットコインでは現金を生成するんじゃなくて、合意形成の仲介者としてブロック報酬を得るんだ。これは中央銀行の決済レイヤーが必要なところを補う活動で、取引レイヤーに直接結びついて、商品やサービスの増加と通貨供給の拡大の均衡を保つ役割を果たしてる。ウォール街がこれを手に入れて、今やビットコインは主に投機的な投資のための価値の保存手段として機能してる。主に、ビットコインが非常に中央集権的だから、取り残されることへの恐れや市場操作によって駆動されてるんだ。
銀行の代わりになるために作られたんだよ。暗号通貨は、市場参加者同士が他の参加者や機関を信頼しなくても価値を伝えられるようにする。マイニングは取引を確認して公開記録に記録することで、マイナーはその作業に対して報酬を得るんだ。
新しい通貨が存在する前は、存在しないんだよ。誰かがそれを発行しなきゃいけない。お金の観点から言うと、存在させるためにインフレさせる必要がある。これをどうやってやるか?国家や中央銀行の場合は明らかだよね:国家や銀行自体が印刷するんだ。民間のプレイヤーの場合は技術的な手段が少し分かりにくいけど、その通貨の背後にいるアクターが決定権を持ってる。分散型のオープンソースプロジェクトでは、もっと不明確になる。システム内のすべてのノードが新しく印刷された通貨の一部を受け取るようにすることもできるけど、ノードを運営するのが自由だったら、みんなが億単位のノードを運営して自分たちのためにすべての通貨を取ってしまう可能性がある。ビットコインはProof of Workでこの問題を解決したんだ。これは、二重支払い問題と発行問題を一緒に解決するエレガントな方法だよ。すべてのノードは無駄な計算を行ったことを証明しなきゃいけなくて、インフレは作業ノード全体に均等に広がる。これによって、専用ハードウェアを使ったノードとマイナーの間に分裂が生じたけど、基本的な前提はまだ有効だよ。一般的に暗号通貨はとても異なる。二番目に人気のあるイーサリアムは民間のアクターによって作られて、そのアクターは自分のために7200万を印刷することに決めて、ソフトウェアのリリース前に80%以上を売却したんだ。これがICOという言葉を生み出したんだけど、数年間とても流行ったよ。初期リリースの後、インフレはマイナーモデルに従って続いた。
ランダムな作業をして「現金を生成」することはできないよ。ネットワークを守って分散化を維持するために報酬をもらってるんだ。その報酬はネットワークのネイティブトークンで支払われる。これはインセンティブメカニズムで、ネットワークのインフラを提供する人たちへの報酬なんだ。
私たちの世界の奇妙なことの一つは、お金がすべての中心にあるけど、その仕組みを理解するのが難しいことなんだ。例えば、ドルがどうやって作られるかについては多くの手振りがあるけど、その多くは実際には全く正しくない(ほとんどのドルは政府や連邦準備制度ではなく、民間銀行によって作られるんだ。これについては完全に理解しているとは言えないけど)。私の考えでは、ビットコインの大きな欠陥は、それが本質的にデフレ通貨であることだと思う。デフレは表面的には素晴らしいように見えるけど、物価が下がると、今日何かを買う理由がなくなっちゃう。明日にはもっと安くなるかもしれないからね。これが経済活動を遅くしたり、完全に止めたりする原因になる。逆に少しのインフレは、何かに投資したり、より良いリターンを得るためにお金を使うインセンティブを生む。高利回りの貯蓄口座に入れたり、資本や金融投資をしたりすることだね。デフレの時は、現金をそのまま置いておけば(経済成長を引き起こすことはない)、リターンが得られるんだ。
> 仮想通貨は現実の現金の代替になるべきものなの?交換手段としての役割があるよね。「現実の現金」はお金の一形態に過ぎないし、ドルみたいな特定の通貨でも、実際に使われるのはごく一部なんだ。でも、極端なビジョンでは仮想通貨が他の通貨を全て置き換えることになる。もっと穏やかなビジョンもあるけどね。だから、「~べき」という言葉を使うときは、誰の考えかによって答えが変わるから、ちゃんと説明しないとね。 > もしそうなら、どうして人々がある程度の労働を証明することで現金を「生成」できるのが理にかなうの?通貨供給を提供するためのメカニズムが必要だし、通貨システムが依存するインフラを提供するインセンティブも必要だから。法定通貨システムでは、中央銀行の政策決定が一般的で、銀行業界の競争をコントロールしたり、銀行を支援するための政府の行動がある。これが銀行の収益性を強化するんだ。仮想通貨システムでは、マイニングがこの両方の機能を果たしているよ(取引ネットワークの参加者の収益性を強化し、通貨供給を管理するメカニズムを提供する)。 > これらの仮想通貨の主な機能は「人々が通貨を送り合うこと」なのか、「人々が通貨を生成して、これを現実のお金に売ること」なのか?通貨システムの参加者が他の通貨(FOREX)に売るのは、複数の通貨が存在する世界ではどの通貨システムにもある特徴だよね。どちらが「主な機能」とされるかは、誰の考え方によるかによって変わるんだ。
ビットコインは現実の現金の代替として設計されたけど、結局その役割には失敗したよね。それでも、業界を実質的に創造した素晴らしい実験だった。ほとんどの仮想通貨は、数だけで見れば、作成者を裕福にするために設計されていて、そこそこ成功している。これがERC20やpump dot funなどだよね。実際の通貨として使える可能性があるものだけを考えると、最近のものは「スマートコントラクト」と呼ばれる任意のマネーライクなプログラムを実行するために設計されていることが多い。伝統的なお金もその一つだ。お金は生成されるまで送れないし、それはビットコインでもドルでも同じ。新しいお金が作られるとき、誰がそれを得るかのルールが必ずあって、そのルールはいつも「裕福な人が新しいお金を得る」になってしまうんだ。ドルは政治家や大銀行家に、ビットコインは大規模なコンピュータファームに、イーサは大銀行家に、モネロは大規模なコンピュータファームに行く。もちろん、さっきの一攫千金の通貨はその作成者のところに行くよ。
誰か、RandomXのマイナーが分岐なしでプログラムを生成しない理由を説明してくれない?それが不可能な理由がちょっと混乱してるんだ。
CPU以外で実行するのが難しいように設計されてるからだよ。
プログラムはランダムに生成されていて、そのシードは現在のブロックヘッドから決定的に決まっていると思うから、攻撃が難しいんじゃないかな。マイナーがブロック生成自体を最適化するシナリオもあり得るかも?最適化されたブランチレスのバリアントを生成して、それを複数のASICで並行して動かして、全てのブランチをカバーして結果を提出するっていうのはどう?それがブランチ予測とCPUに頼るよりも非効率的になるのかな?
スキップできるけど、あと7つのプログラムが残っていて、最初のプログラムを終えないと次のプログラムがわからないから、最初のプログラムが終わった後は特にメリットはないね。
サイドクエスチョン:今のところ、モネロを買うのに一番詐欺っぽくなくて複雑じゃない方法は?
ライトコインみたいな他の仮想通貨を買ってから、それをモネロに交換するのがいいよ。匿名でできる取引所が結構あるから。
クラーケン?
それについてここにコメントしたよ。 (https://news.ycombinator.com/item?id=47858801)
2019年のモネロコンでデザインについて説明したよ。ここで見られるよ:https://www.youtube.com/watch?v=4Hkd-n1W_e4
そのリンクはこの投稿を参照してるみたい。
記事は結果を飛ばしてるの?デザインは成功したのかな?マイナーはどのハードウェアを使ってるの?それって均等に分配されてるの?ポテトハードウェアでモネロをマイニングできる?
そのデザインは2018年から今まで完璧に機能してるよ。https://old.reddit.com/r/Monero/comments/1h6e4nk/randomx_5_y... ほとんどのマイナーはAMDのRyzenを使ってる。実際に使われてるCPUの内訳はわからないけどね。AppleのMシリーズのCPUもかなり効率的だよ。ビットメインは「モネロのRandomXマイニングASIC」を売ってるけど、これはRISC-Vコアがたくさん入ったもので、Sophon SG2042 SOCに基づいてるみたい。彼らの製品に特別なことやコストパフォーマンスが良いわけではないよ。古いスマホでも簡単にマイニングできるし、俺は古いAndroidのTVボックスをたくさん使ってる。ハッシュレートは自慢できるほどじゃないけど、ハッシュ/ワットはまだ速いCPUと競争できるレベルだよ。もうすぐRandomX V2が導入される予定で、主な改善点はさらに安い検証コストだよ。
これが大量の電力を使わないシステムを説明してくれることを期待してたんだけど、残念ながらそうじゃなかった。
大量の電力を消費せずに、どうやってプルーフ・オブ・ワークを持てるの?