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
4 changes: 2 additions & 2 deletions benchmarks/cross-chain-messaging-latency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ methodology:
- "No canary transactions: every value on this page is a real user message. No wallet is funded, no gas is paid. Total observation cost is API polling."
- "Circle CCTP not included: Circle's Iris API does not expose a list-recent endpoint, so passive polling is not feasible without maintaining nonce state via chain-scan on all ~10 CCTP source chains plus Solana. A CCTP bench is on the roadmap."

disclaimer: "These four protocols make different security tradeoffs that directly affect their delivery time. LayerZero and Hyperlane sign messages before source-chain finality, so they deliver in seconds. Chainlink CCIP and Axelar wait for source-chain finality before signing (12-20 min on Ethereum-source lanes). A lower p50 here does not mean a protocol is technically superior it may mean it accepts more re-org risk. Use the per-corridor bench for each protocol to compare like-for-like lanes."
disclaimer: "These four protocols make different security tradeoffs that directly affect their delivery time. LayerZero and Hyperlane sign messages before source-chain finality, so they deliver in seconds. Chainlink CCIP and Axelar wait for source-chain finality before signing (12-20 min on Ethereum-source lanes). A lower p50 here does not mean a protocol is technically superior, it may mean it accepts more re-org risk. Use the per-corridor bench for each protocol to compare like-for-like lanes."

findings:
- "The numbers on this page reflect a security tradeoff, not just engineering speed. LayerZero and Hyperlane sign pre-finality and deliver in seconds. Chainlink CCIP and Axelar wait for source-chain finality (12-20 min on Ethereum-source lanes) before signing. A lower p50 here can mean faster delivery or less re-org protection read both together."
- "The numbers on this page reflect a security tradeoff, not just engineering speed. LayerZero and Hyperlane sign pre-finality and deliver in seconds. Chainlink CCIP and Axelar wait for source-chain finality (12-20 min on Ethereum-source lanes) before signing. A lower p50 here can mean faster delivery or less re-org protection, read both together."
- "{{best_name}} currently leads end-to-end cross-chain delivery at {{best_p50}} (p50 aggregate across all corridors, 24h). Pre-finality signers structurally dominate this aggregate on high-Ethereum-volume days."
- "Per-corridor variance is large. The aggregate here is a headline; the individual bench for each protocol shows the per-source-chain breakdown that answers what you would feel in production."

Expand Down
159 changes: 159 additions & 0 deletions benchmarks/immutable-rpc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# OpenChainBench. Bench № 111

slug: immutable-rpc
number: "111"
title: Fastest free Immutable zkEVM RPC, live no-key EVM endpoint latency
seo_title: "Fastest free Immutable zkEVM RPC 2026"
seo_description: "{{best_name}} leads free Immutable zkEVM RPC at {{best_p50}} (`eth_getBlockByNumber` p50, 24h). 4 no-key providers measured every 60s from 3 regions."
subtitle: HTTP round-trip latency for the `eth_getBlockByNumber(\"latest\", false)` method against every free, no-key public Immutable zkEVM EVM endpoint, audited every 60 seconds from 3 regions.

category: RPCs
status: live
metric: RPC latency
unit: ms
higher_is_better: false

seo_intro: |
Immutable zkEVM is a Polygon CDK zkEVM L2 (chain 13371) operated by Immutable, dedicated to Web3 gaming with an IMX gas token model, 2 s block cadence, settlement onto Ethereum via zk-proofs. 4 clean keyless providers live-verified at launch: `immutable-official` (rpc.immutable.com), dRPC, Tenderly Gateway, Thirdweb. Excluded by the launch audit: PublicNode (no `immutable` subdomain), Alchemy public (chain not enabled on public tier), Tenderly's `rpc.immutable.gateway.tenderly.co` alias (route redirects to keyed path).

