From 9858b5ed606fc4431a154e2d6d9316319424ec20 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:47:29 +0200 Subject: [PATCH 1/2] feat: publish rpc-keyed-latency bench (069) + answer page to prod --- src/lib/removed-benches.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/lib/removed-benches.ts b/src/lib/removed-benches.ts index 95146429b..5f87dcecc 100644 --- a/src/lib/removed-benches.ts +++ b/src/lib/removed-benches.ts @@ -48,10 +48,6 @@ export const RENAMED_BENCH_SLUGS: Record = { 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", @@ -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 From 21420245402ceae573d001739433f72862562a09 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Thu, 27 Aug 2026 13:13:33 +0200 Subject: [PATCH 2/2] feat: add Robinhood Chain (chain 4663) to keyed-latency bench 069 Chainstack + Alchemy probed from 3 regions; Railway env vars pushed. QuickNode endpoint pending (supported per docs, key not yet provisioned). --- benchmarks/rpc-keyed-latency.yml | 26 +++++++++++-------- .../rpc-keyed-latency/cmd/script/config.go | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/benchmarks/rpc-keyed-latency.yml b/benchmarks/rpc-keyed-latency.yml index f8c39623f..35a62a8fb 100644 --- a/benchmarks/rpc-keyed-latency.yml +++ b/benchmarks/rpc-keyed-latency.yml @@ -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 @@ -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/`, Infura `/v3/`, 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." @@ -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: @@ -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 } @@ -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"}) diff --git a/harnesses/rpc-keyed-latency/cmd/script/config.go b/harnesses/rpc-keyed-latency/cmd/script/config.go index fb4febc5f..7b717ccd1 100644 --- a/harnesses/rpc-keyed-latency/cmd/script/config.go +++ b/harnesses/rpc-keyed-latency/cmd/script/config.go @@ -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