mcpField
M
monerometrics

monerometrics

リモート
github.com/nowi333金融データ41 週間前に更新
リポジトリ

monerometrics について

monerometricsは、Moneroコミュニティやチェーンの信頼性を調べる人向けのオープンソース監視プロジェクトです。ダッシュボードと読み取り専用APIで、チェーン再編や孤立ブロックに加え、マイニング、ネットワーク、Haveno市場の指標を追跡します。

主な機能

  1. 01チェーン再編と孤立ブロックの追跡
  2. 02ネットワークハッシュレートとブロック時間
  3. 03マイニングプールの分布と集中度
  4. 04リアルタイムのメンプールと手数料推定
  5. 05Havenoの注文板とプレミアム指標
  6. 06ダッシュボード、読み取り専用API、Torアクセス

活用シーン

  1. 01再編履歴と置き換えられた取引の確認
  2. 02マイニングプールの集中度の監視
  3. 03現在のネットワークとメンプール状態の確認
  4. 04決済方法別のHaveno流動性の分析

MCP 対応

`https://api.monerometrics.net/mcp`でMCPサーバーを提供し、Streamable HTTP経由でMCPクライアントにMonero指標を公開します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://api.monerometrics.net/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

19

このツールにパラメーターはありません。

詳細

monerometrics

Monero ネットワークの健全性を監視する、再編成を考慮した観測ツールです。公開ダッシュボードと API を提供します。

ライセンス IaC Monero Kuno

monerometrics はコミュニティの資金で運営されています。 Kuno のキャンペーンにより、ホスティング、FCMP++ 対応、無料の再編成アラート、オープンデータのエクスポート、2 台目のノードに向けた今後 2 年間の資金を調達します。

monerometrics は、Monero ネットワークの健全性、すなわちネットワークのハッシュレート、 ブロック時間、メンプールの状態、マイニングプールの分布、そして何よりも チェーンの再編成 (reorg)と孤立ブロックを計測し、履歴として記録します。これらは多くのブロックエクスプローラーでは適切に把握できません。

このプロジェクトは、2025 年 8 月の Qubic 事案をきっかけに生まれました。この事案では、独自トークンでマイナーに報酬を支払うマイニングプールがネットワークのハッシュレートの過半数に迫り、その後ブロックを保留し、より長いプライベートチェーンを公開しました。2025 年 9 月 14 日には、高さ 3,499,659 で 18 ブロックの再編成が発生し、約 36 分間の履歴が消去されました。これは、誰もが最終確定と見なしていた 10 承認を大きく超えるものでした。確定したと思われていたトランザクションが、突然、再び未承認になったのです。この問題を解決するための信頼でき、誰もが利用できるデータは、当時の公開討論に欠けていました。monerometrics は、中立的で検証可能な、再編成を考慮した観測ツールによってその不足を補います。

オープンソースでセルフファンド型のプロジェクトで、広告やトラッキングはありません。ダッシュボードと API は、今後もずっと無料で公開されます。有料プランはなく、今後も提供する予定はありません。

卒業制作プロジェクトからコミュニティツールへ。 monerometrics V1 は、フランスの専門的な IT インフラストラクチャプロジェクトとして開発・発表され、卒業資格を取得しました。その章を終えた今、V2 の目標はプロジェクトをMonero コミュニティに引き継ぐことです。

  • ダッシュボード:monerometrics.net
  • 公開 API:api.monerometrics.net(OpenAPI ドキュメント付き)
  • MCP サーバー:https://api.monerometrics.net/mcp(Streamable HTTP;MCP Registryに登録)
  • Tor オニオンサービス:6wbhchvavey26lbtscl6w6qg76balycixtsklcggrsslyk4xah6sbbad.onion (ダッシュボードと API、Cloudflare 不使用、IP アドレス非公開。Tor 経由のアクセスを参照)

機能

ダッシュボードは、4つのセクションで構成された React SPA です。英語、フランス語、スペイン語に対応し、ライトテーマとダークテーマを選べます。スマートフォンでも読みやすく表示されます。

  • コンセンサスと再編成: 競合するブランチをツリーとして描画するチェーンフォークビジュアライザー、記録済みデータ全体まで指定できる期間ごとの再編成統計、孤立ブロックの履歴を表示します。各ブロックにはプール名と帰属の判定方法が表示され、マージマイニングされたブロックにはフラグが付きます。
  • マイニングの集中度: プールの分布、上位2つのプールの合計シェア、各帰属の根拠を表示します。
  • ネットワーク状態: ハッシュレート、ブロック時間の分散、メモリプール、排出量に加え、ノードの4段階の優先度をリアルタイムで読み取るトランザクション手数料推定ツールを表示します。
  • ピアツーピア市場: 板の両側におけるHavenoの現物価格に対するプレミアム、リアルタイムの注文板の厚み、待機中の流動性、支払い方法ごとのプレミアムを表示します。
  • トランザクション検索: トランザクションハッシュを貼り付けると、Moneroが実際に公開している情報に加え、そのブロックをマイニングしたプールと、そのブロック高が再編成で競合したことがあるかどうかを確認できます。ハッシュはPOST本文で送信されるため、URLに残りません。
  • すべての時系列を操作できます。各チャートの下にある範囲バーを使って、時間を移動したり、ズームしたりできます。統計は系列全体ではなく、表示中の範囲に合わせて更新されます。

公開 API: FastAPI を使用した読み取り専用の JSON エンドポイントをテーマごとにまとめ、OpenAPI でドキュメント化しています。

再編成の検出: Python ワーカーが同期済みノードから各ブロックを読み取り、指標を計算します。さらに、ノードに対して直近のブロックを定期的に再確認して再編成を検出し、実際の深さと、置き換えられたトランザクションを記録します。

アーキテクチャ

