Skip to content
Merged
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
118 changes: 77 additions & 41 deletions benchmarks/keyed-rpc-robinhood.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ slug: keyed-rpc-robinhood
number: "243"
title: "Fastest Robinhood Chain RPC with API key: Chainstack vs Alchemy vs QuickNode"
seo_title: "Fastest Robinhood Chain RPC API key 2026: Chainstack vs Alchemy vs QuickNode latency"
seo_description: "Live Robinhood Chain RPC latency: Chainstack, Alchemy, and QuickNode keyed endpoints probed every 60s from US-East (Virginia). First public benchmark for this Arbitrum Orbit L2."
subtitle: eth_getBlockByNumber latency against keyed Robinhood Chain endpoints (Chainstack, Alchemy, QuickNode), probed every 60 seconds from US-East (Virginia).
seo_description: "Live Robinhood Chain RPC latency: Chainstack, Alchemy, and QuickNode keyed endpoints probed every 60s from US-East, EU-West, and Singapore. First public benchmark for this Arbitrum Orbit L2."
subtitle: eth_getBlockByNumber latency against keyed Robinhood Chain endpoints (Chainstack, Alchemy, QuickNode), probed every 60 seconds from US-East, EU-West, and Singapore.
category: RPCs
status: live
metric: RPC latency
Expand All @@ -20,86 +20,122 @@ seo_intro: |
advantage on a financially-sensitive chain with low tolerance for RPC
latency.
This bench probes Chainstack, Alchemy, and QuickNode on their keyed
Robinhood Chain endpoints every 60 seconds from US-East (Virginia).
Robinhood Chain is built for US equity trading and its sequencer runs
in Virginia; US-East is the probe region that matters for the applications
using it. This is the only independently-run public latency benchmark for
Robinhood Chain.
Robinhood Chain endpoints every 60 seconds from three global probe
regions: US-East (Virginia), EU-West (Netherlands), and Singapore.
Chainstack leads all three regions, consistent with its globally
distributed Global Node infrastructure. This is the only independently-run
public latency benchmark for Robinhood Chain.

abstract: |
We measure the round-trip latency of eth_getBlockByNumber against the
keyed endpoints of Chainstack, Alchemy, and QuickNode on Robinhood Chain.
The probe uses a rotating JSON-RPC id to defeat edge caches, fires every
60 seconds from US-East (Virginia), and classifies each response as ok,
60 seconds from three global regions, and classifies each response as ok,
http_err, jsonrpc_err, stale, or timeout. Only ok responses contribute to
the latency distribution.

methodology:
- "Cadence: every 60 seconds per provider from US-East (Virginia). Robinhood Chain runs on the Arbitrum Orbit stack with ~100ms block times; the 60s probe cadence captures 600 blocks per hour."
- "Cadence: every 60 seconds per provider from each of 3 probe regions (us-east/Virginia, eu-west/Netherlands, sgp/Singapore). Robinhood Chain runs on the Arbitrum Orbit stack with ~100ms block times; the 60s probe cadence captures 600 blocks per hour per region."
- "Payload: eth_getBlockByNumber('latest', false) with a rotating JSON-RPC id. Non-cacheable by design: the rotating id defeats body-keyed edge caches and forces the provider to serve a real Robinhood Chain tip."
- "Authentication: Chainstack Global Node key (node-scoped, dedicated to Robinhood Chain; key in Railway env, not in repo). Alchemy uses its standard multi-chain key. QuickNode uses its shared-endpoint key for Robinhood Chain. All keys in Railway env, not in repo."
- "Call-result classification: ok (HTTP 200 with usable block number), http_err, jsonrpc_err (HTTP 200 with error body), stale (block more than 20 behind the cross-provider tip), timeout. Latency is recorded only for ok responses."
- "Cohort: Chainstack, Alchemy, and QuickNode. Infura and Ankr do not currently list Robinhood Chain in their supported networks. US-East is the probe region because Robinhood Chain serves a US equity trading audience and its sequencer is in Virginia."
- "Cohort: Chainstack, Alchemy, and QuickNode. Infura and Ankr do not currently list Robinhood Chain in their supported networks."

findings:
- "{{name:chainstack}} leads at {{p50:chainstack}} (p50, 24h) from US-East. Its Global Node places infrastructure close to the Robinhood sequencer in Virginia, giving it a consistent latency edge for East Coast deployments."
- "{{name:alchemy}} records {{p50:alchemy}} from US-East via its edge infrastructure."
- "{{name:quicknode}} delivers {{p50:quicknode}} from US-East via its shared-endpoint fleet."
- "{{name:chainstack}} leads at {{p50:chainstack}} (p50, 24h) across all three probe regions. Its Global Node distributes latency-optimized infrastructure globally, consistently beating Alchemy and QuickNode from Virginia, EU, and Singapore."
- "{{name:alchemy}} records {{p50:alchemy}} averaged across all probe regions via its edge infrastructure."
- "{{name:quicknode}} delivers {{p50:quicknode}} via its shared-endpoint fleet."