abstract: |
Per-chain member of the RPC latency cluster, extended to Immutable zkEVM.
We measure the round-trip latency of a single, identical JSON-RPC call
(`eth_getBlockByNumber(\"latest\", false)`) against every no-key public
Immutable zkEVM endpoint that sustains continuous probing, 4 providers
at launch, every 60 seconds, from us-east, eu-west and Singapore. The
harness classifies every response (ok / http_err / jsonrpc_err / stale
/ timeout) with a Immutable zkEVM-scaled staleness gap (25 blocks
at Immutable zkEVM's ~2 s block time). The cross-chain view
lives on the parent `rpc-capabilities` benchmark; this page is the
Immutable zkEVM-scoped answer with per-region breakdowns as a first-class
dimension.

methodology:
- "Cadence: every 60 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\":<rotating>,\"method\":\"eth_getBlockByNumber\",\"params\":[\"latest\", false]}`. Plain HTTP POST, identical for every endpoint, no API key in any request. Non-cacheable by design: the rotating id defeats edge caches that would answer a bare head query without touching a node."
- "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 with a parsable hex block number), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 25 blocks behind the cross-provider tip), `timeout`. Latency without reliability is a misleading ranking signal."
- "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, cadence and exclusion rules apply on every chain."
- "Chain scope: every query on this page is pinned to `chain=\"immutable\"`. Provider coverage at launch: 4 no-key endpoints."

findings:
- "{{best_name}} currently leads free Immutable zkEVM RPC at {{best_p50}} (`eth_getBlockByNumber` p50, 24h) across 4 measured providers."

faq:
- q: "What is the fastest free Immutable zkEVM RPC right now?"
a: "{{best_name}} currently leads at {{best_p50}} (`eth_getBlockByNumber(\"latest\", false)` p50 over the last 24h), measured against 4 no-key providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples. Use the region tabs to see the leader from the origin closest to your deployment."
- q: "Which Immutable zkEVM RPCs work without an API key?"
a: "4 endpoints sustain continuous keyless probing at launch. Every listed endpoint was live-verified with a `eth_getBlockByNumber` POST returning a parsable response before inclusion. See the methodology section for the endpoints that were audited and excluded."
- q: "Does the fastest Immutable zkEVM RPC change by region?"
a: "Often. Public infra concentrates in specific regions; a gateway that wins from Amsterdam can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number to a single origin; pick the one closest to where your requests originate."
- q: "How is Immutable zkEVM RPC latency measured here, technically?"
a: "One identical `eth_getBlockByNumber(\"latest\", false)` POST every 60 seconds against each provider from each of 3 regions, using the same plain HTTP client the rest of the RPC cluster uses. 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."

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

prometheus:
window: 24h
freshness_metric: rpc_latency_milliseconds

rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="immutable"})

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: immutable-official
name: Immutable
tag: Immutable zkEVM official public RPC
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Immutable's no-key immutable RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="immutable-official", chain="immutable"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="immutable-official", chain="immutable"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="immutable-official", chain="immutable"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="immutable-official", chain="immutable"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="immutable-official", chain="immutable"}) / sum(ocb:rpc_call:rate_24h{provider="immutable-official", chain="immutable"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="immutable-official", chain="immutable"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="immutable-official", chain="immutable"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="immutable-official", chain="immutable", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="immutable-official", chain="immutable", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="immutable-official", chain="immutable", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="immutable-official", chain="immutable", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="immutable-official", chain="immutable", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="immutable-official", chain="immutable", region="sgp"}[1h])

- slug: drpc
name: dRPC
tag: dRPC public gateway routing to Immutable zkEVM node pool
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key immutable RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="immutable"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="immutable"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="immutable"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="immutable"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="immutable"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="immutable"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="immutable"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="immutable"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="immutable", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="immutable", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="immutable", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="immutable", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="immutable", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="immutable", region="sgp"}[1h])

- slug: tenderly
name: Tenderly Gateway
tag: Tenderly Gateway public RPC for Immutable zkEVM
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Tenderly Gateway's no-key immutable RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="immutable"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tenderly", chain="immutable"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tenderly", chain="immutable"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tenderly", chain="immutable"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="tenderly", chain="immutable"}) / sum(ocb:rpc_call:rate_24h{provider="tenderly", chain="immutable"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="tenderly", chain="immutable"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="immutable"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="immutable", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="immutable", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="immutable", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="immutable", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tenderly", chain="immutable", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="tenderly", chain="immutable", region="sgp"}[1h])

- slug: thirdweb
name: Thirdweb
tag: Thirdweb public RPC gateway for Immutable zkEVM
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Thirdweb's no-key immutable RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="immutable"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="thirdweb", chain="immutable"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="thirdweb", chain="immutable"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="thirdweb", chain="immutable"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="thirdweb", chain="immutable"}) / sum(ocb:rpc_call:rate_24h{provider="thirdweb", chain="immutable"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="thirdweb", chain="immutable"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="immutable"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="immutable", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="immutable", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="immutable", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="immutable", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="immutable", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="immutable", region="sgp"}[1h])
Loading
Loading