訪問者は Cloudflare 経由でダッシュボードまたは API にアクセスします。Cloudflare が TLS を終端してエッジ保護を適用し、強化されたエッジサーバー(nginx + ModSecurity WAF)に転送します。エッジサーバーは静的ダッシュボードを配信し、API をk3sノードにリバースプロキシします。k3s ノードでは、Monero ノード、インデクサー、PostgreSQL、API からなるアプリケーションの中核が稼働しています。

これとは別に、独立した経路もあります。エッジ上で稼働するTor のオニオンサービスは Cloudflare を完全に迂回し、同じオリジンからダッシュボードと API の両方を配信します。同じ WAF の背後で動作します。

flowchart LR
    User(["Visitor"]) -->|HTTPS| CF["Cloudflare<br/>DNS · WAF · proxy"]
    CF -->|"HTTP/2 origin pull"| Edge
    Tor(["Tor visitor"]) -.->|"Tor network"| Onion
    subgraph HZ["Hetzner Cloud · private network 10.0.0.0/24"]
        Onion["tor daemon<br/>hidden service v3"]
        Edge["edge 10.0.0.20<br/>nginx + ModSecurity WAF<br/>static dashboard"]
        Onion -.->|"127.0.0.1:8080"| Edge
        subgraph K3S["k3s 10.0.0.30 · no public ingress"]
            API["FastAPI"]
            Worker["Python worker<br/>(indexer)"]
            DB[("PostgreSQL 17")]
            Node["monerod 0.18<br/>pruned"]
        end
        Edge -->|"api. proxy_pass"| API
        API --> DB
        Worker --> DB
        Worker -->|JSON-RPC| Node
    end
    Node <-->|"P2P sync"| Monero(["Monero network"])
    API -.->|"XMR price (cached)"| Price(["CoinGecko · Kraken<br/>Haveno (RetoSwap)"])

Tor 経由でのアクセス

ダッシュボードはTor v3 オニオンサービスとしても公開されており、Cloudflare に依存せず、訪問者の IP アドレスを公開しないデータへの経路を提供します。

6wbhchvavey26lbtscl6w6qg76balycixtsklcggrsslyk4xah6sbbad.onion
  • 単一のオリジンで、情報漏えいなし。 オニオンサービスは / でダッシュボードを配信し、/api 配下に API をリバースプロキシします。SPA は実行時に .onion ホストを検出して相対パスに切り替えるため、ブラウザーからのリクエストがオニオンサービスの外に出てクリアネットにアクセスすることはありません。1つのビルドで両方に対応します。
  • TLS は意図的に使用しません。 Tor がエンドツーエンドで暗号化と認証を行い、.onion アドレス自体がサービスの公開鍵だからです。
  • 同じ WAF。 オニオンサービスの仮想ホストには、クリアネットサイトと同じ ModSecurity ルールが適用されるため、Tor をフィルタリングの迂回に利用することはできません。
  • インターネットからは到達できません。 .onion 仮想ホストは 127.0.0.1:8080 のみで待ち受けるため、アクセスできるのは Tor デーモンだけです。Tor が行うのは外向きの接続だけです。
  • ログはありません。 すべてのリクエストは 127.0.0.1 から届くため、この仮想ホストのアクセスログには有用な情報が記録されず、無効になっています。
  • 発見可能です。 クリアネットサイトは Onion-Location ヘッダーでオニオンサービスを通知します。
  • レート制限。 Tor 経由では IP ごとの制限に意味がないため、オニオンサービスのトラフィックには nginx がタグを付け、上限を高く設定した専用の枠に分離します。このタグ付け用ヘッダーはクリアネットの仮想ホストでは取り除かれるため、インターネットから偽装することはできません。

tor Ansible ロール(config/ansible/roles/tor/)でデプロイされます。

インフラストラクチャ

このプラットフォームは、Hetzner Cloud(ニュルンベルク)のプライベートネットワーク上にある Ubuntu 24.04 サーバー 2 台で稼働しており、それぞれ独自のファイアウォールの背後にあります。どちらもインターネットには SSH を公開していません。管理は、両サーバーが参加する Tailscale(WireGuard)メッシュ経由でのみ行い、Grafana も Tailscale 経由でのみアクセスできます。バックアップは一時停止中です。ツール(Restic、暗号化済み。詳細は k8s/monerometrics/BACKUP-PRA.md を参照)はリポジトリに残していますが、現在、スケジュールされたバックアップは実行されていません。

flowchart TB
    Admin(["Administrator"]) -->|"SSH over Tailscale"| Mesh
    Internet(["Internet"]) -->|"80 / 443 via Cloudflare"| Edge
    subgraph HZ["Hetzner Cloud (nbg1) · 10.0.0.0/24"]
        Edge["edge 10.0.0.20<br/>firewall: 80/443 from Cloudflare only"]
        K3s["k3s 10.0.0.30 + data volume<br/>firewall: no inbound (P2P 18080 only)"]
        Edge -->|"private network"| K3s
    end
    Mesh["Tailscale mesh<br/>(admin SSH · kubectl · Grafana)"]
    Mesh --- Edge
    Mesh --- K3s
サーバータイプ外部公開役割
edgeCX23インターネットからの 80/443nginx リバースプロキシ + ModSecurity WAF。ダッシュボードを配信
k3sCX33 + 250 GB ボリュームMonero P2P のみk3s クラスター:monerod、ワーカー、PostgreSQL、API、OpenBao

主な選択事項は、サーバーごとのファイアウォール、全サーバーで SSH を非公開にすること、唯一の公開 Web インターフェースに WAF を設置すること、ゼロトラストの管理メッシュ、そして Monero P2P ポート以外を一切公開しない k3s ノードです。専用の SSH バスティオンは 2026 年 10 月に廃止しました。Tailscale がすでにゼロトラストの入口を提供していたため、サーバーを追加してもコストが増えるだけだったからです。Tailscale 独自の SSH は無効にし、通常の OpenSSH を鍵認証でメッシュ経由で実行しているため、アクセスがブラウザーでの再認証に依存することはありません。2 つのホップはいずれも、WAF を有効にした状態で HTTP/2 を実行します。すべてを Infrastructure-as-Code で管理しています。Hetzner と Cloudflare のリソースには Terraform、サーバー構成と CIS に準拠した強化には Ansible を使用し、イメージは GHCR に公開しています。監視には Prometheus + Grafana を使用し、インデックス作成、ノード同期、ディスク、ワークロードの失敗に関するアラートルールを設定しています。バックアップツール(Restic)は保持していますが、一時停止中です。

