Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions benchmarks/rpc-keyed-latency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ seo_intro: |
Singapore, staying far inside every provider's free quota. Chains
covered. Ethereum (5 providers), Base + Arbitrum + BNB + Polygon
(Alchemy, Infura, Ankr, Chainstack), Optimism (Alchemy, Infura,
Chainstack, QuickNode), Solana (Alchemy, Helius, Chainstack). Current leaders per the live data on this page.
Chainstack, QuickNode), Robinhood Chain (Chainstack, Alchemy — Arbitrum
Orbit L2, chain ID 4663, ~100ms blocks), Solana (Alchemy, Helius,
Chainstack). Current leaders per the live data on this page.
The companion question, which RPC works with no signup at all, is
answered by the [rpc-capabilities](/benchmarks/rpc-capabilities)
bench with the identical methodology, so the keyed premium (or its
Expand All @@ -54,7 +56,7 @@ methodology:
- "Authentication: each provider's standard free-tier key, obtained via normal signup, no credit card, no sales contact. Keys live in env vars on the probe services and never in the repo. Endpoint shapes: key-in-path (Alchemy `/v2/<key>`, Infura `/v3/<key>`, Chainstack, Ankr) or query param (Helius `?api-key=`)."
- "Quota guard: each region gets 1/3 of a provider's audited monthly free quota; probing pauses at 90% of that budget until calendar-month rollover (`rpc_keyed_quota_used_ratio`, `rpc_call_total{result=\"quota_paused\"}`). Budgets target ≤2/3 of the real quota, so the bench can never exhaust a key."
- "Call-result classification: `ok` (HTTP 200 + usable result), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 20 blocks / 300 slots behind the cross-provider tip), `timeout`. Latency is recorded only for `ok` responses."
- "Cohort: Alchemy (6 EVM + Solana), Infura / MetaMask Developer (6 EVM), Ankr (5 EVM; Optimism pending chain enablement on the key), Chainstack (6 EVM + Solana via Global Nodes, see plan disclosure below), Helius (Solana only), QuickNode (BNB + Optimism, see plan disclosure below). Free-tier scope differences are disclosed, not hidden: a provider missing from a chain tab means its free tier does not cover that chain (or caps the node count), which is itself a finding."
- "Cohort: Alchemy (7 EVM + Solana), Infura / MetaMask Developer (6 EVM), Ankr (5 EVM; Optimism pending chain enablement on the key), Chainstack (7 EVM incl. Robinhood + Solana via Global Nodes, see plan disclosure below), Helius (Solana only), QuickNode (BNB + Optimism, see plan disclosure below). Robinhood Chain (Arbitrum Orbit L2, chain ID 4663) is covered by Chainstack and Alchemy only; QuickNode support exists per their docs but a keyed endpoint is pending. Free-tier scope differences are disclosed, not hidden: a provider missing from a chain tab means its free tier does not cover that chain (or caps the node count), which is itself a finding."
- "Excluded by design: Tenderly (Node RPC excluded from the free plan), GetBlock (50k CU/day cannot sustain even one chain at probe cadence), Moralis (free plan capped at 2 node endpoints), Blast API (shut down Oct 2025). Each exclusion is quota math or plan scope, never editorial."
- "Plan disclosure: Alchemy, QuickNode and Chainstack are measured through standard shared endpoints of paid accounts. Alchemy and QuickNode route free and paid keys to the same shared fleets; Chainstack Global Nodes are the identical anycast product the free plan provides. The paid difference is quota and node count (free Chainstack caps at one node), not the serving infrastructure, so the latency read is representative of both plans."
- "Fair-play note: free tiers do not necessarily run on the provider's paid-tier infrastructure (e.g. dRPC routes free traffic to a separate provider pool; several providers serve free keys from shared clusters). This page measures exactly what a free signup gets, read it as the free-tier experience, not the provider's ceiling."
Expand All @@ -64,6 +66,7 @@ findings:
- "{{name:alchemy}} aggregates {{p50:alchemy}} across its 7 covered chains, the widest free-tier footprint in the cohort (6 EVM + Solana on one key)."
- "{{name:infura}} sits at {{p50:infura}} on the cross-chain aggregate. Its 2026 free tier meters 3M credits per day (80 credits per call), the tightest effective budget of the EVM cohort."
- "{{name:chainstack}} aggregates {{p50:chainstack}} across 7 chains via Global Nodes, the same anycast product its free plan ships (capped at one node there), measured from a paid org and disclosed as such."
- "On Robinhood Chain (Arbitrum Orbit L2, chain ID 4663), {{best_name:chain:robinhood}} leads at {{best_p50:chain:robinhood}} (p50, 24h). Chainstack and Alchemy are the only keyed providers with support; official public RPC clocked ~170ms in internal tests."
- "On Solana, {{best_name:chain:solana}} leads at {{best_p50:chain:solana}} (p50, 24h) between Helius (Solana-native) and Alchemy."

faq:
Expand All @@ -88,14 +91,15 @@ rank_matrix_query: avg by (provider, chain, region) (ocb:rpc_latency_millisecond

dimensions:
chain:
- { value: all, label: All chains }
- { value: ethereum, label: Ethereum }
- { value: base, label: Base }
- { value: arbitrum, label: Arbitrum }
- { value: optimism, label: Optimism }
- { value: bnb, label: BNB Chain }
- { value: polygon, label: Polygon }
- { value: solana, label: Solana }
- { value: all, label: All chains }
- { value: ethereum, label: Ethereum }
- { value: base, label: Base }
- { value: arbitrum, label: Arbitrum }
- { value: optimism, label: Optimism }
- { value: bnb, label: BNB Chain }
- { value: polygon, label: Polygon }
- { value: robinhood, label: Robinhood }
- { value: solana, label: Solana }
region:
- { value: all, label: All regions }
- { value: us-east, label: US-East }
Expand Down Expand Up @@ -174,7 +178,7 @@ providers:

- slug: chainstack
name: Chainstack
tag: Global Nodes on 6 EVM + Solana, plan disclosed
tag: Global Nodes on 7 EVM incl. Robinhood + Solana, plan disclosed
formula: "50th percentile over 24h of client-side round-trip latency (ms) for the anti-cache probe sent every 60s from 3 regions to Chainstack's free-tier Ethereum Global Node."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack"})
Expand Down
2 changes: 1 addition & 1 deletion harnesses/rpc-keyed-latency/cmd/script/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func intervalMultFor(provider string) int {
}
return 1
}
var chainsEVM = []string{"ethereum", "base", "arbitrum", "optimism", "bnb", "polygon"}
var chainsEVM = []string{"ethereum", "base", "arbitrum", "optimism", "bnb", "polygon", "robinhood"}

func endpoints() []Endpoint {
var out []Endpoint
Expand Down
5 changes: 0 additions & 5 deletions src/lib/removed-benches.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@ export const RENAMED_BENCH_SLUGS: Record<string, string> = {
export const REMOVED_ANSWER_SLUGS = new Set([
"which-evm-aggregator-has-the-fastest-quote",
"which-solana-rpc-lands-the-most-transactions",
// References rpc-keyed-latency (bench 069, staging-only, in
// REMOVED_BENCH_SLUGS below). Prod was returning 404 on this answer
// page because the underlying bench 410s. Answer stays on staging.
"alchemy-vs-quicknode-vs-infura-latency",
// References solana-dex-quote-latency (staging-only, in
// REMOVED_BENCH_SLUGS). Same pattern.
"which-solana-dex-aggregator-is-the-fastest",
Expand Down Expand Up @@ -113,7 +109,6 @@ export const REMOVED_BENCH_SLUGS = new Set([
// DFlow (needs partnership key) + drop the two dead providers.
"solana-dex-quote-latency",
// staging pipeline, held back until validated / announced
"rpc-keyed-latency",
"explorer-chain-coverage",
"portfolio-chain-coverage",
// pm-data-freshness (bench 113) retired 2026-07: Predexon (the only
Expand Down