faq:
- q: "Which Robinhood Chain RPC provider is fastest?"
a: "Per the live data above: {{name:chainstack}} at {{p50:chainstack}} p50 (24h, US-East). Chainstack's Global Node is co-located close to the Robinhood sequencer in Virginia. For East Coast trading applications on Robinhood Chain, Chainstack is the lowest-latency keyed provider in this benchmark."
a: "Per the live data above: {{name:chainstack}} at {{p50:chainstack}} p50 (24h, averaged across US-East, EU-West, and Singapore). Chainstack's Global Node wins all three probe regions. It is the lowest-latency keyed provider for Robinhood Chain in this benchmark."
- q: "What is Robinhood Chain?"
a: "Robinhood Chain (chain ID 4663) is an Arbitrum Orbit L2 built by Robinhood for tokenized equity trading. It launched in March 2026 with ~100ms block times and a gas fee subsidy running through September 29, 2026. It supports EVM-compatible tooling and standard eth_ JSON-RPC methods."
- q: "Why is this the only Robinhood Chain latency benchmark?"
a: "Robinhood Chain is a new chain. OpenChainBench added it within days of Chainstack, Alchemy, and QuickNode support going live, making this the first and so far only independent latency measurement. Infura and Ankr do not currently list Robinhood Chain in their supported networks."
- q: "Why do you only probe from US-East?"
a: "Robinhood Chain is purpose-built for US equity trading and its sequencer runs in Virginia. US-East is the region where the chain's latency actually matters for financial applications. Probing from Oregon, EU, or Asia would produce numbers irrelevant to the real use case."
- q: "Does Chainstack win from every region?"
a: "Yes. Chainstack's Global Node leads from US-East (Virginia), EU-West (Netherlands), and Singapore. Its globally distributed infrastructure gives it an edge regardless of where the application is deployed."

source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-keyed-latency

prometheus:
window: 24h
freshness_metric: rpc_latency_milliseconds

rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="robinhood",tier="keyed",region="us-east"})
rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="robinhood",tier="keyed"})

dimensions:
region:
- { value: us-east, label: US-East }
- { value: eu-west, label: EU-West }
- { value: sgp, label: Singapore }

providers:
- slug: chainstack
name: Chainstack
tag: Global Node, keyed Robinhood Chain endpoint, plan disclosed
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East on Chainstack's keyed Robinhood Chain Global Node."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East, EU-West, and Singapore on Chainstack's keyed Robinhood Chain Global Node."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"}[1h]))
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="chainstack",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="chainstack",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="chainstack",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="chainstack",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"}[1h]))
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="eu-west"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="eu-west"}[1h]))
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"}[1h]))

- slug: quicknode
name: QuickNode
tag: Shared endpoint fleet, keyed Robinhood Chain endpoint, plan disclosed
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East on QuickNode's keyed Robinhood Chain endpoint."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East, EU-West, and Singapore on QuickNode's keyed Robinhood Chain endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"}[1h]))
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="quicknode",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="quicknode",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="quicknode",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="quicknode",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"}[1h]))
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="eu-west"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="eu-west"}[1h]))
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"}[1h]))

- slug: alchemy
name: Alchemy
tag: 30M CU/mo free, keyed Robinhood Chain endpoint
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East on Alchemy's keyed Robinhood Chain endpoint."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from US-East, EU-West, and Singapore on Alchemy's keyed Robinhood Chain endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"}[1h]))
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="alchemy",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="alchemy",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="alchemy",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="alchemy",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"}[1h]))
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="eu-west"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="eu-west"}[1h]))
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"}[1h]))
4 changes: 3 additions & 1 deletion infrastructure/monitoring/prometheus/prometheus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,9 @@ scrape_configs:
honor_labels: true
static_configs:
- targets:
- 'rpc-keyed-us.railway.internal:2112' # us-east
- 'rpc-keyed-us.railway.internal:2112' # us-east
- 'rpc-keyed-eu.railway.internal:2112' # eu-west
- 'rpc-keyed-sgp.railway.internal:2112' # sgp
labels:
benchmark: rpc-keyed-latency
metrics_path: /metrics
Expand Down
4 changes: 2 additions & 2 deletions src/lib/spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ const loadBenchmarkUnfilteredCached = unstable_cache(
// v55: add ws-head-latency-robinhood (244) + keyed-rpc-robinhood (243). Bench SET grew.
// v56: drop 6 keyed-rpc benches (arbitrum/base/bnb/eth/polygon/solana), US-only robinhood.
// v57: drop rpc-keyed-latency bench.
["bench-unfiltered-v60", process.env.VERCEL_ENV === "production" ? "prod" : "all"],
["bench-unfiltered-v61", process.env.VERCEL_ENV === "production" ? "prod" : "all"],
{ revalidate: 300, tags: ["benchmarks"] },
);

Expand Down Expand Up @@ -639,7 +639,7 @@ const loadBenchmarkFiltered = unstable_cache(
// v21: bumped with bench-unfiltered-v46 (network-coverage split).
// v23: lockstep with bench-unfiltered-v56 (keyed-rpc cleanup).
// v24: lockstep with bench-unfiltered-v57 (drop rpc-keyed-latency).
["bench-filters-v27", process.env.VERCEL_ENV === "production" ? "prod" : "all"],
["bench-filters-v28", process.env.VERCEL_ENV === "production" ? "prod" : "all"],
{ revalidate: 300, tags: ["benchmarks"] }
);

Expand Down
Loading