シークレット。 クラスターは OpenBao(Vault の無料フォーク)を使ってプロビジョニングしており、マニフェストに平文の認証情報は含まれていません。OpenBao は起動時に自動でシール解除されます(静的シール。鍵はリポジトリ外で作成された Kubernetes Secret に保存)。また、ワークロードは Kubernetes Secret(postgres-credentials-fallback)にフォールバックできるため、Vault がシールされた状態でもサービスが停止することはありません。

運用コスト

Hetzner の標準価格。月額上限、20 % の VAT 込み:

項目月額
1 × CX23(edge)約 6.60 €
1 × CX33(k3s)約 10.20 €
プライマリ IPv4 × 2約 1.20 €
250 GB ボリューム約 17.20 €
合計約 35 €(VAT 込み)

Cloudflare、Let's Encrypt、Tailscale、GitHub Actions は無料プランを利用しています。

容量を大きく左右するのはボリュームであり、その要因はインデックス作成ではなくチェーンです。プルーニング済みの Monero ブロックチェーンは 106 GB、インデックス化されたデータベース全体(377 万ブロックとすべての時系列データ)は 3.1 GB で、1 ブロックあたり約 540 バイト、年間約 150 MB 増加します。

増加量は推定ではなく、インデックス化されたデータから実測しています。すべての正規ブロックの記録サイズを合計すると、チェーン全体は 186.8 GB となるため、このプルーニング済みノードは Monero の半分強を保持しています。チェーンは過去 12 か月間で 22.18 GB 増加し、ディスク上では年間 12.35 GB の増加に相当します。年ごとの増加量は安定しており、2022 年は 17.5 GB、2023 年は 18.3 GB、2024 年は 29.1 GB、2025 年は 22.2 GB でした。ボリュームの使用量が 128 GB の 94 % に達したため、2026 年 10 月に 250 GB へ拡張しました。費用はコミュニティの支援で賄いました(Kuno のマイルストーン 1)。これにより、約束していた 2 年を大幅に超える余裕が生まれ、FCMP++ がもたらす、より大きなトランザクションにも対応できます。同じ月に SSH バスティオンを廃止したことで、増額分の大半を賄えました。

インデクサーの仕組み

ワーカー(apps/worker/indexer.py)は、このプロジェクトの中核です。POLL_INTERVAL 秒ごとに monerod に状態を問い合わせ、ノードが同期済みの場合は、3 つのパスを実行します。

  1. 確認ウィンドウの再スキャン(再編成の検出)。 1 回の呼び出しで直近の CONFIRMATION_WINDOW ブロック(デフォルトは 60)のヘッダーを再取得し、各ハッシュをすでに保存されている正規ハッシュと比較します。不一致があれば再編成です。保存済みのブロックに孤立のフラグを付け(is_canonical = false)、ノード側のブロックを正規とし、実際の深さと影響を受けたトランザクション数を reorgs_detected に記録します。このパスがあるからこそ再編成を検出できます。前方にのみインデックスを作成する方式では過去を再確認しないため、すでにインデックス済みの高さを書き換える再編成をすべて、気付かないまま見逃してしまいます。

    このウィンドウが検出上限でもあります。 CONFIRMATION_WINDOW より深い再編成では、再スキャンが確認しない高さが書き換えられるため、誤った深さで報告されるのではなく、完全に見逃されます。60 ブロックあれば十分な余裕があり、記録上、Monero で最も深かった再編成は 18 ブロックですが、この制限は構造上のものであり、ここで公開する件数が完全なのはその深さまでです。値を大きくすると、ポーリングごとのヘッダー呼び出しが 1 回、より大きくなります。

    トランザクション数には num_txes を使用します。これはコインベースを除外するため、マイナー自身の出力ではなく、ユーザーが実際にブロードキャストしたトランザクションを数えます。

  2. 前方へのインデックス作成。 最後にインデックスを作成した高さより上のブロックを取得します。ブロックの先端に近い場合は、正確に帰属させるため完全なブロックを 1 つずつ取得します。大きく遅れている場合(新規デプロイ時)は、高速ヘッダーのバックフィル(1 回の呼び出しにつき約 1000 ブロック)に切り替えます。これでネットワーク健全性の時系列データを取得でき、時間のかかる長いウィンドウも、いつまでも埋まらない状態ではなく 2 時間以内に埋められます。

  3. 代替チェーン(孤立ブロック)。 競合するブロックの大半は、次のポーリングよりずっと前の数秒以内に確定するため、上記の再スキャンでは検出されません。再スキャンで検出できるのは、すでにインデックスを作成したブロックだけです。そのため、ワーカーはノード独自の代替チェーン(ワーカーだけがアクセスできる RPC ポート上の get_alternate_chains)も読み取り、競合するブロックをすべて孤立ブロックとして記録します。このパスを追加する前は、孤立ブロックの約 4 件に 1 件しか記録されていませんでした。

flowchart TB
    Start(["Every POLL_INTERVAL"]) --> Info["GET /get_info"]
    Info --> Sync{"node synced?"}
    Sync -->|no| Wait["log progress · sleep"]
    Sync -->|yes| Rescan["Rescan last N blocks<br/>get_block_headers_range"]
    Rescan --> Diff{"stored hash<br/>≠ node hash?"}
    Diff -->|yes| Reorg["mark old → orphan<br/>insert new canonical<br/>record reorg (depth, tx)"]
    Diff -->|no| Fwd
    Reorg --> Fwd["Forward index<br/>new blocks (batch)"]
    Fwd --> Alt["Read alternative chains<br/>record orphans"]
    Alt --> Metrics["update Prometheus metrics"]
    Metrics --> Start

