From a2aca9e3a945ccb6aaf3e8ddaf6ff60018c319da Mon Sep 17 00:00:00 2001 From: Flotapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:33:15 +0200 Subject: [PATCH] feat(rpc): promote per-chain RPC pages to first-class benches (044-053) (#864) Co-authored-by: Florent Tapponnier --- benchmarks/arbitrum-rpc.yml | 251 +++++++++++++++++++++ benchmarks/avalanche-rpc.yml | 204 +++++++++++++++++ benchmarks/base-rpc.yml | 204 +++++++++++++++++ benchmarks/bnb-rpc.yml | 181 +++++++++++++++ benchmarks/ethereum-rpc.yml | 274 ++++++++++++++++++++++ benchmarks/linea-rpc.yml | 158 +++++++++++++ benchmarks/mantle-rpc.yml | 158 +++++++++++++ benchmarks/optimism-rpc.yml | 204 +++++++++++++++++ benchmarks/polygon-rpc.yml | 181 +++++++++++++++ benchmarks/rpc-capabilities.yml | 46 ---- benchmarks/scroll-rpc.yml | 158 +++++++++++++ next.config.ts | 24 ++ scripts/generate-rpc-chain-benches.py | 312 ++++++++++++++++++++++++++ 13 files changed, 2309 insertions(+), 46 deletions(-) create mode 100644 benchmarks/arbitrum-rpc.yml create mode 100644 benchmarks/avalanche-rpc.yml create mode 100644 benchmarks/base-rpc.yml create mode 100644 benchmarks/bnb-rpc.yml create mode 100644 benchmarks/ethereum-rpc.yml create mode 100644 benchmarks/linea-rpc.yml create mode 100644 benchmarks/mantle-rpc.yml create mode 100644 benchmarks/optimism-rpc.yml create mode 100644 benchmarks/polygon-rpc.yml create mode 100644 benchmarks/scroll-rpc.yml create mode 100644 scripts/generate-rpc-chain-benches.py diff --git a/benchmarks/arbitrum-rpc.yml b/benchmarks/arbitrum-rpc.yml new file mode 100644 index 00000000..c7cb15f7 --- /dev/null +++ b/benchmarks/arbitrum-rpc.yml @@ -0,0 +1,251 @@ +# OpenChainBench. Bench № 045 + +slug: arbitrum-rpc +number: "045" +title: Fastest free Arbitrum RPC, live no-key endpoint latency +seo_title: "Fastest free Arbitrum RPC 2026" +seo_description: "{{best_name}} leads free Arbitrum RPC at {{best_p50}} (eth_blockNumber p50, 24h). 8 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Arbitrum RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Arbitrum is the second-largest cohort in the cluster: 8 no-key providers including the Arbitrum Foundation's own `arb1.arbitrum.io/rpc`, and one of the few chains where Lava and MeowRPC still compete on a free tier. Foundation endpoints are documented best-effort, and our data shows what that means in practice: a respectable median with a p99 roughly ten times worse. Every provider answers the identical `eth_blockNumber` probe every 15 seconds from us-east, eu-west and Singapore. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Arbitrum endpoint that sustains continuous probing, 8 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Arbitrum-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"arbitrum\". Provider coverage: 8 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly, Nodies, Lava, MeowRPC, Arbitrum). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Arbitrum RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 8 measured providers." + - "The Arbitrum Foundation endpoint is the textbook best-effort profile: usable median, heavy tail. Its p99 routinely runs ~10x its p50, which matters if your product retries on timeout." + - "Arbitrum is one of only two chains (with Ethereum) where {{name:lava}} and {{name:meowrpc}} qualify no-key, both providers key-gate or skip most other chains." + - "{{name:drpc}} at {{p50:drpc}} and {{name:publicnode}} at {{p50:publicnode}} anchor the multi-chain gateway tier; regional splits between them flip depending on probe origin." + +faq: + - q: "What is the fastest free Arbitrum RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 8 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Arbitrum RPCs work without an API key?" + a: "The 8 providers on this page: PublicNode, dRPC, 1RPC, Tenderly, Nodies, Lava, MeowRPC, Arbitrum. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Arbitrum RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Arbitrum RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Should I use the official Arbitrum Foundation RPC in production?" + a: "The Foundation documents `arb1.arbitrum.io/rpc` as best-effort and rate-limited, intended for development. Our continuous measurement confirms the profile: acceptable p50 with a p99 tail several times worse than the leading gateways. For read-heavy production paths a gateway with a tighter distribution is the safer default; keep the official endpoint as a fallback rather than a primary." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="arbitrum"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="arbitrum", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="arbitrum", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="arbitrum", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="arbitrum", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="arbitrum", region="sgp"}[1h]) + + - slug: lava + name: Lava + tag: Decentralized permissionless RPC mesh (ETH + Arbitrum no-key) + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Lava's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="lava", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="lava", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="lava", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="lava", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="lava", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="lava", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="lava", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="arbitrum", region="sgp"}[1h]) + + - slug: meowrpc + name: MeowRPC + tag: Free public RPC, no registration + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to MeowRPC's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="meowrpc", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="meowrpc", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="meowrpc", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="meowrpc", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="meowrpc", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="meowrpc", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="arbitrum", region="sgp"}[1h]) + + - slug: arbitrum-official + name: Arbitrum + tag: Arbitrum Foundation public RPC, Arbitrum One only + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Arbitrum's no-key Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="arbitrum-official", chain="arbitrum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="arbitrum-official", chain="arbitrum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="arbitrum-official", chain="arbitrum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="arbitrum-official", chain="arbitrum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="arbitrum-official", chain="arbitrum"}) / sum(ocb:rpc_call:rate_24h{provider="arbitrum-official", chain="arbitrum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="arbitrum-official", chain="arbitrum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="arbitrum-official", chain="arbitrum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="arbitrum-official", chain="arbitrum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="arbitrum-official", chain="arbitrum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="arbitrum-official", chain="arbitrum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="arbitrum-official", chain="arbitrum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="arbitrum-official", chain="arbitrum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="arbitrum-official", chain="arbitrum", region="sgp"}[1h]) + diff --git a/benchmarks/avalanche-rpc.yml b/benchmarks/avalanche-rpc.yml new file mode 100644 index 00000000..19c24ba5 --- /dev/null +++ b/benchmarks/avalanche-rpc.yml @@ -0,0 +1,204 @@ +# OpenChainBench. Bench № 048 + +slug: avalanche-rpc +number: "048" +title: Fastest free Avalanche RPC, live no-key endpoint latency +seo_title: "Fastest free Avalanche RPC 2026" +seo_description: "{{best_name}} leads free Avalanche RPC at {{best_p50}} (eth_blockNumber p50, 24h). 6 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Avalanche RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Avalanche's C-Chain field combines Ava Labs' official `api.avax.network` with 5 no-key multi-chain gateways. The official endpoint shows one of the tightest distributions among foundation RPCs, a contrast with the best-effort profiles on Arbitrum and Optimism. Every provider answers the identical probe every 15 seconds from us-east, eu-west and Singapore, with stale-head detection flagging anything more than 20 blocks behind the cross-provider tip. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Avalanche endpoint that sustains continuous probing, 6 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Avalanche-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"avalanche\". Provider coverage: 6 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly, Nodies, Avalanche). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Avalanche RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers." + - "Unlike the Arbitrum and Optimism foundation endpoints, `api.avax.network` keeps a tight p50-to-p99 ratio, an official endpoint that behaves like managed infrastructure rather than a best-effort courtesy." + - "{{name:publicnode}} ({{p50:publicnode}}) and {{name:drpc}} ({{p50:drpc}}) give the C-Chain the same reliable gateway floor they provide on every EVM chain we measure." + +faq: + - q: "What is the fastest free Avalanche RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 6 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Avalanche RPCs work without an API key?" + a: "The 6 providers on this page: PublicNode, dRPC, 1RPC, Tenderly, Nodies, Avalanche. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Avalanche RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Avalanche RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Is the official Avalanche RPC good enough for production reads?" + a: "Among chain-official endpoints it is one of the strongest we measure: tight latency distribution and a high success rate rather than the best-effort tail seen on some other foundation RPCs. The usual free-tier caveats still apply (shared rate limits, no SLA), but as a read path it holds up unusually well against the commercial gateways." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="avalanche"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="avalanche", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="avalanche", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="avalanche", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="avalanche", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="avalanche", region="sgp"}[1h]) + + - slug: avalanche-official + name: Avalanche + tag: Ava Labs C-Chain public RPC, Avalanche C-Chain only + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Avalanche's no-key Avalanche endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="avalanche-official", chain="avalanche"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="avalanche-official", chain="avalanche"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="avalanche-official", chain="avalanche"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="avalanche-official", chain="avalanche"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="avalanche-official", chain="avalanche"}) / sum(ocb:rpc_call:rate_24h{provider="avalanche-official", chain="avalanche"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="avalanche-official", chain="avalanche"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="avalanche-official", chain="avalanche"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="avalanche-official", chain="avalanche", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="avalanche-official", chain="avalanche", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="avalanche-official", chain="avalanche", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="avalanche-official", chain="avalanche", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="avalanche-official", chain="avalanche", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="avalanche-official", chain="avalanche", region="sgp"}[1h]) + diff --git a/benchmarks/base-rpc.yml b/benchmarks/base-rpc.yml new file mode 100644 index 00000000..fc4c1a88 --- /dev/null +++ b/benchmarks/base-rpc.yml @@ -0,0 +1,204 @@ +# OpenChainBench. Bench № 046 + +slug: base-rpc +number: "046" +title: Fastest free Base RPC, live no-key endpoint latency +seo_title: "Fastest free Base RPC 2026" +seo_description: "{{best_name}} leads free Base RPC at {{best_p50}} (eth_blockNumber p50, 24h). 6 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Base RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Base offers the cleanest official-versus-gateway comparison in the cluster: Coinbase operates both the sequencer and the chain-official `mainnet.base.org`, so the house endpoint has every locational advantage, and it still has to beat PublicNode, dRPC, Tenderly, Nodies and Merkle on a level probe. 6 providers, the same `eth_blockNumber` call every 15 seconds, three regions, stale-head detection against the cross-provider tip. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Base endpoint that sustains continuous probing, 6 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Base-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"base\". Provider coverage: 6 no-key endpoints (PublicNode, dRPC, Tenderly, Nodies, Merkle, Base). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Base RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers." + - "Base is one of only two chains where {{name:merkle}} qualifies no-key (with BNB); its distribution is among the tightest in the whole cluster, p99 barely above p50." + - "The official `mainnet.base.org` and the multi-chain gateways trade the lead depending on region, a reminder that \"fastest\" is a per-origin question, not a global one." + +faq: + - q: "What is the fastest free Base RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 6 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Base RPCs work without an API key?" + a: "The 6 providers on this page: PublicNode, dRPC, Tenderly, Nodies, Merkle, Base. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Base RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Base RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Is Coinbase's official Base RPC faster than third-party gateways?" + a: "Not consistently. Despite being operated by the same team that runs the sequencer, `mainnet.base.org` trades the lead with PublicNode, dRPC and Tenderly depending on which region the request originates from. Check the region tabs on this page for the origin closest to your deployment; the cross-region average hides these flips." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="base"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="base", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="base", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="base", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="base", region="sgp"}[1h]) + + - slug: merkle + name: Merkle + tag: Base + BSC public no-key gateway (Ethereum hit by Cloudflare 20-min lockout, excluded) + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Merkle's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="merkle", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="merkle", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="merkle", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="merkle", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="merkle", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="merkle", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="base", region="sgp"}[1h]) + + - slug: base-official + name: Base + tag: Coinbase-operated, Base mainnet RPC + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Base's no-key Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="base-official", chain="base"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="base-official", chain="base"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="base-official", chain="base"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="base-official", chain="base"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="base-official", chain="base"}) / sum(ocb:rpc_call:rate_24h{provider="base-official", chain="base"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="base-official", chain="base"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="base-official", chain="base"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="base-official", chain="base", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="base-official", chain="base", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="base-official", chain="base", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="base-official", chain="base", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="base-official", chain="base", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="base-official", chain="base", region="sgp"}[1h]) + diff --git a/benchmarks/bnb-rpc.yml b/benchmarks/bnb-rpc.yml new file mode 100644 index 00000000..7a12f651 --- /dev/null +++ b/benchmarks/bnb-rpc.yml @@ -0,0 +1,181 @@ +# OpenChainBench. Bench № 049 + +slug: bnb-rpc +number: "049" +title: Fastest free BNB Chain RPC, live no-key endpoint latency +seo_title: "Fastest free BNB Chain RPC 2026" +seo_description: "{{best_name}} leads free BNB Chain RPC at {{best_p50}} (eth_blockNumber p50, 24h). 5 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public BNB Chain RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + BNB Chain is the incumbent's chain: Binance's `bsc-dataseed1.binance.org` has been the copy-paste default since 2020, and from some regions it is still the single fastest RPC response we measure anywhere in the cluster. The catch is that it serves exactly one chain, while PublicNode, dRPC, Nodies and Merkle bring multi-chain coverage with increasingly competitive latency from EU origins. 5 providers, identical probes, three regions. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public BNB Chain endpoint that sustains continuous probing, 5 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the BNB Chain-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"bnb\". Provider coverage: 5 no-key endpoints (PublicNode, dRPC, Nodies, Merkle, Binance). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free BNB Chain RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 5 measured providers." + - "Binance's dataseed is a single-chain specialist: blisteringly fast near its home regions (single-digit milliseconds from us-east at times) and 10x slower from Singapore, the widest regional spread in the cluster." + - "{{name:merkle}} qualifies here (BNB is one of its two stable no-key chains) and brings its signature tight distribution to a field otherwise dominated by the dataseed's regional extremes." + +faq: + - q: "What is the fastest free BNB Chain RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 5 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which BNB Chain RPCs work without an API key?" + a: "The 5 providers on this page: PublicNode, dRPC, Nodies, Merkle, Binance. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest BNB Chain RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is BNB Chain RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Is bsc-dataseed still the best RPC for BNB Chain?" + a: "It depends entirely on where your requests originate. From regions near Binance's infrastructure the dataseed is often the fastest single response in our whole dataset; from Singapore it can be 10x slower than the gateway tier. Check the region tabs above, the cross-region average is meaningless for an endpoint with this much geographic variance." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="bnb"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bnb", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="bnb", region="sgp"}[1h]) + + - slug: merkle + name: Merkle + tag: Base + BSC public no-key gateway (Ethereum hit by Cloudflare 20-min lockout, excluded) + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Merkle's no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="merkle", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="merkle", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="merkle", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="merkle", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="merkle", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="merkle", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="merkle", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="merkle", chain="bnb", region="sgp"}[1h]) + + - slug: binance + name: Binance + tag: BNB Chain dataseed RPC, Binance-operated + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Binance's no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="binance", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="binance", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="binance", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="binance", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="binance", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="binance", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="binance", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="binance", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="binance", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="binance", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="binance", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="binance", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="binance", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="binance", chain="bnb", region="sgp"}[1h]) + diff --git a/benchmarks/ethereum-rpc.yml b/benchmarks/ethereum-rpc.yml new file mode 100644 index 00000000..168e280d --- /dev/null +++ b/benchmarks/ethereum-rpc.yml @@ -0,0 +1,274 @@ +# OpenChainBench. Bench № 044 + +slug: ethereum-rpc +number: "044" +title: Fastest free Ethereum RPC, live no-key endpoint latency +seo_title: "Fastest free Ethereum RPC 2026" +seo_description: "{{best_name}} leads free Ethereum RPC at {{best_p50}} (eth_blockNumber p50, 24h). 9 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Ethereum RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Ethereum carries the largest free-RPC cohort we measure: 9 no-key providers answering the same `eth_blockNumber` probe every 15 seconds from three regions. It is also the chain where reliability analysis earns its keep. Cloudflare-eth answers HTTP 200 in well under a second while an increasing share of calls resolve to a JSON-RPC error body (`-32046 Cannot fulfill request`), and Merkle is excluded outright after recurring Cloudflare lockouts that froze our probes for 20 minutes after a single request. If you paste a free RPC URL into an Ethereum dapp, this page is the live answer to which one deserves it. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Ethereum endpoint that sustains continuous probing, 9 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Ethereum-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"ethereum\". Provider coverage: 9 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly, Nodies, Lava, MeowRPC, Flashbots, Cloudflare). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads the free Ethereum RPC field at {{best_p50}} (`eth_blockNumber` p50, 24h) across 9 measured providers, the largest cohort of any chain in the cluster." + - "Cloudflare-eth is the resident cautionary tale: sub-second HTTP 200s that increasingly carry a JSON-RPC error instead of a block number. The success-rate column, not the latency column, tells the real story." + - "The p50-to-p99 spread separates the tiers. {{name:1rpc}} sits at {{p50:1rpc}} median but its p99 regularly runs an order of magnitude higher, while {{name:drpc}} ({{p50:drpc}}) keeps a much tighter distribution." + - "Merkle is excluded on Ethereum by design: its endpoint sits behind an aggressive bot filter that locks out programmatic clients for ~20 minutes after one request, invisible on any status page." + +faq: + - q: "What is the fastest free Ethereum RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 9 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Ethereum RPCs work without an API key?" + a: "The 9 providers on this page: PublicNode, dRPC, 1RPC, Tenderly, Nodies, Lava, MeowRPC, Flashbots, Cloudflare. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Ethereum RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Ethereum RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Why is Cloudflare's Ethereum RPC marked unreliable here?" + a: "Cloudflare's public Ethereum gateway switched to a permissioned mode for many JSON-RPC methods. The endpoint still responds fast with HTTP 200, but the body is increasingly a JSON-RPC error (`-32046`) rather than a usable result. We classify a call as `ok` only when the HTTP status is 200 AND the body carries a usable `result` field, so Cloudflare's real success rate is visible in the reliability column instead of hiding behind fast error responses." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="ethereum"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="ethereum", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="ethereum", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="ethereum", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="ethereum", region="sgp"}[1h]) + + - slug: lava + name: Lava + tag: Decentralized permissionless RPC mesh (ETH + Arbitrum no-key) + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Lava's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="lava", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="lava", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="lava", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="lava", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="lava", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="lava", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="lava", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lava", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lava", chain="ethereum", region="sgp"}[1h]) + + - slug: meowrpc + name: MeowRPC + tag: Free public RPC, no registration + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to MeowRPC's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="meowrpc", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="meowrpc", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="meowrpc", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="meowrpc", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="meowrpc", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="meowrpc", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="meowrpc", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="meowrpc", chain="ethereum", region="sgp"}[1h]) + + - slug: flashbots + name: Flashbots + tag: Private-mempool RPC, anti-sandwich + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Flashbots's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="flashbots", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="flashbots", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="flashbots", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="flashbots", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="flashbots", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="flashbots", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="flashbots", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="flashbots", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="flashbots", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="flashbots", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="flashbots", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="flashbots", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="flashbots", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="flashbots", chain="ethereum", region="sgp"}[1h]) + + - slug: cloudflare + name: Cloudflare + tag: Permissioned-mode for many JSON-RPC methods + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Cloudflare's no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="cloudflare", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="cloudflare", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="cloudflare", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="cloudflare", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="cloudflare", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="cloudflare", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="cloudflare", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="cloudflare", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="cloudflare", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="cloudflare", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="cloudflare", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="cloudflare", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="cloudflare", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="cloudflare", chain="ethereum", region="sgp"}[1h]) + diff --git a/benchmarks/linea-rpc.yml b/benchmarks/linea-rpc.yml new file mode 100644 index 00000000..760dfd7e --- /dev/null +++ b/benchmarks/linea-rpc.yml @@ -0,0 +1,158 @@ +# OpenChainBench. Bench № 051 + +slug: linea-rpc +number: "051" +title: Fastest free Linea RPC, live no-key endpoint latency +seo_title: "Fastest free Linea RPC 2026" +seo_description: "{{best_name}} leads free Linea RPC at {{best_p50}} (eth_blockNumber p50, 24h). 4 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Linea RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + The no-key field thins out on Linea: 4 providers qualify (PublicNode, dRPC, 1RPC, Tenderly), all multi-chain gateways. Thinner competition makes the reliability columns matter more than raw speed, a fast endpoint with a high stale or timeout rate is a worse default than a slightly slower consistent one. Probes run every 15 seconds from us-east, eu-west and Singapore with full response classification. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Linea endpoint that sustains continuous probing, 4 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Linea-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"linea\". Provider coverage: 4 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Linea RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers." + - "With only 4 qualifying providers, a single gateway having a bad day reshuffles the whole board; the success-rate column is the tiebreaker the median doesn't show." + - "{{name:tenderly}} covers Linea in its 9-chain public gateway, one of the few non-major chains where its no-key tier reaches." + +faq: + - q: "What is the fastest free Linea RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 4 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Linea RPCs work without an API key?" + a: "The 4 providers on this page: PublicNode, dRPC, 1RPC, Tenderly. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Linea RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Linea RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Why do so few free RPCs support Linea?" + a: "Free-tier coverage follows demand: gateways add no-key chains when traffic justifies the infrastructure. Linea's cohort (4 providers) is typical of newer L2s, compare with 9 on Ethereum and 8 on Arbitrum. The flip side is that the providers that do qualify are the disciplined multi-chain operators, so the reliability floor is high even where the field is thin." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="linea"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Linea endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="linea"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="linea"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="linea"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="linea"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="linea"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="linea"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="linea"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="linea"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="linea", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="linea", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="linea", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="linea", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="linea", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="linea", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Linea endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="linea"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="linea"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="linea"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="linea"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="linea"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="linea"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="linea"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="linea"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="linea", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="linea", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="linea", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="linea", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="linea", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="linea", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Linea endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="linea"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="linea"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="linea"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="linea"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="linea"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="linea"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="linea"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="linea"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="linea", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="linea", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="linea", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="linea", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="linea", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="linea", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Linea endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="linea"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="linea"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="linea"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="linea"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="linea"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="linea"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="linea"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="linea"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="linea", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="linea", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="linea", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="linea", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="linea", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="linea", region="sgp"}[1h]) + diff --git a/benchmarks/mantle-rpc.yml b/benchmarks/mantle-rpc.yml new file mode 100644 index 00000000..236139f0 --- /dev/null +++ b/benchmarks/mantle-rpc.yml @@ -0,0 +1,158 @@ +# OpenChainBench. Bench № 053 + +slug: mantle-rpc +number: "053" +title: Fastest free Mantle RPC, live no-key endpoint latency +seo_title: "Fastest free Mantle RPC 2026" +seo_description: "{{best_name}} leads free Mantle RPC at {{best_p50}} (eth_blockNumber p50, 24h). 4 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Mantle RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Mantle rounds out the cluster's long tail with 4 qualifying no-key providers, all multi-chain gateways (PublicNode, dRPC, 1RPC, Tenderly). Like every chain in the family, the number that matters is a sustained median, the same `eth_blockNumber` call every 15 seconds from three regions over a rolling 24 hours, not a one-off marketing burst, and archive-depth support is audited separately every 5 minutes. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Mantle endpoint that sustains continuous probing, 4 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Mantle-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"mantle\". Provider coverage: 4 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Mantle RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers." + - "Mantle's field mirrors Linea and Scroll: the disciplined multi-chain gateways and nobody else, so the leaderboard is a pure read on how each gateway's infrastructure reaches the chain." + - "Thin cohorts amplify tail events, one regional incident at one gateway visibly moves the 24h aggregate, which is exactly why the page shows per-region breakdowns instead of only the average." + +faq: + - q: "What is the fastest free Mantle RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 4 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Mantle RPCs work without an API key?" + a: "The 4 providers on this page: PublicNode, dRPC, 1RPC, Tenderly. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Mantle RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Mantle RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Are free Mantle RPCs reliable enough to build on?" + a: "The four qualifying gateways all maintain high measured success rates on Mantle, but a 4-provider field means less redundancy if one degrades. Use the current leader as primary and the runner-up as fallback, and re-check this page after incidents, the ranking is live and the honest answer moves." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="mantle"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Mantle endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="mantle"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="mantle"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="mantle"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="mantle"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="mantle"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="mantle"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="mantle"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="mantle"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="mantle", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="mantle", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="mantle", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="mantle", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="mantle", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="mantle", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Mantle endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="mantle"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="mantle"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="mantle"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="mantle"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="mantle"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="mantle"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="mantle"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="mantle"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="mantle", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="mantle", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="mantle", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="mantle", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="mantle", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="mantle", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Mantle endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="mantle"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="mantle"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="mantle"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="mantle"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="mantle"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="mantle"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="mantle"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="mantle"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="mantle", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="mantle", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="mantle", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="mantle", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="mantle", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="mantle", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Mantle endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="mantle"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="mantle"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="mantle"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="mantle"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="mantle"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="mantle"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="mantle"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="mantle"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="mantle", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="mantle", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="mantle", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="mantle", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="mantle", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="mantle", region="sgp"}[1h]) + diff --git a/benchmarks/optimism-rpc.yml b/benchmarks/optimism-rpc.yml new file mode 100644 index 00000000..5c895fd8 --- /dev/null +++ b/benchmarks/optimism-rpc.yml @@ -0,0 +1,204 @@ +# OpenChainBench. Bench № 047 + +slug: optimism-rpc +number: "047" +title: Fastest free Optimism RPC, live no-key endpoint latency +seo_title: "Fastest free Optimism RPC 2026" +seo_description: "{{best_name}} leads free Optimism RPC at {{best_p50}} (eth_blockNumber p50, 24h). 6 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Optimism RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Optimism pits the Foundation's `mainnet.optimism.io` against 5 multi-chain no-key gateways. As on Arbitrum, the official endpoint is documented best-effort, and the measured tail confirms it, while the gateway tier (PublicNode, dRPC, Tenderly, 1RPC, Nodies) competes on tighter distributions. Probes run every 15 seconds from three regions with full response classification, so an endpoint stuck on an old head is flagged `stale` rather than ranked fast. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Optimism endpoint that sustains continuous probing, 6 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Optimism-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"optimism\". Provider coverage: 6 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly, Nodies, Optimism). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Optimism RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers." + - "The Optimism Foundation endpoint shows the same best-effort signature as its Arbitrum counterpart: fine median, p99 several multiples worse, exactly what \"documented best-effort\" looks like in continuous measurement." + - "OP Stack symmetry check: comparing this page with the Base leaderboard shows how two chains sharing a stack diverge purely on operator infrastructure." + +faq: + - q: "What is the fastest free Optimism RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 6 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Optimism RPCs work without an API key?" + a: "The 6 providers on this page: PublicNode, dRPC, 1RPC, Tenderly, Nodies, Optimism. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Optimism RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Optimism RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Do Base and Optimism RPCs perform the same since both are OP Stack?" + a: "No. The stack is shared but the infrastructure is not: different operators, different peering, different gateway coverage. Our measurements regularly show different leaders and different tail behavior on the two chains. If you deploy on both, pick the RPC per chain from each page rather than assuming OP Stack parity." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="optimism"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="optimism", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="optimism", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="optimism", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="optimism", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="optimism", region="sgp"}[1h]) + + - slug: optimism-official + name: Optimism + tag: Optimism Foundation public RPC, Optimism mainnet only + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Optimism's no-key Optimism endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="optimism-official", chain="optimism"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="optimism-official", chain="optimism"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="optimism-official", chain="optimism"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="optimism-official", chain="optimism"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="optimism-official", chain="optimism"}) / sum(ocb:rpc_call:rate_24h{provider="optimism-official", chain="optimism"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="optimism-official", chain="optimism"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="optimism-official", chain="optimism"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="optimism-official", chain="optimism", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="optimism-official", chain="optimism", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="optimism-official", chain="optimism", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="optimism-official", chain="optimism", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="optimism-official", chain="optimism", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="optimism-official", chain="optimism", region="sgp"}[1h]) + diff --git a/benchmarks/polygon-rpc.yml b/benchmarks/polygon-rpc.yml new file mode 100644 index 00000000..f7e987e8 --- /dev/null +++ b/benchmarks/polygon-rpc.yml @@ -0,0 +1,181 @@ +# OpenChainBench. Bench № 050 + +slug: polygon-rpc +number: "050" +title: Fastest free Polygon RPC, live no-key endpoint latency +seo_title: "Fastest free Polygon RPC 2026" +seo_description: "{{best_name}} leads free Polygon RPC at {{best_p50}} (eth_blockNumber p50, 24h). 5 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Polygon RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Polygon has no chain-official endpoint in the free tier, so this is the purest gateway-versus-gateway comparison in the cluster: PublicNode, dRPC, 1RPC, Tenderly and Nodies, all answering the same `eth_blockNumber` probe every 15 seconds from three regions. With no house endpoint to anchor expectations, the regional flips between gateways decide the ranking, and they flip often. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Polygon endpoint that sustains continuous probing, 5 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Polygon-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"polygon\". Provider coverage: 5 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly, Nodies). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Polygon RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 5 measured providers." + - "No foundation endpoint means no single-chain specialist skewing the field: every provider here also serves 4+ other chains, making Polygon the cleanest read on pure gateway quality." + - "Regional leadership flips are the norm: the gateway that wins from us-east is regularly beaten from Singapore, so the region tabs above are not decoration, they are the actual answer." + +faq: + - q: "What is the fastest free Polygon RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 5 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Polygon RPCs work without an API key?" + a: "The 5 providers on this page: PublicNode, dRPC, 1RPC, Tenderly, Nodies. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Polygon RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Polygon RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Why is there no official Polygon RPC in this benchmark?" + a: "Polygon's historically documented public endpoint (`polygon-rpc.com`) is operated by a third party and has moved in and out of key-gating and rate-limit regimes that break our 15-second probe cadence. The bench includes only endpoints that sustain continuous no-key probing; the multi-chain gateways above all pass that bar on Polygon." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="polygon"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="polygon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="polygon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="polygon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="polygon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="polygon"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="polygon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="polygon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="polygon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="polygon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="polygon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="polygon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="polygon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="polygon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="polygon", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="polygon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="polygon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="polygon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="polygon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="polygon"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="polygon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="polygon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="polygon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="polygon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="polygon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="polygon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="polygon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="polygon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="polygon", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="polygon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="polygon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="polygon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="polygon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="polygon"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="polygon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="polygon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="polygon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="polygon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="polygon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="polygon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="polygon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="polygon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="polygon", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="polygon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="polygon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="polygon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="polygon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="polygon"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="polygon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="polygon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="polygon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="polygon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="polygon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="polygon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="polygon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="polygon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="polygon", region="sgp"}[1h]) + + - slug: nodies + name: Nodies + tag: POKT Network's decentralized public RPC successor, 7+ chains + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Nodies's no-key Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="polygon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodies", chain="polygon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodies", chain="polygon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodies", chain="polygon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nodies", chain="polygon"}) / sum(ocb:rpc_call:rate_24h{provider="nodies", chain="polygon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nodies", chain="polygon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="polygon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="polygon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="polygon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="polygon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="polygon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodies", chain="polygon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nodies", chain="polygon", region="sgp"}[1h]) + diff --git a/benchmarks/rpc-capabilities.yml b/benchmarks/rpc-capabilities.yml index afbadc33..a18d4496 100644 --- a/benchmarks/rpc-capabilities.yml +++ b/benchmarks/rpc-capabilities.yml @@ -12,52 +12,6 @@ metric: RPC latency unit: ms higher_is_better: false -# Per-chain landing pages (/benchmarks/rpc-capabilities/). Each -# entry must keep its claims chain-scoped: the leader placeholder -# resolves against bestPerChain, never the cross-chain aggregate, and -# the page itself surfaces per-region leaders when they diverge. -per_chain_explainer: - - slug: ethereum - h2: "Fastest free Ethereum RPC" - body: | - {{best_name:chain:ethereum}} currently leads the free, no-key Ethereum RPC field at {{best_p50:chain:ethereum}} (`eth_blockNumber` p50, 24h), measured against 9 providers, the largest cohort in this bench. Ethereum is also where the silent-failure analysis earns its keep: Cloudflare-eth answers HTTP 200 with a JSON-RPC error field on many methods, and Merkle is excluded after recurring Cloudflare lockouts. Probes run every 15 seconds from us-east, eu-west and Singapore. - - slug: base - h2: "Fastest free Base RPC" - body: | - Coinbase's own `mainnet.base.org` goes head-to-head with PublicNode, dRPC, Tenderly and Merkle on Base, an unusually clean comparison because the chain-official endpoint is operated by the same team that runs the sequencer. The current leader is {{best_name:chain:base}} at {{best_p50:chain:base}} (`eth_blockNumber` p50, 24h) across 6 providers, probed every 15 seconds from three regions with stale-head detection against the cross-provider tip. - - slug: bnb - h2: "Fastest free BNB Chain RPC" - body: | - Binance's `bsc-dataseed1` is the incumbent default on BNB Chain, but PublicNode, dRPC and Merkle have closed the latency gap from EU origins. The current leader is {{best_name:chain:bnb}} at {{best_p50:chain:bnb}} (`eth_blockNumber` p50, 24h) across 5 providers. Every endpoint is probed with the identical call every 15 seconds from us-east, eu-west and Singapore, so the ranking reflects sustained round-trip latency, not a one-off burst. - - slug: arbitrum - h2: "Fastest free Arbitrum RPC" - body: | - Arbitrum carries the second-largest cohort in this bench, 8 no-key providers, and is one of the few chains where Lava and MeowRPC compete alongside PublicNode and the Arbitrum Foundation's own endpoint. The current leader is {{best_name:chain:arbitrum}} at {{best_p50:chain:arbitrum}} (`eth_blockNumber` p50, 24h). Latency is sampled every 15 seconds from three regions; archive-depth checks flag endpoints that serve pruned state as non-archive. - - slug: optimism - h2: "Fastest free Optimism RPC" - body: | - Optimism's field pits the Optimism Foundation endpoint against 5 multi-chain gateways. The current leader is {{best_name:chain:optimism}} at {{best_p50:chain:optimism}} (`eth_blockNumber` p50, 24h) across 6 providers. As on every chain here, the harness classifies each response (`ok`, `http_err`, `jsonrpc_err`, `stale`, `timeout`) so an endpoint stuck on an old head is never ranked as fastest, and probes originate from us-east, eu-west and Singapore. - - slug: avalanche - h2: "Fastest free Avalanche RPC" - body: | - Avalanche's chain-official endpoint competes with 5 no-key multi-chain gateways for the C-Chain. The current leader is {{best_name:chain:avalanche}} at {{best_p50:chain:avalanche}} (`eth_blockNumber` p50, 24h) across 6 providers. The probe is the same single call every 15 seconds from three regions, with stale-head detection flagging any provider more than 20 blocks behind the cross-provider tip. - - slug: polygon - h2: "Fastest free Polygon RPC" - body: | - Polygon has no chain-official endpoint in this bench, so the comparison is purely between multi-chain no-key gateways. The current leader is {{best_name:chain:polygon}} at {{best_p50:chain:polygon}} (`eth_blockNumber` p50, 24h) across 5 providers. Each one answers the identical call every 15 seconds from us-east, eu-west and Singapore, and the result classification separates real latency from silent JSON-RPC failures behind an HTTP 200. - - slug: linea - h2: "Fastest free Linea RPC" - body: | - The no-key field thins out on Linea: 4 providers qualify, all multi-chain gateways. The current leader is {{best_name:chain:linea}} at {{best_p50:chain:linea}} (`eth_blockNumber` p50, 24h). Thinner competition makes the reliability columns matter more than raw speed, a fast endpoint with a high `stale` or `timeout` rate is a worse default than a slightly slower consistent one. Probes run every 15 seconds from three regions. - - slug: scroll - h2: "Fastest free Scroll RPC" - body: | - Scroll is one of the smallest cohorts in this bench, 4 no-key providers, all multi-chain gateways. The current leader is {{best_name:chain:scroll}} at {{best_p50:chain:scroll}} (`eth_blockNumber` p50, 24h). The harness runs the identical probe every 15 seconds from us-east, eu-west and Singapore, with stale-head detection against the cross-provider tip so a frozen endpoint cannot top the table. - - slug: mantle - h2: "Fastest free Mantle RPC" - body: | - Mantle rounds out the long tail with 4 qualifying no-key providers, all multi-chain gateways. The current leader is {{best_name:chain:mantle}} at {{best_p50:chain:mantle}} (`eth_blockNumber` p50, 24h). Like every chain in this bench the number is a sustained median, the same call every 15 seconds from three regions over a rolling 24 hours, not a marketing burst, and archive-depth support is audited separately. - seo_intro: | This benchmark answers the question every developer reaching for a free public RPC asks before pasting a URL into their dapp. which diff --git a/benchmarks/scroll-rpc.yml b/benchmarks/scroll-rpc.yml new file mode 100644 index 00000000..0f1d2f2f --- /dev/null +++ b/benchmarks/scroll-rpc.yml @@ -0,0 +1,158 @@ +# OpenChainBench. Bench № 052 + +slug: scroll-rpc +number: "052" +title: Fastest free Scroll RPC, live no-key endpoint latency +seo_title: "Fastest free Scroll RPC 2026" +seo_description: "{{best_name}} leads free Scroll RPC at {{best_p50}} (eth_blockNumber p50, 24h). 4 no-key providers measured every 15s from 3 regions." +subtitle: HTTP round-trip latency for eth_blockNumber against every free, no-key public Scroll RPC endpoint, audited every 15 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Scroll runs the same 4-gateway field as Linea (PublicNode, dRPC, 1RPC, Tenderly), making the two chains a natural controlled experiment: same providers, same probe, different chain infrastructure. The differences you see between this page and the Linea leaderboard are the chains, not the gateways. Probes every 15 seconds, three regions, stale-head detection against the cross-provider tip. + +abstract: | + Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public Scroll endpoint that sustains continuous probing, 4 providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Scroll-scoped answer with per-region breakdowns as a first-class dimension. + +methodology: + - "Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs." + - "Payload: `{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal." + - "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=\"scroll\". Provider coverage: 4 no-key endpoints (PublicNode, dRPC, 1RPC, Tenderly). Exclusions follow the cluster-wide rules documented on the parent benchmark." + +findings: + - "{{best_name}} currently leads free Scroll RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers." + - "Scroll and Linea share an identical provider field, so cross-reading the two pages isolates chain-side latency from gateway-side latency, a comparison no single-chain benchmark can offer." + - "As on every thin-cohort chain, the success-rate column outranks the latency column for picking a production default." + +faq: + - q: "What is the fastest free Scroll RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (`eth_blockNumber` p50 over the last 24h), measured against 4 no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which Scroll RPCs work without an API key?" + a: "The 4 providers on this page: PublicNode, dRPC, 1RPC, Tenderly. Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk." + - q: "Does the fastest Scroll RPC change by region?" + a: "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Scroll RPC latency measured here?" + a: "One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself." + - q: "Which free RPC should I default to on Scroll?" + a: "Start from the current leader above, then check its per-region row for the origin closest to your deployment. With a 4-provider field the honest answer changes more often than on Ethereum, so a primary-plus-fallback pair (the top two on this page) is the resilient configuration rather than any single hardcoded URL." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="scroll"}) + +# Region is the only dimension: chain is baked into every query. +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, archive on most + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Scroll endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="scroll"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="scroll"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="scroll"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="scroll"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="scroll"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="scroll"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="scroll"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="scroll"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="scroll", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="scroll", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="scroll", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="scroll", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="scroll", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="scroll", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralized RPC mesh, consensus-checked + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Scroll endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="scroll"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="scroll"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="scroll"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="scroll"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="scroll"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="scroll"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="scroll"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="scroll"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="scroll", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="scroll", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="scroll", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="scroll", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="scroll", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="scroll", region="sgp"}[1h]) + + - slug: 1rpc + name: 1RPC + tag: Privacy-preserving gateway by Automata Network + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to 1RPC's no-key Scroll endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="scroll"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="1rpc", chain="scroll"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="1rpc", chain="scroll"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="1rpc", chain="scroll"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="1rpc", chain="scroll"}) / sum(ocb:rpc_call:rate_24h{provider="1rpc", chain="scroll"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="1rpc", chain="scroll"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="scroll"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="scroll", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="scroll", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="scroll", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="scroll", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="1rpc", chain="scroll", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="1rpc", chain="scroll", region="sgp"}[1h]) + + - slug: tenderly + name: Tenderly + tag: Multi-chain public gateway, 9 chains, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) to Tenderly's no-key Scroll endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="scroll"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="scroll"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="scroll"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="scroll"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="scroll"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="scroll"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="scroll"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="scroll"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="scroll", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="scroll", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="scroll", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="scroll", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="scroll", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="scroll", region="sgp"}[1h]) + diff --git a/next.config.ts b/next.config.ts index ed60def6..dc7af8c4 100644 --- a/next.config.ts +++ b/next.config.ts @@ -117,6 +117,29 @@ const nextConfig: NextConfig = { ]; }, async redirects() { + // RPC cluster promotion (2026-07): the per-chain RPC leaderboards + // graduated from variant pages under rpc-capabilities to first-class + // benches (044-053, slug "-rpc") with their own YAML, FAQ and + // region dimension. 301 the old variant URLs so Google transfers the + // "fastest rpc" rank signal to the dedicated pages. + const RPC_CLUSTER_CHAINS = [ + "ethereum", + "arbitrum", + "base", + "optimism", + "avalanche", + "bnb", + "polygon", + "linea", + "scroll", + "mantle", + ]; + const rpcClusterRedirects = RPC_CLUSTER_CHAINS.map((chain) => ({ + source: `/benchmarks/rpc-capabilities/${chain}`, + destination: `/benchmarks/${chain}-rpc`, + permanent: true, + })); + // Chains live at /chains/ per the new chain hub route family. // Many of these slugs also resolve under /products/ because // the bench loader treats row shape benches (l1-finality, @@ -199,6 +222,7 @@ const nextConfig: NextConfig = { permanent: true, }, ...chainRedirects, + ...rpcClusterRedirects, ]; }, }; diff --git a/scripts/generate-rpc-chain-benches.py b/scripts/generate-rpc-chain-benches.py new file mode 100644 index 00000000..c6705330 --- /dev/null +++ b/scripts/generate-rpc-chain-benches.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +"""One-shot generator for the per-chain RPC benchmark cluster (044-053). + +Reads provider metadata from benchmarks/rpc-capabilities.yml (the parent, +which stays live as the cross-chain index) and emits one first-class +bench YAML per chain with: + - chain baked into every PromQL selector + - region as the only dimension (us-east / eu-west / sgp) + - chain-specific editorial (seo_intro, findings, faq) so the cluster + never reads as 10 copies of one template + +Run once, review the diff, delete or keep for future regeneration. +""" + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +PARENT = ROOT / "benchmarks" / "rpc-capabilities.yml" + +# Live provider x chain matrix (verified against Prom 2026-07-03). +CHAINS = { + "ethereum": {"num": "044", "label": "Ethereum", "providers": ["publicnode", "drpc", "1rpc", "tenderly", "nodies", "lava", "meowrpc", "flashbots", "cloudflare"]}, + "arbitrum": {"num": "045", "label": "Arbitrum", "providers": ["publicnode", "drpc", "1rpc", "tenderly", "nodies", "lava", "meowrpc", "arbitrum-official"]}, + "base": {"num": "046", "label": "Base", "providers": ["publicnode", "drpc", "tenderly", "nodies", "merkle", "base-official"]}, + "optimism": {"num": "047", "label": "Optimism", "providers": ["publicnode", "drpc", "1rpc", "tenderly", "nodies", "optimism-official"]}, + "avalanche": {"num": "048", "label": "Avalanche", "providers": ["publicnode", "drpc", "1rpc", "tenderly", "nodies", "avalanche-official"]}, + "bnb": {"num": "049", "label": "BNB Chain", "providers": ["publicnode", "drpc", "nodies", "merkle", "binance"]}, + "polygon": {"num": "050", "label": "Polygon", "providers": ["publicnode", "drpc", "1rpc", "tenderly", "nodies"]}, + "linea": {"num": "051", "label": "Linea", "providers": ["publicnode", "drpc", "1rpc", "tenderly"]}, + "scroll": {"num": "052", "label": "Scroll", "providers": ["publicnode", "drpc", "1rpc", "tenderly"]}, + "mantle": {"num": "053", "label": "Mantle", "providers": ["publicnode", "drpc", "1rpc", "tenderly"]}, +} + +# Chain-specific editorial. Every string is unique to its chain so the +# cluster never reads as one duplicated template. +EDITORIAL = { + "ethereum": { + "intro": "Ethereum carries the largest free-RPC cohort we measure: 9 no-key providers answering the same `eth_blockNumber` probe every 15 seconds from three regions. It is also the chain where reliability analysis earns its keep. Cloudflare-eth answers HTTP 200 in well under a second while an increasing share of calls resolve to a JSON-RPC error body (`-32046 Cannot fulfill request`), and Merkle is excluded outright after recurring Cloudflare lockouts that froze our probes for 20 minutes after a single request. If you paste a free RPC URL into an Ethereum dapp, this page is the live answer to which one deserves it.", + "findings": [ + "{{best_name}} currently leads the free Ethereum RPC field at {{best_p50}} (`eth_blockNumber` p50, 24h) across 9 measured providers, the largest cohort of any chain in the cluster.", + "Cloudflare-eth is the resident cautionary tale: sub-second HTTP 200s that increasingly carry a JSON-RPC error instead of a block number. The success-rate column, not the latency column, tells the real story.", + "The p50-to-p99 spread separates the tiers. {{name:1rpc}} sits at {{p50:1rpc}} median but its p99 regularly runs an order of magnitude higher, while {{name:drpc}} ({{p50:drpc}}) keeps a much tighter distribution.", + "Merkle is excluded on Ethereum by design: its endpoint sits behind an aggressive bot filter that locks out programmatic clients for ~20 minutes after one request, invisible on any status page.", + ], + "faq_extra_q": "Why is Cloudflare's Ethereum RPC marked unreliable here?", + "faq_extra_a": "Cloudflare's public Ethereum gateway switched to a permissioned mode for many JSON-RPC methods. The endpoint still responds fast with HTTP 200, but the body is increasingly a JSON-RPC error (`-32046`) rather than a usable result. We classify a call as `ok` only when the HTTP status is 200 AND the body carries a usable `result` field, so Cloudflare's real success rate is visible in the reliability column instead of hiding behind fast error responses.", + }, + "arbitrum": { + "intro": "Arbitrum is the second-largest cohort in the cluster: 8 no-key providers including the Arbitrum Foundation's own `arb1.arbitrum.io/rpc`, and one of the few chains where Lava and MeowRPC still compete on a free tier. Foundation endpoints are documented best-effort, and our data shows what that means in practice: a respectable median with a p99 roughly ten times worse. Every provider answers the identical `eth_blockNumber` probe every 15 seconds from us-east, eu-west and Singapore.", + "findings": [ + "{{best_name}} currently leads free Arbitrum RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 8 measured providers.", + "The Arbitrum Foundation endpoint is the textbook best-effort profile: usable median, heavy tail. Its p99 routinely runs ~10x its p50, which matters if your product retries on timeout.", + "Arbitrum is one of only two chains (with Ethereum) where {{name:lava}} and {{name:meowrpc}} qualify no-key, both providers key-gate or skip most other chains.", + "{{name:drpc}} at {{p50:drpc}} and {{name:publicnode}} at {{p50:publicnode}} anchor the multi-chain gateway tier; regional splits between them flip depending on probe origin.", + ], + "faq_extra_q": "Should I use the official Arbitrum Foundation RPC in production?", + "faq_extra_a": "The Foundation documents `arb1.arbitrum.io/rpc` as best-effort and rate-limited, intended for development. Our continuous measurement confirms the profile: acceptable p50 with a p99 tail several times worse than the leading gateways. For read-heavy production paths a gateway with a tighter distribution is the safer default; keep the official endpoint as a fallback rather than a primary.", + }, + "base": { + "intro": "Base offers the cleanest official-versus-gateway comparison in the cluster: Coinbase operates both the sequencer and the chain-official `mainnet.base.org`, so the house endpoint has every locational advantage, and it still has to beat PublicNode, dRPC, Tenderly, Nodies and Merkle on a level probe. 6 providers, the same `eth_blockNumber` call every 15 seconds, three regions, stale-head detection against the cross-provider tip.", + "findings": [ + "{{best_name}} currently leads free Base RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers.", + "Base is one of only two chains where {{name:merkle}} qualifies no-key (with BNB); its distribution is among the tightest in the whole cluster, p99 barely above p50.", + "The official `mainnet.base.org` and the multi-chain gateways trade the lead depending on region, a reminder that \"fastest\" is a per-origin question, not a global one.", + ], + "faq_extra_q": "Is Coinbase's official Base RPC faster than third-party gateways?", + "faq_extra_a": "Not consistently. Despite being operated by the same team that runs the sequencer, `mainnet.base.org` trades the lead with PublicNode, dRPC and Tenderly depending on which region the request originates from. Check the region tabs on this page for the origin closest to your deployment; the cross-region average hides these flips.", + }, + "optimism": { + "intro": "Optimism pits the Foundation's `mainnet.optimism.io` against 5 multi-chain no-key gateways. As on Arbitrum, the official endpoint is documented best-effort, and the measured tail confirms it, while the gateway tier (PublicNode, dRPC, Tenderly, 1RPC, Nodies) competes on tighter distributions. Probes run every 15 seconds from three regions with full response classification, so an endpoint stuck on an old head is flagged `stale` rather than ranked fast.", + "findings": [ + "{{best_name}} currently leads free Optimism RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers.", + "The Optimism Foundation endpoint shows the same best-effort signature as its Arbitrum counterpart: fine median, p99 several multiples worse, exactly what \"documented best-effort\" looks like in continuous measurement.", + "OP Stack symmetry check: comparing this page with the Base leaderboard shows how two chains sharing a stack diverge purely on operator infrastructure.", + ], + "faq_extra_q": "Do Base and Optimism RPCs perform the same since both are OP Stack?", + "faq_extra_a": "No. The stack is shared but the infrastructure is not: different operators, different peering, different gateway coverage. Our measurements regularly show different leaders and different tail behavior on the two chains. If you deploy on both, pick the RPC per chain from each page rather than assuming OP Stack parity.", + }, + "avalanche": { + "intro": "Avalanche's C-Chain field combines Ava Labs' official `api.avax.network` with 5 no-key multi-chain gateways. The official endpoint shows one of the tightest distributions among foundation RPCs, a contrast with the best-effort profiles on Arbitrum and Optimism. Every provider answers the identical probe every 15 seconds from us-east, eu-west and Singapore, with stale-head detection flagging anything more than 20 blocks behind the cross-provider tip.", + "findings": [ + "{{best_name}} currently leads free Avalanche RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 6 measured providers.", + "Unlike the Arbitrum and Optimism foundation endpoints, `api.avax.network` keeps a tight p50-to-p99 ratio, an official endpoint that behaves like managed infrastructure rather than a best-effort courtesy.", + "{{name:publicnode}} ({{p50:publicnode}}) and {{name:drpc}} ({{p50:drpc}}) give the C-Chain the same reliable gateway floor they provide on every EVM chain we measure.", + ], + "faq_extra_q": "Is the official Avalanche RPC good enough for production reads?", + "faq_extra_a": "Among chain-official endpoints it is one of the strongest we measure: tight latency distribution and a high success rate rather than the best-effort tail seen on some other foundation RPCs. The usual free-tier caveats still apply (shared rate limits, no SLA), but as a read path it holds up unusually well against the commercial gateways.", + }, + "bnb": { + "intro": "BNB Chain is the incumbent's chain: Binance's `bsc-dataseed1.binance.org` has been the copy-paste default since 2020, and from some regions it is still the single fastest RPC response we measure anywhere in the cluster. The catch is that it serves exactly one chain, while PublicNode, dRPC, Nodies and Merkle bring multi-chain coverage with increasingly competitive latency from EU origins. 5 providers, identical probes, three regions.", + "findings": [ + "{{best_name}} currently leads free BNB Chain RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 5 measured providers.", + "Binance's dataseed is a single-chain specialist: blisteringly fast near its home regions (single-digit milliseconds from us-east at times) and 10x slower from Singapore, the widest regional spread in the cluster.", + "{{name:merkle}} qualifies here (BNB is one of its two stable no-key chains) and brings its signature tight distribution to a field otherwise dominated by the dataseed's regional extremes.", + ], + "faq_extra_q": "Is bsc-dataseed still the best RPC for BNB Chain?", + "faq_extra_a": "It depends entirely on where your requests originate. From regions near Binance's infrastructure the dataseed is often the fastest single response in our whole dataset; from Singapore it can be 10x slower than the gateway tier. Check the region tabs above, the cross-region average is meaningless for an endpoint with this much geographic variance.", + }, + "polygon": { + "intro": "Polygon has no chain-official endpoint in the free tier, so this is the purest gateway-versus-gateway comparison in the cluster: PublicNode, dRPC, 1RPC, Tenderly and Nodies, all answering the same `eth_blockNumber` probe every 15 seconds from three regions. With no house endpoint to anchor expectations, the regional flips between gateways decide the ranking, and they flip often.", + "findings": [ + "{{best_name}} currently leads free Polygon RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 5 measured providers.", + "No foundation endpoint means no single-chain specialist skewing the field: every provider here also serves 4+ other chains, making Polygon the cleanest read on pure gateway quality.", + "Regional leadership flips are the norm: the gateway that wins from us-east is regularly beaten from Singapore, so the region tabs above are not decoration, they are the actual answer.", + ], + "faq_extra_q": "Why is there no official Polygon RPC in this benchmark?", + "faq_extra_a": "Polygon's historically documented public endpoint (`polygon-rpc.com`) is operated by a third party and has moved in and out of key-gating and rate-limit regimes that break our 15-second probe cadence. The bench includes only endpoints that sustain continuous no-key probing; the multi-chain gateways above all pass that bar on Polygon.", + }, + "linea": { + "intro": "The no-key field thins out on Linea: 4 providers qualify (PublicNode, dRPC, 1RPC, Tenderly), all multi-chain gateways. Thinner competition makes the reliability columns matter more than raw speed, a fast endpoint with a high stale or timeout rate is a worse default than a slightly slower consistent one. Probes run every 15 seconds from us-east, eu-west and Singapore with full response classification.", + "findings": [ + "{{best_name}} currently leads free Linea RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers.", + "With only 4 qualifying providers, a single gateway having a bad day reshuffles the whole board; the success-rate column is the tiebreaker the median doesn't show.", + "{{name:tenderly}} covers Linea in its 9-chain public gateway, one of the few non-major chains where its no-key tier reaches.", + ], + "faq_extra_q": "Why do so few free RPCs support Linea?", + "faq_extra_a": "Free-tier coverage follows demand: gateways add no-key chains when traffic justifies the infrastructure. Linea's cohort (4 providers) is typical of newer L2s, compare with 9 on Ethereum and 8 on Arbitrum. The flip side is that the providers that do qualify are the disciplined multi-chain operators, so the reliability floor is high even where the field is thin.", + }, + "scroll": { + "intro": "Scroll runs the same 4-gateway field as Linea (PublicNode, dRPC, 1RPC, Tenderly), making the two chains a natural controlled experiment: same providers, same probe, different chain infrastructure. The differences you see between this page and the Linea leaderboard are the chains, not the gateways. Probes every 15 seconds, three regions, stale-head detection against the cross-provider tip.", + "findings": [ + "{{best_name}} currently leads free Scroll RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers.", + "Scroll and Linea share an identical provider field, so cross-reading the two pages isolates chain-side latency from gateway-side latency, a comparison no single-chain benchmark can offer.", + "As on every thin-cohort chain, the success-rate column outranks the latency column for picking a production default.", + ], + "faq_extra_q": "Which free RPC should I default to on Scroll?", + "faq_extra_a": "Start from the current leader above, then check its per-region row for the origin closest to your deployment. With a 4-provider field the honest answer changes more often than on Ethereum, so a primary-plus-fallback pair (the top two on this page) is the resilient configuration rather than any single hardcoded URL.", + }, + "mantle": { + "intro": "Mantle rounds out the cluster's long tail with 4 qualifying no-key providers, all multi-chain gateways (PublicNode, dRPC, 1RPC, Tenderly). Like every chain in the family, the number that matters is a sustained median, the same `eth_blockNumber` call every 15 seconds from three regions over a rolling 24 hours, not a one-off marketing burst, and archive-depth support is audited separately every 5 minutes.", + "findings": [ + "{{best_name}} currently leads free Mantle RPC at {{best_p50}} (`eth_blockNumber` p50, 24h) across 4 measured providers.", + "Mantle's field mirrors Linea and Scroll: the disciplined multi-chain gateways and nobody else, so the leaderboard is a pure read on how each gateway's infrastructure reaches the chain.", + "Thin cohorts amplify tail events, one regional incident at one gateway visibly moves the 24h aggregate, which is exactly why the page shows per-region breakdowns instead of only the average.", + ], + "faq_extra_q": "Are free Mantle RPCs reliable enough to build on?", + "faq_extra_a": "The four qualifying gateways all maintain high measured success rates on Mantle, but a 4-provider field means less redundancy if one degrades. Use the current leader as primary and the runner-up as fallback, and re-check this page after incidents, the ranking is live and the honest answer moves.", + }, +} + +SHARED_METHO = [ + 'Cadence: every 15 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs.', + 'Payload: `{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}`. Plain HTTP POST, identical for every endpoint, no API key in any request.', + "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours.", + "Call-result classification: `ok` (HTTP 200 + non-empty result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal.", + "Archive depth: every 5 minutes we issue `eth_getBalance` at (head − depth) for depths from Geth's default pruned cap up to 5M blocks, exposing which free endpoints actually serve historical state.", + "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities) benchmark; the identical harness, methodology and exclusion rules apply on every chain.", +] + + +def parse_parent_providers(): + c = PARENT.read_text() + out = {} + for m in re.finditer(r' - slug: ([\w-]+)\n name: ([^\n]+)\n tag: ([^\n]+)\n', c): + out[m.group(1)] = {"name": m.group(2), "tag": m.group(3)} + return out + + +def q(metric, provider, chain, extra=""): + return f'{metric}{{provider="{provider}", chain="{chain}"{extra}}}' + + +def provider_block(slug, meta, chain, label): + name, tag = meta["name"], meta["tag"] + formula = ( + f'50th percentile over 24h of client-side round-trip latency (ms) for a single ' + f'`eth_blockNumber` POST sent every 15s from 3 regions (us-east + eu-west + sgp) ' + f"to {name}'s no-key {label} endpoint." + ) + b = [] + b.append(f" - slug: {slug}") + b.append(f" name: {name}") + b.append(f" tag: {tag}") + b.append(f' formula: "{formula}"') + b.append(" queries:") + b.append(f' p50: avg({q("ocb:rpc_latency_milliseconds:p50_24h", slug, chain)})') + b.append(f' p90: avg({q("ocb:rpc_latency_milliseconds:p90_24h", slug, chain)})') + b.append(f' p99: avg({q("ocb:rpc_latency_milliseconds:p99_24h", slug, chain)})') + b.append(f' mean: avg({q("ocb:rpc_latency_milliseconds:mean_24h", slug, chain)})') + b.append(f' success: sum({q("ocb:rpc_call:ok_rate_24h", slug, chain)}) / sum({q("ocb:rpc_call:rate_24h", slug, chain)})') + b.append(f' sample_size: sum({q("ocb:rpc_call:increase_24h", slug, chain)})') + b.append(f' series: avg(avg_over_time({q("rpc_latency_milliseconds", slug, chain)}[1h]))') + b.append(" regions:") + for region, promr in [("us-east", "us-east"), ("eu-west", "eu-west"), ("ap-southeast", "sgp")]: + extra = ', region="' + promr + '"' + b.append(f" - region: {region}") + b.append(f' p50: avg({q("ocb:rpc_latency_milliseconds:p50_24h", slug, chain, extra)})') + b.append(f' series: avg_over_time({q("rpc_latency_milliseconds", slug, chain, extra)}[1h])') + return "\n".join(b) + + +def yml_str(s): + return '"' + s.replace('"', '\\"') + '"' + + +def block_scalar(s, indent=" "): + lines = s.strip().split("\n") + return "|\n" + "\n".join(indent + l for l in lines) + + +def gen_chain(chain, cfg, providers_meta): + label = cfg["label"] + num = cfg["num"] + slug = f"{chain}-rpc" + ed = EDITORIAL[chain] + n = len(cfg["providers"]) + + title = f"Fastest free {label} RPC, live no-key endpoint latency" + seo_title = f"Fastest free {label} RPC 2026" + seo_desc = ( + f"{{{{best_name}}}} leads free {label} RPC at {{{{best_p50}}}} " + f"(eth_blockNumber p50, 24h). {n} no-key providers measured every 15s from 3 regions." + ) + subtitle = ( + f"HTTP round-trip latency for eth_blockNumber against every free, no-key public " + f"{label} RPC endpoint, audited every 15 seconds from 3 regions." + ) + + faq = [ + ( + f"What is the fastest free {label} RPC right now?", + f"{{{{best_name}}}} currently leads at {{{{best_p50}}}} (`eth_blockNumber` p50 over the last 24h), measured against {n} no-key providers probed every 15 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment.", + ), + ( + f"Which {label} RPCs work without an API key?", + f"The {n} providers on this page: " + ", ".join(providers_meta[p]["name"] for p in cfg["providers"]) + ". Every (provider, chain) pair was live-verified no-key before inclusion, and anything that key-gates, region-blocks or rate-limits below our 15-second cadence is excluded rather than listed with an asterisk.", + ), + ( + f"Does the fastest {label} RPC change by region?", + "Frequently. The headline number averages three probe origins (us-east, eu-west, Singapore), but per-region leaders regularly diverge, a gateway that wins from Virginia can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate.", + ), + ( + f"How is {label} RPC latency measured here?", + f"One identical JSON-RPC POST (`eth_blockNumber`) every 15 seconds against each provider from each of 3 regions, with the same plain HTTP client. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest. The harness is open source and every number on this page is a public Prometheus query you can run yourself.", + ), + (ed["faq_extra_q"], ed["faq_extra_a"]), + ] + + out = [] + out.append(f"# OpenChainBench. Bench № {num}") + out.append("") + out.append(f"slug: {slug}") + out.append(f'number: "{num}"') + out.append(f"title: {title}") + out.append(f"seo_title: {yml_str(seo_title)}") + out.append(f"seo_description: {yml_str(seo_desc)}") + out.append(f"subtitle: {subtitle}") + out.append("") + out.append("category: RPCs") + out.append("status: live") + out.append("metric: RPC latency") + out.append("unit: ms") + out.append("higher_is_better: false") + out.append("") + out.append("seo_intro: " + block_scalar(ed["intro"])) + out.append("") + out.append("abstract: " + block_scalar( + f"Per-chain member of the RPC latency cluster. We measure the round-trip latency of a single, identical RPC call (`eth_blockNumber`) against every no-key public {label} endpoint that sustains continuous probing, {n} providers, every 15 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the {label}-scoped answer with per-region breakdowns as a first-class dimension." + )) + out.append("") + out.append("methodology:") + for m in SHARED_METHO: + out.append(f" - {yml_str(m)}") + out.append(f' - "Chain scope: every query on this page is pinned to chain=\\"{chain}\\". Provider coverage: {n} no-key endpoints ({", ".join(providers_meta[p]["name"] for p in cfg["providers"])}). Exclusions follow the cluster-wide rules documented on the parent benchmark."') + out.append("") + out.append("findings:") + for f in ed["findings"]: + out.append(f" - {yml_str(f)}") + out.append("") + out.append("faq:") + for qq, aa in faq: + out.append(f" - q: {yml_str(qq)}") + out.append(f" a: {yml_str(aa)}") + out.append("") + out.append("source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities") + out.append("") + out.append("prometheus:") + out.append(" window: 24h") + out.append(" freshness_metric: rpc_latency_milliseconds") + out.append("") + out.append("# Per-cell (region) ranking matrix for scoped badge claims. Chain is") + out.append("# fixed for the whole bench, so cells key on region alone.") + out.append(f'rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{{chain="{chain}"}})') + out.append("") + out.append("# Region is the only dimension: chain is baked into every query.") + out.append("dimensions:") + out.append(" region:") + out.append(" - { value: all, label: All regions }") + out.append(" - { value: us-east, label: US-East }") + out.append(" - { value: eu-west, label: EU-West }") + out.append(" - { value: sgp, label: Singapore }") + out.append("") + out.append("providers:") + for p in cfg["providers"]: + out.append(provider_block(p, providers_meta[p], chain, label)) + out.append("") + return "\n".join(out) + + +def main(): + providers_meta = parse_parent_providers() + for chain, cfg in CHAINS.items(): + missing = [p for p in cfg["providers"] if p not in providers_meta] + assert not missing, f"{chain}: missing provider meta {missing}" + path = ROOT / "benchmarks" / f"{chain}-rpc.yml" + path.write_text(gen_chain(chain, cfg, providers_meta) + "\n") + print(f"wrote {path.name} ({cfg['num']}, {len(cfg['providers'])} providers)") + + +if __name__ == "__main__": + main()