RAILGUN稼働状況API
Anonは、ウォレットが依存するRailgunサービスを確認するモニターを運用しています。対象はPPOIノード、Anon独自のインデクサー、Subsquid、ブロードキャスター、Wakuです。モニターはチェーンごとにおよそ30秒ごとに再確認し、結果を公開URLの小さなJSONドキュメント1つとして公開します。ウォレット、ダッシュボード、ステータスページ、スクリプトなど、誰でも読み取れます。APIキーもアカウントも不要です。
GET https://api.anon.inc/api/v1/railgun/liveness
これはAnon独自のモニターから見た独立した状況です。Railgunの公式ステータスではなく、「安全に取引できる」ことを示すシグナルでもありません。限界はわからないことにまとめています。
ベータ版: このAPIはベータ版です。フィールド、列挙値、レスポンスの形は予告なく変更されることがあります。予告期間はなく、非推奨化や提供終了の約束もありません。未知のフィールドや値は無視するようにクライアントを作ってください。ベータ版についてを参照してください。
| プロパティ | 値 |
|---|---|
| ベースURL | https://api.anon.inc |
| 認証 | なし |
| CORS | すべてのオリジン、認証情報なし(GET、HEAD、OPTIONS) |
| ステータス | ベータ版:予告なく変更されることがあります(ベータ版について) |
| 形式 | JSON、schemaVersion 1(JSON Schema) |
| 再確認 | およそ30秒ごと。失敗が続くソースはそれより間隔があきます |
| キャッシュ | ブラウザは15秒、共有キャッシュは30秒 |
リクエストがプローブを起動することはありません。すべての応答は、保存済みのスナップショットから返されます。
クイックスタート
curl -i https://api.anon.inc/api/v1/railgun/liveness
レスポンスには、レポートとキャッシュ関連のヘッダーが含まれます。
HTTP/2 200
content-type: application/json; charset=utf-8
cache-control: public, max-age=15, s-maxage=30, stale-while-revalidate=30, stale-if-error=300
etag: "79d583eb71a37058"
access-control-allow-origin: *
access-control-expose-headers: ETag
ETagをIf-None-Matchで送り返すと、変更の有無を確認できます。変更がなければ、本文のない304 Not Modifiedが返ります。
curl -i https://api.anon.inc/api/v1/railgun/liveness \
-H 'If-None-Match: "79d583eb71a37058"'
ブラウザでは、通常のfetchをどのオリジンからでも使えます。
const response = await fetch("https://api.anon.inc/api/v1/railgun/liveness", {
headers: { Accept: "application/json" },
signal: AbortSignal.timeout(8000),
});
if (!response.ok) throw new Error(`liveness: HTTP ${response.status}`);
const report = await response.json();
各行は、自身の有効期限までしか信頼できません。表示する前に、自分の時計と照らして各行を判定してください。使える根拠のない行はunknown、有効期間を過ぎた行はstaleです。どちらも正常として表示してはいけません。
const FIVE_MINUTES = 5 * 60 * 1000;
const CLOCK_SKEW = 30 * 1000;
const ACTIONABLE = new Set(["current", "catching-up", "degraded", "unavailable"]);
function effectiveStatus(check, now = Date.now()) {
// Neither of these asserts anything that could go stale.
if (check.status === "unmonitored" || check.status === "unknown") return check.status;
// A status this client does not know is not evidence.
if (!ACTIONABLE.has(check.status)) return "unknown";
const observed = Date.parse(check.observedAt);
const expires = Date.parse(check.expiresAt);
// Missing, unparseable or inconsistent timestamps are not evidence either.
if (!Number.isFinite(observed) || !Number.isFinite(expires)) return "unknown";
if (observed > now + CLOCK_SKEW || expires <= observed) return "unknown";
const stale = expires <= now || now - observed >= FIVE_MINUTES;
return stale ? "stale" : check.status;
}
// Decide for yourself which chains count as mainnets.
const MAINNETS = new Set([1, 42161, 137, 56]);
const ppoi = report.checks.filter((c) => c.service === "ppoi" && MAINNETS.has(c.chainId));
console.log(ppoi.map((c) => `${c.chainId}: ${effectiveStatus(c)}`));
エンドポイント
GET https://api.anon.inc/api/v1/railgun/liveness
- 認証もパラメーターも不要です。クエリ文字列は無視されます。
HEADはヘッダーのみを返します。OPTIONSはCORSのプリフライトに応答します。- 本文は
application/json; charset=utf-8で、数KB程度です。 - 1つのレスポンスに、すべてのチェーンのすべてのサービスが含まれます。一度取得して、必要な行に絞り込んでください。
レスポンス例
5件のチェックに絞った抜粋レポートで、値は例示用です。実際のレポートには、すべてのチェーンのすべてのサービスが並びます。
{
"schemaVersion": 1,
"generatedAt": "2026-10-03T12:00:05.418Z",
"checks": [
{
"service": "waku",
"chainId": null,
"status": "current",
"reason": "responding",
"observedAt": "2026-10-03T11:59:40.993Z",
"lastSuccessAt": "2026-10-03T11:59:40.993Z",
"expiresAt": "2026-10-03T12:02:10.993Z",
"metrics": { "peers": 2 }
},
{
"service": "ppoi",
"chainId": 1,
"status": "current",
"reason": "synced",
"observedAt": "2026-10-03T11:59:52.206Z",
"lastSuccessAt": "2026-10-03T11:59:52.206Z",
"expiresAt": "2026-10-03T12:02:22.206Z",
"metrics": { "position": 139296, "head": 139296 }
},
{
"service": "broadcasters",
"chainId": 1,
"status": "current",
"reason": "responding",
"observedAt": "2026-10-03T11:59:40.993Z",
"lastSuccessAt": "2026-10-03T11:59:40.993Z",
"expiresAt": "2026-10-03T12:02:10.993Z",
"metrics": { "responding": 82, "monitored": 85 }
},
{
"service": "indexer",
"chainId": 1,
"status": "catching-up",
"reason": "behind",
"observedAt": "2026-10-03T11:59:58.731Z",
"lastSuccessAt": "2026-10-03T11:59:58.731Z",
"expiresAt": "2026-10-03T12:02:28.731Z",
"metrics": { "position": 26115307, "head": 26115332 }
},
{
"service": "subsquid",
"chainId": 137,
"status": "unavailable",
"reason": "unreachable",
"observedAt": "2026-10-03T12:00:01.093Z",
"lastSuccessAt": "2026-10-03T11:58:09.870Z",
"expiresAt": "2026-10-03T12:02:31.093Z",
"metrics": {}
}
]
}
wakuの行は共有のWakuチェックなので、chainIdはnullです。ステータスはcurrentで、peersはAnonが監視するWaku接続のピア数です。broadcastersの行はcurrentです。そのチェーンでAnonが監視しているブロードキャスター85件のうち82件が応答しました。monitoredが実際の分母です。ppoiの行は最新の状態です。positionはPPOIノードの検証済みTXIDインデックスで、headは同じノードの現在のインデックスです。indexerの行は参照値より25ブロック遅れており、許容範囲を超えているためcatching-upと報告されます。subsquidの行はunavailableです。Anonのモニターは、3回連続のプローブで使える応答を得られませんでした。observedAtは最後に失敗したプローブの時刻で、lastSuccessAtはサービスが最後に応答した時刻を保持します。失敗には指標が付きません。- チェックは現在、
waku、ppoi、broadcasters、indexer、subsquidの順に並び、各サービス内ではchainIdの昇順です。この順序に依存しないでください。
フィールド
レポート
| フィールド | 型 | 意味 |
|---|---|---|
schemaVersion |
整数 | 現時点では1です。ベータ版の間は変わることがあります。 |
generatedAt |
タイムスタンプ | スナップショットが組み立てられた時刻で、配信された時刻ではありません。モニターが稼働している間、少なくとも30秒ごとに進みます。 |
checks |
配列 | サービスとスコープごとに1つのオブジェクトです。サービスとchainIdの組み合わせは最大1回しか現れません。 |
チェック
| フィールド | 型 | 意味 |
|---|---|---|
service |
文字列 | 現時点ではppoi、broadcasters、waku、indexer、subsquidのいずれかです。今後増える可能性があります。 |
chainId |
整数またはnull |
正のチェーンIDです。現時点では、共有チェックであるwakuがnullです。 |
status |
文字列 | この行をどう扱うかを示します。ステータスを参照してください。 |
reason |
文字列 | この行がそのステータスである理由です。新しい値が追加されることがあります。理由を参照してください。 |
observedAt |
タイムスタンプまたはnull |
最新のプローブが完了した時刻です。失敗したプローブも観測として扱います。一度もチェックされていない場合や監視対象外の場合はnullです。 |
lastSuccessAt |
タイムスタンプまたはnull |
サービス自体が最後に応答し、比較された時刻です。その後に失敗しても保持されます。一度もなければnullです。 |
expiresAt |
タイムスタンプまたはnull |
この観測が意味を持たなくなる時刻です。observedAtに行の有効期間(公開時点では150秒)を加えた値です。対応が必要なすべてのステータス(current、catching-up、degraded、unavailable)で設定されます。 |
metrics |
オブジェクト | 測定値です。常に存在し、不明なキーは省略されます。 |
タイムスタンプはUTCで、ミリ秒精度、末尾にリテラルのZが付きます:YYYY-MM-DDTHH:mm:ss.sssZ。
指標
| キー | 意味 |
|---|---|
position |
サービス自身の位置です。ppoiでは検証済みTXIDインデックス、indexerとsubsquidではインデックス済みブロックです。 |
head |
比較の対象です。PPOIノードの現在のTXIDインデックス、またはチェーンの最新ブロックからそのサービス自身の承認の深さを引いた値です。 |
responding |
応答したブロードキャスターの数です。monitoredと一緒に設定され、それを超えることはありません。 |
monitored |
実際に確認したブロードキャスターの数です。これが本当の分母です。 |
peers |
監視対象のWaku接続に現在つながっているピアの数です。 |
新しいキーが追加されることがあります。知らないキーは無視してください。ここに挙げた指標はすべて、2^53 − 1以下の非負整数です。不明な指標は省略され、0で埋められることはないので、存在しないキーを0として読まないでください。監視対象外の行は"metrics": {}です。
positionがheadより大きくなることがあります。参照先の最新ブロックは独自の周期で読み取られ、最大で1分ほど古い場合があるためです。遅れは0以上に丸めてください。
ステータスと理由
ステータス
現時点のステータスは次のとおりです。これは閉じた集合ではありません。ベータ版の間は、予告なく値が追加されたり名前が変わったりすることがあります。認識できないステータスは、その行に限ってunknownとして扱ってください。
| ステータス | 意味 | 対応 |
|---|---|---|
current |
サービスが応答し、許容範囲内で参照値に追いついています。 | 応答して追いついている状態として、observedAt時点のものと表示します。 |
catching-up |
サービスは応答しましたが、参照値より許容範囲を超えて遅れています。 | 遅延を想定してください。障害ではありません。 |
degraded |
サービスは応答しますが、深刻に機能が低下しています。長時間大きく遅れているか、本来カバーすべき範囲の一部しかカバーしていません。 | 警告を出します。時間に厳しい処理では頼らないでください。 |
unavailable |
Anonのモニターは、3回連続のプローブで使える応答を得られませんでした。 | 応答していないものとして扱います。 |
unknown |
まだ使える根拠がないか、根拠を安全に比較できません。 | 良い知らせでも悪い知らせでもありません。緑色の状態は表示しないでください。 |
unmonitored |
Anonはこのチェックを監視していません。 | 失敗ではありません。対象外として表示してください。 |
expiresAtを過ぎた行は、ステータスが何であっても期限切れです。停止中のサービスの行も、そのような形で届くことがあります。鮮度とキャッシュを参照してください。
理由
| 理由 | 対応するステータス | 意味 |
|---|---|---|
synced |
current |
位置がheadから許容範囲内にあるか、PPOIノードが自身の現在のインデックスまで検証済みです。 |
behind |
catching-up、degraded |
位置がheadより許容範囲を超えて遅れています。 |
responding |
current |
比較できる位置を持たないサービス、つまりWakuとブロードキャスター向けです。 |
partial-coverage |
degraded |
監視対象のメンバーの一部しか応答していません。ブロードキャスターに使われます。 |
unreachable |
unknown、unavailable |
プローブがサービスに到達できなかったか、応答を理解できませんでした。連続2回までの失敗はunknown、3回でunavailableになります。 |
not-configured |
unmonitored |
Anonはこのチェックを監視していません。 |
no-observation |
unknown |
まだ何も観測されていないか、サービスは応答したもののこのチェーンのデータがありません。 |
incompatible-reference |
unknown |
サービスは応答しましたが、その数値を安全に比較できません。たとえば、PPOIノードに必要なリストがない場合や、参照に使うチェーンのheadが古すぎる場合です。 |
理由も閉じた集合ではありません。知らない理由はstatusだけを見て判断するように、クライアントを作ってください。Wakuやブロードキャスターの監視によって、新しい理由が今後も増えることがあります。
しきい値
以下は公開時点の値です。スキーマの一部ではなくモニターのポリシーなので、Anonはスキーマのバージョンを変えずに調整することがあります。
| ルール | 値 |
|---|---|
| 再確認 | 応答するソースはおよそ30秒ごと、最大3秒のジッターを加えて確認します。失敗が続くソースはそれより間隔があきます。連続して失敗するたびに待ち時間が倍になり、30秒、60秒、そして上限の2分です。 |
| 行の有効期間 | 150秒です。expiresAtはobservedAtに150秒を加えた値です。 |
| 障害 | プローブが3回連続で失敗するとunavailableです。最初の2回はunknownです。 |
| 遅れの許容範囲 | indexerとsubsquidは、遅れが10ブロックと約2分相当のブロック数のうち大きいほう以下であればcurrentです。 |
| 機能低下 | 2回連続の評価で、遅れが30分以上の場合です。 |
| PPOIの遅れ | ノードの検証済みインデックスが、そのノード自身の現在のインデックスより45秒間連続して遅れている場合です。 |
| 参照先のhead | 参照に使うチェーンのheadは60秒以内のものでなければならず、そうでなければその行はunknownで、理由はincompatible-referenceになります。 |
サービスとチェーン
| サービス | Anonが確認する内容 | position |
head |
|---|---|---|---|
ppoi |
設定済みのPPOIノードが、そのネットワークに必要なリストを持っている必要があります。検証済みのTXIDインデックスを、同じノードの現在のインデックスと比較します。 | 検証済みTXIDインデックス | ノードの現在のTXIDインデックス |
indexer |
Anon独自のインデクサーが最後に処理したブロックを、チェーンのheadからインデクサーの承認の深さを引いた値と比較します。 | 最後に処理したブロック | 承認の深さを引いた参照先のhead |
subsquid |
設定済みのSubsquidデプロイのインデックス済み高さを、チェーンのheadからそのsquid自身の承認の深さを引いた値と比較します。 | インデックス済みの高さ | 承認の深さを引いた参照先のhead |
broadcasters |
チェーンごとに、限られた数のブロードキャスターのうち何件が応答するかを確認します。2026-10-04から監視しています。 | — | — |
waku |
Anonが監視するWaku接続の共有チェックが1つあります。2026-10-04から監視しています。 | — | — |
- チェーン。 監視対象のメインネットは、Ethereum(
1)、Arbitrum(42161)、Polygon(137)、BNB Chain(56)です。Sepolia(11155111)はテストネットワークで、メインネットの集計には含まれず、Subsquidのデプロイもないため、そのsubsquidの行は監視対象外です。予告なくチェーンが追加されることがあります。 - Wakuとブロードキャスター。 両方とも2026-10-04から監視されており、実際のステータスを報告します。理由は
respondingまたはpartial-coverageで、指標はpeers、responding、monitoredです。新しいreasonの値やmetricsのキーが今後も付くことがあります。その場合はベータ版についてのとおりに扱ってください。 - 参照先のhead。 チェーンのheadは公開RPCエンドポイントから取得します。それ自体の行はありません。
- 運用主体。 PPOIノードとSubsquidのデプロイはAnonが運用していません。そこでの障害は、設定済みのデプロイに対するAnonの読み取り結果として現れます。
各サービスそのものについては、PPOI プロキシ、ブロードキャスターネットワーク、ウォレットの同期を参照してください。
鮮度とキャッシュ
モニターは、応答する各ソースをおよそ30秒ごとに再確認し、スナップショットを保存します。すべてのリクエストは、メモリ上のこのスナップショットから応答します。レスポンスには次が含まれます。
Cache-Control: public, max-age=15, s-maxage=30, stale-while-revalidate=30, stale-if-error=300
| ディレクティブ | 効果 |
|---|---|
max-age=15 |
ブラウザは自身のコピーを15秒間再利用します。 |
s-maxage=30 |
CDNなどの共有キャッシュは、自分のコピーを30秒間再利用します。再確認1回分です。 |
stale-while-revalidate=30 |
キャッシュは、その後さらに最大30秒間、新しいコピーを取得しながら古いコピーを返せます。 |
stale-if-error=300 |
オリジンがエラーを返した場合、キャッシュはコピーを最大5分間返し続けられます。 |
行はどのくらい古くなり得るか。 応答するソースの場合、オリジンでは、行は最大で約44秒古くなります。30秒の周期、3秒のジッター、最大10秒かかるプローブ、公開にかかる1秒の合計です。キャッシュはさらに最大60秒を加えます(s-maxageの30秒とstale-while-revalidateの30秒)。したがって、正常な行は観測から最大で約104秒後に届き、150秒の有効期間内に収まるため、届いた時点ですでに期限切れになっているはずはありません。
失敗が続くソースは、再確認の間隔があきます。 連続して失敗するたびに、モニターはそのソースを再び試すまでの待ち時間を倍にします。30秒、60秒、そして上限の2分です。ジッターと最大10秒かかるプローブを加えると、停止しているソースの行は、オリジンでは最大で約133秒、キャッシュから届く時点では最大で約193秒古くなります。これは150秒の有効期間を超えるため、unavailableの行は、届いた時点ですでに期限切れのことがあります。その場合はunavailableではなく期限切れとして表示されます。期限切れの行は「最近の読み取りなし」として扱い、決して正常として扱わないでください。停止しているサービスは、まさにそのように見えることがあります。
鮮度は、HTTPではなく各行に属します。 行のexpiresAtが自分の時計の現在時刻と同じかそれより前の場合、またはobservedAtから5分以上たっている場合は、statusが何であっても期限切れとして扱ってください。ステータスに必要なタイムスタンプがない、または読み取れない場合、observedAtが現在より約30秒を超えて未来の場合、expiresAtがobservedAtより後でない場合は、その行をunknownとして扱ってください。200、304、キャッシュヒットのいずれも、行を更新しません。
モニターが止まった場合。 モニターが稼働している間は、すべてのプローブが停止していても、generatedAtは少なくとも30秒ごとに進みます。モニターが止まると、保存済みのレポートはそのまま残り、各行はexpiresAtによって期限切れになります。stale-if-errorで返されたコピーでも同じです。どちらも期限切れに見え、正常に見えることはありません。
ETagと304。 ETagは強い検証子で、本文から得た、引用符で囲まれた16文字のハッシュです。モニターはプローブが完了するたびに、そして少なくとも30秒ごとに公開し、generatedAtが本文に含まれるため、ETagも少なくともその頻度で変わります。If-None-Matchは弱い比較で判定され、W/接頭辞は無視され、*はすべてに一致します。304にはETag、Cache-Control、CORSのヘッダーが付き、本文はありません。
HTTPステータスコードとエラー
| ステータス | 発生条件 | 備考 |
|---|---|---|
200 |
スナップショットです。 | サービスが不調のときも同じです。200はレポートを読めるという意味であり、サービスが正常という意味ではありません。 |
304 |
If-None-Matchが一致しました。 |
本文はありません。 |
204 |
OPTIONSのプリフライトです。 |
CORSを参照してください。 |
405 |
それ以外のメソッドです。 | Allow: GET, HEAD, OPTIONS。キャッシュされません。 |
503 |
応答したサーバーがまだ最初のスナップショットを読み込んでいません。 | 短時間で解消し、たとえばデプロイ直後に発生します。キャッシュされません。バックオフを入れて再試行してください。 |
404 |
それ以外のパスです。 | ゲートウェイが応答します。 |
429 |
公正な利用のレート制限を超えています。このパスへのリクエストが1 IPあたり毎分120件を超えた場合です。 | APIではなくCDN(Cloudflareのエラー1015)から返ります。約60秒間続き、Retry-Afterは約60です。キャッシュヒットも数えられます。 |
このルートでは、エラーは{"error": "<message>"}の形式で、Content-Type: application/json; charset=utf-8とCache-Control: no-storeが付きます。
{"error":"liveness report unavailable"}
HTTPステータスコードで分岐し、メッセージの文言では分岐しないでください。ゲートウェイの404({"message":"Not Found"})とCDNの429は、別の本文を使います。429はCloudflareのtext/plainページです。
ブラウザーでは、429は読み取れません。 CDNの429ページにはAccess-Control-Allow-Originが付かないため、ブラウザーはこれをブロックし、fetchは他のネットワークエラーやCORSエラーと同じくTypeErrorで拒否されます。コードからステータスやRetry-Afterは見えません。ネットワーク障害は429や503と同じように扱ってください。バックオフし、最後に取得できた正常なレポートを保持し、その各行はexpiresAtで期限切れになるに任せます。
最初のスナップショットを読み込んだ後は、障害が起きても503にはなりません。サーバーは最後のスナップショットを返し続け、その各行はexpiresAtによって期限切れになります。
CORS
レポートは公開されており、呼び出し元ごとの内容を含まないため、すべてのレスポンスですべてのオリジンを許可します。
| ヘッダー | 値 |
|---|---|
Access-Control-Allow-Origin |
* |
Access-Control-Expose-Headers |
ETag |
これは、リクエストのOriginに関係なく、すべての応答(200、304、204、405、503)で送信されます。Access-Control-Allow-Credentialsはありません。応答はVary: Originを送りませんが、CDNはOriginリクエストヘッダーの値ごとに別々のキャッシュコピーを保持するため、新しいオリジンからの最初のリクエストはキャッシュのMISSになることがあります。クエリ文字列は無視されるので、?x=が付いたリクエストでも同じコピーが使われます。
プリフライト(OPTIONS)には204で応答し、次のヘッダーが付きます。
| ヘッダー | 値 |
|---|---|
Access-Control-Allow-Methods |
GET, HEAD, OPTIONS |
Access-Control-Allow-Headers |
Accept, Content-Type, If-None-Match |
Access-Control-Max-Age |
86400 |
Acceptヘッダー付きの通常のfetchは単純リクエストなので、プリフライトは不要です。If-None-Matchを自分で設定するスクリプトにはプリフライトが必要で、そのヘッダーは許可されています。
公正な利用
- キーもSLAもありません。ベータ版のベストエフォートの公開フィードです。
Cache-Controlに従い、ETagとIf-None-Matchを使って、変更のないレポートが304で済むようにしてください。- 15〜30秒より短い間隔でポーリングしないでください。データはおよそ30秒ごとに変わるため、それより速く取得してもキャッシュ済みのコピーが返るだけです。
- ウォレットは、タイマーで取得するのではなく、ユーザーがこれに依存する画面を開いたときに取得してください。
- ポーリングするサーバーは、自分が誰であるかを示す説明的な
User-Agentを送ってください。例:my-wallet/1.4 (+https://example.com/contact)。 - このパスへのリクエストが1 IPあたり毎分120件を超えると、レート制限され、約60秒間
429が返ります。キャッシュヒットも数えられます。429や5xxが返ったらバックオフしてください。 - ブラウザーでは、
429は読み取れるレスポンスではなく、CORSエラーまたはネットワークエラーとして現れます。ネットワーク障害は429や503と同じように扱ってください。バックオフし、最後に取得できた正常なレポートを保持し、その各行はexpiresAtで期限切れになるに任せます(HTTPステータスコードとエラーを参照)。
ベータ版について
このAPIはベータ版で、Anonは現時点で安定性についての約束をしていません。
- 予告なく変わることがあります。 フィールド、列挙値、レスポンスの形は、予告期間なしに追加、名前変更、型変更、削除されることがあります。Anonは、非推奨化や提供終了の手続き、また
DeprecationヘッダーやSunsetヘッダーを約束しません。 schemaVersionは変わることがあります。/api/v1はゲートウェイのデプロイ全体のルートバージョンであり、このエンドポイントのバージョンではありません。このエンドポイント自体のschemaVersionは本文にあり、現在は1ですが、これも変わることがあります。JSON Schemaは寛容に作られており、現時点のレスポンスを記述するもので、約束ではありません。- ホストは当面
api.anon.incです。 将来api.railscan.ioのようなエイリアスが加わるかもしれませんが、時期は約束しません。 - 変更履歴。 変更は、可能な範囲で下の変更履歴に記録します。
変更があっても動き続けるクライアントの作り方:
- 未知のフィールドは無視する。 レポート、各チェック、
metricsのあらゆる階層で、未知のオブジェクトフィールドを無視してください。 - 閉じた集合に頼らない。 認識できない
statusは、その行に限ってunknownとして扱ってください。認識できないreasonは「詳細なし」として扱い、statusを基準に動いてください。使わないserviceやchainIdの行は無視し、知らないmetricsのキーも無視してください。 - 失敗するのは1行だけにする。 読めない行が1つあっても、他のすべての行を空にしないでください。
schemaVersionを確認する。 知らない値であれば、形が変わっている可能性があります。推測せず、更新するまでレポートを読めないものとして扱ってください。
現時点で成り立っていること。これはエンドポイントの現在の挙動なので、正しく扱ってください。ただし約束ではありません。
- 指標。 すべてのチェックには
metricsオブジェクトがあり、不明な指標のキーは省略されます。監視対象外の行はmetrics: {}です。存在しない指標を0として読まないでください。 - スコープごとに1行。 サービスと
chainIdの組み合わせは最大1回しか現れません。wakuは唯一の共有行で、chainId: nullです。行をむやみに合算しないでください。メインネットに含めるかどうかは、自分で決めたチェーンの許可リストで判断してください。Sepolia(11155111)はメインネットの集計に含まれません。 - 鮮度は行ごと。 鮮度とキャッシュのルールを使ってください。現時点で
expiresAtがnullになるのは、unknownとunmonitoredの行だけです。 - 数値。
positionがheadを超えることがあるため、遅れは0以上に丸めてください。respondingがmonitoredを超えることはありません。すべての指標は非負の安全な整数です。
わからないこと
- Railgunの公式ステータスではありません。 Anonのモニターが、Anonのインフラから、Anonが使うよう設定されたサービスを読み取った結果です。これらのサービスについて、利用者から見える状況は異なる場合があります。
- 「安全に取引できる」ことを示すシグナルではありません。
ppoiがcurrentであっても、特定のシールドが使える、あるいは特定の証明が有効だという意味ではありません。設定済みのPPOIノードが自身の現在のインデックスまで検証済みだという意味です。個々のウォレットのPPOI有効性、コンプライアンス、使用可能な残高については何も示しません。 - ブロードキャスターの行が機能低下なのは、部分的な読み取りだというだけです。 監視対象のブロードキャスターの一部が応答しなかったという意味です。ほかのブロードキャスターや配信方法は引き続き使える可能性があります。その方法とプライバシー上の限界は、ブロードキャスターネットワークで確認してください。
- Wakuのピア数は配信を意味しません。
peersは、Anonが監視する接続の接続数を数えたものです。メッセージがブロードキャスターに届いて戻ってくることを示すものではありません。 - インデクサーとSubsquidの行は、ウォレット自体の同期ではありません。 これらのサービスがそれぞれのチェーンに追いついているかを示すだけです。ウォレット自体の同期は別です。ウォレットの同期を参照してください。
履歴
GET https://api.anon.inc/api/v1/railgun/liveness/historyは、直近14日分の同じ行を5分バケットで返し、24時間・7日・14日の稼働率も付けます。独自のキャッシュを持つ別のエンドポイントで、チャートやステータスページ向けです。稼働状況履歴APIを参照してください。今この瞬間の状況を知るには、引き続きこのエンドポイントを使ってください。
プライバシー
このエンドポイントへのリクエストには、ウォレットに関する情報は含まれません。アドレスもアカウントもありません。それでも、Anonとその前段のCDNは、ほかのHTTPSリクエストと同じように、IPアドレスとUser-Agentを確認できます。タイマーでポーリングするウォレットは、そのIPがRailgunに関心を持っていることを30秒間隔で示すことになります。それが気になる場合は、必要なときだけポーリングするか、自分のサーバーでレポートを取得し、そのキャッシュからユーザーに提供してください。
変更履歴
2026-10-04
Wakuとブロードキャスターが監視対象になり、その行はunmonitoredではなく実際のステータスを報告するようになりました。レート制限が適用されます。このパスへのリクエストが1 IPあたり毎分120件を超えると、約60秒間429が返ります。
バージョン1(ベータ版)
初回リリースです(ベータ版で、安定性の約束はありません)。schemaVersion 1。サービスはppoi、indexer、subsquid、broadcasters、wakuで、Ethereum、Arbitrum、Polygon、BNB Chain、Sepoliaを対象とします。Wakuとブロードキャスターは掲載されていますが、リリース時点では監視対象外でした。各チェックの有効期間は150秒で、モニターは応答するソースをおよそ30秒ごと(失敗が続くソースはそれより間隔があき)に再確認し、レスポンスは共有キャッシュで30秒間キャッシュできます。