可観測性。 ワーカーは :9100/metrics で Prometheus メトリクス(インデックス作成の遅延、再編成カウンター、同期状態、プールインデックスのサイズ、ビュ―キーで証明されたブロック、帰属の競合)を公開し、Kubernetes のライブネスプローブが読み取るハートビートファイルを書き込みます。ハートビートはパスが正常に完了した後にのみ書き込まれるため、失敗し続けるループは再起動され、WorkerStalled アラートが発生します。

マイニングプールの帰属判定

Monero は設計上プライバシーが保護されています。coinbase にはプール名が含まれず、ステルスアドレスのため「誰に支払われたか」を調べることもできません。帰属は確立する必要があり、決して推測してはなりません。

monerometrics は、プールの自己申告ハッシュレートからプールの取り分を推定することはありません。証拠によってプールと結び付けられるブロックのみを数え、使用した証拠の種類をブロックごとに blocks.pool_source に記録します。

1. ビューキーによる暗号学的証明(viewkey_proof)。 一部のプールは、ウォレットのプライマリアドレスとシークレットビューキーを公開しています(blocks.p2pool.observer/proofs を参照)。ビューキーで確認できるのは入金トランザクションのみで、支出はできません。API を信頼せずに coinbase 出力の所有権を証明するには、これで十分です。

R          = transaction public key, parsed out of the coinbase tx_extra (tag 0x01)
derivation = 8 · a · R                      (a = the pool's secret view key)
P_expected = Hs(derivation ‖ varint(i)) · G + B    (B = the pool's public spend key)

P_expected がインデックス i の出力キーと一致すれば、その出力はプールのウォレットに支払われています。これはプールの API に依存しない数学的事実であり、そのため新しいブロックが未帰属に見える原因となる報告の遅延の影響を受けません。apps/worker/pool_proofs.py で一から実装しています(ed25519 の点演算、Keccak-256、Monero の base58)。ブロックあたり約 33 ms です。

2. プールのブロック一覧を相互参照(pool_api)。 ビューキーを公開していないプールも、自身が発見したブロックを公開しています。これらの一覧を約 2 分ごとに集約して {block_hash → pool} のインデックスを作成し、ブロックハッシュで照合するため、主張は実在するブロックに基づいています。問題は正確性ではなく遅延です。公開が遅いプールでは、追いつくまで最近のブロックが unknown のままになります。各サイクルで帰属を再判定することで、こうした状態を遡って修正します。

3. coinbase のヒューリスティックな構造判定(coinbase_heuristic)。 一度に多数の出力へ支払う coinbase は、オンチェーンで報酬を分割する P2Pool に特徴的です。最終手段であり、ヒューリスティックとしてラベル付けされます。

ガードレール
  • キーは起動時に自己検証されます。 各ビューキーは、そのプール自身の API が主張するブロックを証明できなければなりません。検証に失敗したキーは除外されるため、古いキーや誤ったキーによってブロックに誤ったラベルが付くことはありません。
  • 競合は隠さずに表面化し、monerometrics_attribution_conflicts_total にカウントされます。
  • 証明されていない主張にはフラグが付けられます。 ビューキーを公開しているプールが、そのキーでは証明できないブロックを一覧に載せた場合、同じ確度で表示するのではなく pool_api_unproven として記録されます。
  • 両方を利用できる場合は、証明を API より優先します。
  • ソースの状態は /pools/sources で公開されているため、ソースの障害が黙って unknown を増やすのではなく、確認できます。
集約対象のソース
プールエンドポイント方法/深さビューキーによる証明
supportxmr.comwww.supportxmr.com/api/pool/blocks?limit=(最大 10000)✅
hashvault.proapi.hashvault.pro/v3/monero/pool/blocks?limit=&page=0(最大 10000)✅
moneroocean.streamapi.moneroocean.stream/pool/blocks?limit=100(プールの上限)✅
xmrpool.euweb.xmrpool.eu:8119/get_blocks?height= によるページネーション✅
ownblock.xyzブロック API なしビューキーのみ✅
p2pool(main / mini / nano)*.p2pool.observer/api/pool/blocks?limit=·
nanopool.orgapi.nanopool.org/v1/xmr/pool/blocks/0/{n}パスの件数(約 4600)·
c3pool.comapi.c3pool.org/pool/blocks?limit=(最大 10000)·
kryptex.compool.kryptex.com/xmr/api/v1/pool/blocksnext によるページネーション·
herominers.commonero.herominers.com/api/get_blocks?height= によるページネーション·
monerohash.commonerohash.com/api/get_blocks?height= によるページネーション·

P2Pool は 3 つのサイドチェーン(main/mini/nano)を運用しています。3 つすべてをポーリングし、中央集権性の観点では単一の分散型ネットワークであるため、p2pool という 1 つのラベルにまとめています。

帰属を特定できないものと、その理由

ブロックの約 5 分の 1 は最終的に unknown となります(直近 7 日間で 21.9 %。これに対し、45.8 % は暗号学的に証明済みで、残りはプール API による申告または推定です)。この数値は平滑化せず、そのまま報告しています。その理由は構造的なものです。

  • Qubic はブロックリストもビュ—キーも公開していないため、帰属を特定できません。
  • ソロマイナーは設計上、見えません。それこそが Monero の目的です。
  • 一部のプールは機能する API を公開せず、ビュ—キーも公開していません。
  • ごく最近のブロックは、プールがビュ—キーを提供している場合を除き、数分間は本当に帰属を特定できないことがあります。その場合は、直ちに証明されます。

公開トラッカーはどれも同じ上限に達しており、同等のサイトでは不明の割合がさらに高く報告されています。この 5 分の 1 を減らすことが、プロジェクトの主な未解決課題です。

マージマイニング

マージマイニングされたブロックとは、1 つのプルーフ・オブ・ワークが Monero のブロックと補助チェーン上のブロックの両方を主張するものです。インデクサーはコインベースの tx_extra にある 0x03 タグからこれを検出します。一定期間における割合は /chain/provenance で公開され、フォークビジュアライザーでは各ブロックに M が付けられます。

これは中央集権化につながる要因であるため、追跡しています。補助チェーンはマイナーに報酬を与え、対応するプールへハッシュレートを誘導する可能性があります。そして、ハッシュレートの集中こそが、そもそも再編成を可能にするものです。

ただし、Qubic が行ったのはこれではありません。 Qubic は「有用なプルーフ・オブ・ワーク」方式を運用し、マイニングした XMR を換金してマイナーに独自トークンで報酬を支払っていました。一時期は通常のマイニングよりおよそ 3 倍も収益性が高く、2025 年 5 月のシェア 2 % 未満から、8 月には過半数を占めると主張するまでになりました。この補助金は経済的なもので、プールを通じて支払われており、コインベースを通じたマージマイニングではありません。この 2 つを混同するのは誤りです。

直近 7 日間では、ブロックの約 60 % がマージマイニングされています。この割合はネットワーク全体の傾向ではなく、プールごとの方針によるものです。supportxmr、p2pool、c3pool、moneroocean は見つけたすべてのブロックでマージマイニングを行い、hashvault はほとんどのブロックで行う一方、nanopool、herominers、xmrpool、kryptex は一切行いません。そのため、この推移は運用方針の変化と同じくらい、今週どのプールがブロックを見つけているかを反映しています。補助チェーンは特定されていません。オンチェーンのタグに含まれるのは Merkle ルートのみで、特定するにはそのチェーンに問い合わせる必要があるためです。推測はせず、件数とルートを報告しています。

データモデル

PostgreSQL を使用しており、API からは読み取り専用です。チェーンの記録を保持するテーブルは 2 つです (k8s/monerometrics/20-configmap-postgres-init.yaml)。

  • blocks の主キーは高さではなく、ブロックハッシュです。これは意図的な設計です。これにより、同じ高さに複数のブロック(正規ブロックと、リオーグで残された孤立ブロック)を共存させられます。部分ユニークインデックス(UNIQUE (height) WHERE is_canonical)により、任意の時点で各高さにつき正規ブロックが必ず 1 つだけ存在することが保証されます。pool_source には、そのブロックのプールがどのように確定されたかが記録されるため、利用側は暗号学的証明とプール自身の主張を異なる重みで評価できます。reward_xmr は正確な NUMERIC であり、浮動小数点数ではありません。
  • reorgs_detected には、検出されたイベントごとに 1 行が記録されます。項目は fork_point_height、depth、old_chain_tip_hash、new_chain_tip_hash、affected_tx_count、detected_at です。 fork_point_height は置き換えられた最初の高さです。このイベントによって、fork_point_height から fork_point_height + depth - 1 までの高さが書き換えられました。

孤立ブロックと正規ブロックの区別が、フォークビジュアライザーと /orphans/recent、/reorgs/stats エンドポイントを支えています。

そのほかは時系列データで、ワーカーが初回実行時に作成します。

テーブル書き込み元保持するデータ
mempool_snapshotsワーカー、ポーリングごと保留中トランザクション数の推移
fee_snapshotsワーカー、5 分ごとノードの 4 段階の手数料(1 バイトあたりのピコネロ)
price_snapshotsワーカー、10 分ごと中央集権型市場のスポット価格と Haveno の板情報(売買両側)
haveno_offersワーカー、10 分ごと支払い方法を含む、個別の Haveno の未決済オファー
haveno_tradesワーカー、1 時間ごと支払い方法を含む、2024 年 5 月までさかのぼる Haveno の約定済み取引
haveno_liquidityワーカー、1 時間ごと2024 年 11 月までさかのぼる、市場ごとの 1 時間ごとの板の流動性
spot_dailyワーカー、1 時間ごと過去の取引価格の算出に使う、中央集権型市場の日次終値
pool_sourcesワーカープール API ごとの到達可能性とブロック数
api_usageAPI外部リクエスト数

これらはすべて真実の情報源ではなくキャッシュです。チェーンのテーブルは任意の monerod から再生成でき、市場のテーブルは haveno.markets から再生成できます。この特性により、以下の高可用性プランを低コストで実現できます。

再生成できない例外は、メモリプールのスナップショットとリオーグの 2 つです。トランザクションがマイニングされると、1 時間前に保留中だった件数を示す情報はオンチェーンに残らず、破棄されたブロックはどのエクスプローラーにも存在しません。どちらもこのオブザーバトリーが監視を開始した日から記録されており、そのため削除せずに保持しています。

API リファレンス

API(apps/api/)は読み取り専用で、FastAPI で構築されており、JSON を返します。対話型の OpenAPI スキーマは api.monerometrics.net/docs で確認できます。負荷の高い集計はサーバー側でキャッシュされ、各レスポンスには有効期間(Cache-Control + ETag)が設定されます。そのため、すでにバージョンを保持しているクライアントには空の 304 が返されます。すべての IP にレート制限が適用されます(1 分あたり 300 リクエスト。Tor トラフィックには専用の共有バケットがあります)。GET の CORS はオープンです。キーもアカウントもトラッキングも不要です。

特に記載がない限り、window は 1h、24h、7d、30d、90d、1y、5y を受け付けます。

サービス

エンドポイント説明
GET /health稼働状態とデータベース接続の確認です。
GET /infoAPI バージョン、インデックス済みの最新の高さ、ブロック総数、孤立ブロック数、リオーグ数です。
GET /usage/externalこのダッシュボードと MCP サーバーを除く、処理済みの外部 API リクエスト数です。

ネットワーク

エンドポイント説明
GET /network/info現在の状態:同期ステータス、メンプールサイズ、難易度、推定ハッシュレート(ノードからリアルタイムで取得)。
GET /network/hashrate?window=過去のネットワークハッシュレート(難易度 / 120 s)。ウィンドウごとに約300ポイントにまとめられます。
GET /network/blocktime?window=連続する正規ブロック間の時間のばらつき(目標120 s)。ブロックごとに1ポイント、最大1500ポイントです。
GET /network/mempool?window=時間の経過に伴うメンプールサイズ。バケットは指定されたウィンドウではなく、実際に記録された履歴に基づくため、記録期間の短い系列でも密度が維持されます。
GET /network/emission?window=時間の経過に伴う平均ブロック報酬 · Monero のテールエミッション(約0.6 XMR/block)。
GET /network/feesノードの4段階の手数料(低速、標準、高速、最速)。約1500-byteの基準トランザクションについて、XMRとUSDで表示されます。
GET /network/fees/history?window=時間の経過に伴う標準ティアの手数料(nanonero単位)。window には 24h、7d、30d、90d、1y を指定できます。

チェーンとリオーグ

エンドポイント説明
POST /chain/searchハッシュからトランザクションまたはブロックを特定します。トランザクションについて Monero が公開している情報(確認数、ブロック、手数料、入力、出力、リングサイズ)、そのブロックを採掘したプール、さらにその高さが競合状態になったことがあるかどうかを返します。意図的に POST を使用しています:ハッシュがURL、ログ行、リファラーに記録されることはありません。
GET /chain/window?from=&to=2つの高さの間の生のブロックウィンドウ(最大1000ブロック)。
GET /chain/provenance?window=独自の帰属情報の証拠品質:暗号学的に証明済み、プールAPIによる申告、推定、または帰属なし。さらに、プールが独自の鍵で証明できなかった申告も示します。window = 1h|6h|24h|48h|7d。
GET /chain/block/{hash}1つのブロックの全詳細をノードからリアルタイムで取得し、プールの帰属情報も返します。証明済みのブロックについては、誰でも再検証できる公開証明の入力情報も返します。
GET /chain/fork-window?limit=孤立ブロックを含む最新のNブロックと、フォーク地点のフラグ。limit = 10..1000。
GET /reorgs?limit=検出された直近の再編成。limit = 1..1000。
GET /reorgs/stats24時間 / 7日 / 30日 / 90日 / 記録された全期間における再編成統計(件数、平均・最大深度、影響を受けたトランザクション)と、監視開始日。
GET /orphans/recent?window=競合する正規ブロックと孤立ブロックを表示します。window = 24h|48h|7d|30d|90d|180d|1y|all。

マイニングプール

エンドポイント説明
GET /pools/distribution?window=プールごとのブロックシェアに加え、最大プールのシェアとナカモト係数を表示します。帰属なしのブロックも分母に含まれますが、どのプールにも加算されないため、係数は上限値となります。window = 1h|6h|24h|48h|7d。
GET /pools/sources帰属情報に使用される各プールAPIへの到達性を、インデクサーが測定します。
GET /pools/latency?window=各プールが採掘したブロックを公開申告するまでの時間(中央値と90パーセンタイル)。分解能は独自のポーリング間隔に制限され、その間隔はレスポンスに示されます。

市場

エンドポイント説明
GET /price集中型の参照元(CoinGecko、フォールバックとしてKraken)によるXMR/USD価格と、Havenoの実勢価格を返します。スポット価格を上回る各側の最良オファーと、その金額加重値、およびround_trip_cost_pctを返します。どちらのデータソースもサーバー側でプロキシされるため、ブラウザーから直接呼び出されることはありません。
GET /price/spread?window=Havenoの注文板とスポット価格の推移を10分ごとにサンプリングして返します。両側が対象です。windowで指定できる値は24h、7d、30d、90d、1yです。
GET /haveno/bookXMR_USDのライブ注文板を、累積板の厚み、オファー数、支払い方法、reversibleフラグを含む価格レベルとして返します。各価格はスポット価格と比較されます。
GET /haveno/methods?window=&currency=支払い方法ごとに集計した約定済み取引と、プレミアムの平均値、中央値、標準偏差を返します。windowの値は30d|90d|180d|1y|all、currencyの値はUSD|EURです。
GET /haveno/liquidity?window=&currency=2024年11月までさかのぼり、オープンオファーに置かれているXMRの量を1時間ごとに返します。
GET /haveno/trades?limit=&currency=支払い方法、価格、プレミアムを含む最近の約定済み取引を返します。

その他

エンドポイント説明
GET /status最大プールのシェア、上位2プールの合計シェア、24時間の再編深度、先端ブロックの経過時間から算出した、チェーンとマイニング集中度に関する1行の健全性評価を返します。評価につながったすべてのしきい値も返します。プロトコルではプールシェアがどの程度なら高いか定められていないため、しきい値を暗黙に示すのではなく、公開しています。
GET /news過去7日間のMonero関連ニュースを、プロジェクトのブログ、Monero Observer、GitHubのリリースという3つのソースから取得し、各項目に出典を示すタグを付けて返します。サーバー側で取得してキャッシュし、侵害されたフィードによって訪問者がリダイレクトされないよう、各ソースのドメイン外へのリンクは除外します。

ディスカバリー。 ドキュメントに記載されたAPIに加えて、このサービスは、クローラーが実際に要求するエージェントディスカバリーの慣例にも対応しています。llms.txt、agents.json、エージェントカード、mcp.json、OpenRPC、ai-plugin.json、x402、owners.jsonのほか、通常のパスとRFC 9728形式の両方でOAuth保護リソースのメタデータを提供します。存在しないエンドポイントへのリクエストには、単なる404ではなく、利用可能なインターフェースを一覧表示したJSON本文を返します。このサービスが意図的に対応していないのは/v1/modelsとその派生パスです。これらのリクエストはOpenAI互換の推論APIを探すものであり、応答すると、このプロジェクトにない機能を提供しているかのように見せてしまいます。

決済手段のコスト

KYC不要の取引所について重要なのは、そこでMoneroがいくらかではなく、何が価格を押し上げているのかです。決済手段ごとに成立したすべての取引を分類すると、その答えがわかります。直感に反する結果です。

決済手段取引数取引高(XMR)平均プレミアム取り消し可能
PayPal6325 197+14.67%はい
Wise (TransferWise USD)8615 756+13.60%はい
Cash App24967 824+10.77%はい
Venmo309 569+8.92%はい
Zelle466298 361+2.60%いいえ
US postal money order84 615+1.46%いいえ
Revolut8942 209+1.41%未分類
Cash by mail219455 897+1.37%いいえ

USD市場、2026年8月24日までの180日間、現物価格の参照値にはKrakenの日次終値を使用。

プレミアムを左右するのはプライバシーではなく、取り消し可能性です。 PayPalやCash Appで支払う買い手は、Moneroの引き渡し後にチャージバックを申し立てることができ、売り手には対抗手段がないため、売り手はそのリスクを価格に織り込み、9~15%の上乗せをしています。取り消せない決済手段は、1~3%程度に収まっています。一覧のなかで最もプライバシー性の高い封筒での現金送付は、最も安価な手段の一つであり、どの決済手段よりも取引高が大きくなっています。

reversible フラグは当方による分類であり、Havenoのフィールドではありません。Revolutは未分類のままにしています。Revolutアカウント間の送金は原則として確定しますが、銀行は不正に関する異議申し立てを受け付けており、プレミアムは取り消せない決済手段と同程度です。取引数が少ない決済手段のプレミアムは不安定です。現物価格の参照値は日次終値であり、2024年9月より前の取引はKrakenの対象期間外で、プレミアムは一切ありません。暗号資産ペアは除外しています。haveno.markets では反転した価格で表示されるためです。

プレミアムの見方。 ask_premium_pct は最安売り気配と現物価格を比較し、ask_avg_premium_pct はすべての売りオファーの数量加重平均額を比較します。2つの平均値の差が round_trip_cost_pct、つまり買って売り戻すコストです。現実に近い数値はこれです。見出しのプレミアムが約8%なのに対し、約20%となっています。これは、各側の最良オファーではなく数量加重平均を使って意図的に算出しているため、上限値として捉えてください。最良オファーを裏付けていた数量は、わずか1.49 XMRの場合もありました。最初の価格帯で取引が完了する小口取引ならこれより有利ですが、板を進む取引ではそうなりません。

対象範囲:法定通貨市場のみ。 Havenoには34の市場がありますが、見出しに使われる流動性の約95%は暗号資産ペアです。暗号資産同士の交換は即時に完了し、取引相手を必要としないため、プレミアムは常にゼロに近くなります。法定通貨のピアツーピア取引では、実際の相手、チャージバックのリスク、遅延が生じます。これらがプレミアムの唯一の理由です。特に断りがない限り、ここに記載する数値はすべて XMR_USD のものなので、意図的にサイト全体の合計よりはるかに小さくなっています。XMR_USD は法定通貨の米ドルを指します。ステーブルコインのペアは別に掲載されています。

これらの数値が示していないもの。 /price/spread の系列には価格、数量、オファー数が含まれますが、決済手段は含まれません。レベル1の板情報フィードでは決済手段が公開されないためです。したがって最安売り気配は、Moneroをプライベートに購入する価格ではなく、決済手段を問わず最も競争力のあるオファーの価格です。例外は /haveno/book です。こちらはレベル2のフィードを読み取るため、各価格レベルに決済手段が含まれます。履歴が始まるのは、記録を開始した2026年8月24日です。haveno.markets は過去の系列を公開しておらず、スプレッドの過去データを補完できないためです。

MCP サーバー

同じ読み取り専用メトリクスは、Model Context Protocol サーバー(apps/mcp/)を通じて AI アシスタントにも公開されているため、MCP 対応クライアントであれば、アカウントも API キーも不要で Monero ネットワークに直接クエリできます。

  • エンドポイント(ストリーミング可能な HTTP):https://api.monerometrics.net/mcp
  • レジストリ:MCP Registry に io.github.nowi333/monerometrics として公開されています。
  • ツール:network_info、network_hashrate、network_blocktime、network_mempool、 network_emission、reorgs、reorg_stats、recent_orphans、pool_distribution、 pool_sources、chain_provenance、search_block、get_block、chain_fork_window、price、 haveno_book、haveno_premium、haveno_payment_methods、および monerometrics://reference リソース。

これはパブリック REST API を薄くラップしたもので、同じ k3s 上にデプロイされ、/mcp にルーティングされます。

リポジトリの構成

apps/          Application code
  dashboard/   React + Vite SPA (EN/FR/ES)
  api/         FastAPI service
  mcp/         Model Context Protocol server (thin wrapper over the API)
  worker/      Python indexer (reorg detection) + shared pool module
infra/         Terraform, modules (network, server, dns) + environments
config/        Ansible, inventory, playbooks, roles (hardening, nginx, tor, k3s, ...)
k8s/           Kubernetes (k3s) manifests + backup/DR runbook (BACKUP-PRA.md)
scripts/       Helpers (env loader)

デプロイ

プラットフォーム全体をコードから再現できます。Hetzner プロジェクト、Cloudflare で管理するドメイン、および必要なトークンが環境にあれば、次の手順で実行できます。

source scripts/load-env.sh          # tokens from the keychain

cd infra/environments/poc
terraform init && terraform apply   # servers, private network, firewalls, DNS

cd ../../../config/ansible
ansible-playbook site.yml           # CIS L1 hardening, nginx+WAF, k3s, Tailscale, tor

kubectl apply -k k8s/monerometrics/ # application workloads

構成ドリフト。 サーバー構成の変更には Ansible のみを使用し、手作業では変更しません。変更の前後には、どのホストでもドライランで変更がないことを確認する必要があります。

ansible-playbook site.yml --check --diff -e common_apt_upgrade=false

common_apt_upgrade=false を指定すると、パッケージ全体のアップグレードがスキップされるため、構成のみの実行で本番環境が予期せずアップグレードされることはありません。セキュリティパッチは unattended-upgrades によって適用されます。

サーバーのサイズ、データセンター、ボリュームサイズは Terraform 変数です(infra/environments/poc/terraform.tfvars.example を参照)。

平文の認証情報はコミットしません。 クラスターには OpenBao が付属しています。データベース認証情報(secret/postgres/credentials)を一度登録すれば、すべての利用者がそこから読み取れます。OpenBao は起動時に自身のシールを解除します。解除できない場合は、ワークロードが代わりに Kubernetes Secret を読み取ります。

ローカル開発(ダッシュボード)

cd apps/dashboard
npm install
npm run dev      # local dev server
npm run build    # production build to dist/

ダッシュボードはパブリック API を読み取ります。接続先を api.monerometrics.net に設定してください(src/api.js を参照)。

高可用性に向けて

現在稼働しているのは、意図的にシンプルにしたシングルノードの POC です:k3s ノード 1 台、レプリケーションされていない PostgreSQL 1 台、エッジ 1 つです。誠実で、低コスト(月額約 35 ユーロ、VAT 込み)で、プロダクトの有効性を示すには十分ですが、いずれも単一障害点です。

ここでは、ある特性によって高可用性を非常に低コストで実現できます。すべてのメトリクスは Monero ブロックチェーンから決定論的に導出されます。データベースはマテリアライズドキャッシュなので、どのレプリカやリージョン全体も、独自のローカル monerod から再インデックスできます。そのため読み取りは自然にアクティブ/アクティブとなり、スタックを失っても、データを失うのではなく、最初から再構築できます。例外は、導出値ではなく観測値である mempool と reorg の時系列データです。

この計画では、SPOF を段階的に解消します。各段階は個別に資金を調達できるため、インフラはプロジェクトのコミュニティによる資金調達に合わせて成長し、先行しません。

  1. 高可用性アプリケーション、単一リージョン。 冗長化されたエッジプールの前にロードバランサーを配置し、3 ノードの k3s コントロールプレーン(etcd クォーラム)、自動フェイルオーバーに対応したレプリケーション PostgreSQL(CloudNativePG)、Raft HA 構成の OpenBao、冗長化された Monero ノードを導入します。
  2. 複数ゾーン。 Hetzner のロケーション(nbg1 / fsn1 / hel1)に同様の構成を分散し、第 2 ゾーンに PostgreSQL の同期レプリカを置いて RPO をほぼゼロにし、第 3 ゾーンには非同期コピーを配置します。これにより、etcd クォーラムとエッジプールはゾーン全体の障害にも耐えられます。
  3. 複数リージョンのアクティブ/アクティブ構成。 異なるリージョンまたはプロバイダーに 2 つの完全なスタックを配置し、ヘルスチェックと地理的ルーティングを備えた Cloudflare Load Balancing で振り分けます。各リージョンは独自の Monero ノードからインデックスを作成するため、読み取りトラフィックをローカルで処理でき、各リージョンを個別に再構築できます。
flowchart TB
    CF["Cloudflare · DNS / WAF / proxy"] --> LB["Load balancer"]
    subgraph R1["Region"]
        LB --> E1["edge-1<br/>nginx + WAF"]
        LB --> E2["edge-2<br/>nginx + WAF"]
        subgraph K3S["k3s HA · etcd quorum"]
            S1(["server-1"]) --- S2(["server-2"]) --- S3(["server-3"])
        end
        E1 --> K3S
        E2 --> K3S
        subgraph PG["PostgreSQL HA"]
            PGp[("primary")] --> PGr[("replicas")]
        end
        K3S -->|writes| PGp
        K3S -.reads.-> PGr
        K3S --> N1["monerod-1"]
        K3S --> N2["monerod-2"]
    end
    N1 <--> MN(["Monero P2P network"])
    N2 <--> MN
    R1 -->|"encrypted 3-2-1"| OCI[("off-site backups")]

セキュリティとシークレット

  • リポジトリにシークレットを保存しないでください。 認証情報は実行時に macOS Keychain/環境変数(scripts/load-env.sh)または OpenBao から取得します。Terraform の状態ファイルはリポジトリの外に保管します。
  • 多層防御:ファイアウォールによるセグメンテーション、パブリック SSH なし、WAF、ゼロトラスト管理メッシュ、リスク分析(EBIOS RM)、および文書化された災害復旧計画(バックアップは現在一時停止中)。

お問い合わせ

手法に関する質問、間違っているように見える数値、ビューキーのインデックス化を希望するプール、データセットを求める研究者の方は、[email protected] までご連絡ください。不具合報告や機能リクエストは、公開され検索可能な状態に保たれるGitHub の issueへの投稿がおすすめです。

プロジェクトを支援する

monerometrics は、広告なし、トラッキングなし、データ販売なしの、月額約 35 €(税込)の小規模な自己資金によるインフラで運営されています。XMR による寄付はこちらにお送りください。

41mkUSrcAvdGw9E19a83rsh9zdSNC7m8PP34NvmRCCPLZVot61kJHc9i8KGge5JmxkDTuiz7a2nUtE7C4rcQJn4xKjfFyU2

ほかの暗号資産も利用できます。trocador.app AnonPayを通じて、アカウントも KYC も不要で、指定のアドレスに決済されます。

同じアドレスはダッシュボードと/.well-known/owners.jsonにも公開されているため、送金前に 3 つの独立した情報源と照合できます。

ライセンス

MIT。詳細はLICENSEをご覧ください。


広告なし。トラッキングなし。データ販売なし。Monero ネットワークのデータを、誠実に扱います。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。