diff --git a/benchmarks/arbitrum-rpc.yml b/benchmarks/arbitrum-rpc.yml index 216cf1f5a..7b3f72147 100644 --- a/benchmarks/arbitrum-rpc.yml +++ b/benchmarks/arbitrum-rpc.yml @@ -27,6 +27,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"arbitrum\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Exclusions follow the cluster-wide rules documented on the parent benchmark." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Arbitrum endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -339,6 +340,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="arbitrum",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="arbitrum",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Arbitrum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -431,3 +456,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="arbitrum",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="arbitrum",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/arc-rpc.yml b/benchmarks/arc-rpc.yml index ee347cb91..f61d1616f 100644 --- a/benchmarks/arc-rpc.yml +++ b/benchmarks/arc-rpc.yml @@ -41,6 +41,7 @@ methodology: - "The dRPC row of that table (rpc.drpc.mainnet.arc.io) serves the same free tier as arc.drpc.org, identical x-drpc-owner-id, and is measured once under dRPC; the Alchemy row needs a key and sits in the private cohort." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Arc endpoints every 120 seconds from us-east and eu-west, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; GetBlock: an endpoint on the Enterprise plan, shared by the two probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: us-east uses GetBlock's New York endpoint and eu-west its Frankfurt endpoint. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "GetBlock coverage: GetBlock does not offer Arc in Singapore, so no GetBlock row exists for that region: the endpoint is not offered there, which is not a failed or pending measurement. The whole keyed cohort is therefore measured from us-east and eu-west, because averaging a two-region row against three-region rows would compare different populations." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -330,6 +331,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="arc",tier="keyed",region="eu-west"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="arc",tier="keyed",region="eu-west"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Arc endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="arc",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="arc",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="arc",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arc",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arc",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="arc",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arc",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -410,3 +435,26 @@ providers: - region: eu-west p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="arc",tier="keyed",region="eu-west"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="arc",tier="keyed",region="eu-west"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="arc",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="arc",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="arc",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arc",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arc",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="arc",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arc",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arc",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arc",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/base-rpc.yml b/benchmarks/base-rpc.yml index 91f7b1292..f1abbbc43 100644 --- a/benchmarks/base-rpc.yml +++ b/benchmarks/base-rpc.yml @@ -27,6 +27,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"base\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Blink (formerly Merkle) was delisted 2026-07: its gateway does not serve `eth_getBlockByNumber`, the anti-cache probe this cluster standardized on, so it cannot be measured on equal terms. Exclusions follow the cluster-wide rules documented on the parent benchmark." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Base endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -291,6 +292,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="base",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="base",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Base endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="base",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="base",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="base",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="base",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="base",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="base",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="base",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="base",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="base",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="base",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -383,3 +408,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="base",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="base",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="base",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="base",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="base",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="base",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="base",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="base",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="base",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="base",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="base",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="base",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="base",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/bnb-rpc.yml b/benchmarks/bnb-rpc.yml index 6ee0009d7..6bdc8b965 100644 --- a/benchmarks/bnb-rpc.yml +++ b/benchmarks/bnb-rpc.yml @@ -27,6 +27,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"bnb\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Blink (formerly Merkle) was delisted 2026-07: its gateway does not serve `eth_getBlockByNumber`, the anti-cache probe this cluster standardized on, so it cannot be measured on equal terms. Exclusions follow the cluster-wide rules documented on the parent benchmark." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed BNB Chain endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -291,6 +292,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="bnb",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="bnb",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="bnb",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="bnb",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="bnb",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="bnb",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="bnb",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="bnb",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="bnb",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -383,3 +408,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="bnb",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="bnb",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="bnb",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="bnb",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="bnb",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="bnb",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="bnb",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="bnb",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="bnb",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="bnb",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="bnb",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/ethereum-rpc.yml b/benchmarks/ethereum-rpc.yml index a8e11b528..05975071f 100644 --- a/benchmarks/ethereum-rpc.yml +++ b/benchmarks/ethereum-rpc.yml @@ -27,6 +27,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"ethereum\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Cloudflare removed (persistent JSON-RPC -32603). MEV-protection RPCs (Flashbots, MEV Blocker, Blink, bloXroute) share this probe methodology but score on [mev-protect-rpc](/benchmarks/mev-protect-rpc), because their SLA optimises for send-tx privacy, not read speed." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Ethereum endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -339,6 +340,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="ethereum",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="ethereum",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="ethereum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="ethereum",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -431,3 +456,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="ethereum",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="ethereum",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="ethereum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="ethereum",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="ethereum",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="ethereum",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="ethereum",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/hyperliquid-rpc.yml b/benchmarks/hyperliquid-rpc.yml index 9ad5ea847..1a2a762d0 100644 --- a/benchmarks/hyperliquid-rpc.yml +++ b/benchmarks/hyperliquid-rpc.yml @@ -38,6 +38,7 @@ methodology: - "Excluded by the launch audit: Alchemy demo path (rate-limited dead), thirdweb (`Invalid chain` on HyperEVM), Grove/Pocket public LB (requires an app id at the LB path), AllThatNode + Blast API + Chainstack + Gelato + Imperator HyperEVM paths (DNS-fail or 401 without a key), PublicNode (no HyperEVM subdomain yet). HyperEVM is a young chain (mainnet Feb 2025) so this list will shift quickly." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Hyperliquid endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -296,6 +297,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="hyperliquid",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="hyperliquid",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed HyperEVM endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -388,3 +413,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="hyperliquid",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="hyperliquid",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="hyperliquid",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="hyperliquid",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="hyperliquid",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/polygon-rpc.yml b/benchmarks/polygon-rpc.yml index 6c26c2ab8..644d65817 100644 --- a/benchmarks/polygon-rpc.yml +++ b/benchmarks/polygon-rpc.yml @@ -27,6 +27,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"polygon\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Exclusions follow the cluster-wide rules documented on the parent benchmark." - "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Polygon endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -267,6 +268,30 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="polygon",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="polygon",tier="keyed",region="sgp"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Polygon endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="polygon",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="polygon",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="polygon",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="polygon",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="polygon",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="polygon",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="polygon",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -359,3 +384,26 @@ providers: - region: ap-southeast p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="polygon",tier="keyed",region="sgp"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="quicknode",chain="polygon",tier="keyed",region="sgp"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="polygon",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="polygon",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="polygon",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="polygon",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="polygon",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="polygon",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="polygon",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="polygon",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="polygon",tier="keyed",region="sgp"}[1h])) diff --git a/benchmarks/robinhood-rpc.yml b/benchmarks/robinhood-rpc.yml index f53e665cc..9b4be8bef 100644 --- a/benchmarks/robinhood-rpc.yml +++ b/benchmarks/robinhood-rpc.yml @@ -39,6 +39,7 @@ methodology: - "Chain scope: every query on this page is pinned to chain=\"robinhood\" (chain id 4663). Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Exclusions follow the cluster-wide rules documented on the parent benchmark." - "Private cohort (Access selector, Private): Chainstack, Alchemy, QuickNode and GetBlock probed on their keyed Robinhood Chain endpoints every 120 seconds from us-east and eu-west, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification." - "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Chainstack: a Global Node on the Growth plan; Alchemy: a Free plan key (30M CU per month, 25 requests per second), the tier any reader gets; Alchemy states free and paid keys share one routing; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the two probe regions. Chainstack, GetBlock and QuickNode provided their endpoints." + - "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable." - "GetBlock regional pairing: us-east uses GetBlock's New York endpoint and eu-west its Frankfurt endpoint. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe." - "GetBlock coverage: GetBlock does not offer Robinhood Chain in Singapore, so no GetBlock row exists for that region: the endpoint is not offered there, which is not a failed or pending measurement. The whole keyed cohort is therefore measured from us-east and eu-west, because averaging a two-region row against three-region rows would compare different populations." - "Two cohorts, two rankings: the public endpoints are shared, rate-limited gateways probed every 60 seconds; the keyed endpoints are metered or dedicated and probed every 120 seconds. The selector switches the whole page (ranking, chart, region tabs, badges, citation) between them. No figure on this page compares a public endpoint with a keyed one." @@ -301,6 +302,30 @@ providers: - region: eu-west p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="eu-west"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="eu-west"}[1h])) + - slug: dwellir + name: Dwellir + tier: keyed + tag: Developer plan key, 25M responses per month, plan disclosed + formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 120 s from us-east, eu-west and Singapore on Dwellir's keyed Robinhood Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="robinhood",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="sgp"}[1h])) + - slug: alchemy-cold name: Alchemy tier: keyed-cold @@ -361,3 +386,26 @@ providers: - region: eu-west p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="getblock",chain="robinhood",tier="keyed",region="eu-west"}) series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="getblock",chain="robinhood",tier="keyed",region="eu-west"}[1h])) + - slug: dwellir-cold + name: Dwellir + tier: keyed-cold + tag: Same endpoint, measured on a connection that is never reused + formula: "p50 over 24h of round-trip latency (ms) for the same call on a connection that is never reused: DNS, TCP and the TLS handshake are paid every time. What a serverless or one-shot client gets." + queries: + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir",chain="robinhood",tier="keyed"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="robinhood",tier="keyed"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="us-east"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="us-east"}[1h])) + - region: eu-west + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="eu-west"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="eu-west"}[1h])) + - region: ap-southeast + p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="robinhood",tier="keyed",region="sgp"}) + series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="robinhood",tier="keyed",region="sgp"}[1h])) diff --git a/harnesses/rpc-keyed-latency/cmd/script/config.go b/harnesses/rpc-keyed-latency/cmd/script/config.go index 50e6873f0..4948d78f9 100644 --- a/harnesses/rpc-keyed-latency/cmd/script/config.go +++ b/harnesses/rpc-keyed-latency/cmd/script/config.go @@ -23,7 +23,7 @@ type Endpoint struct { // matrix declares which (provider, chain) cells we look for in env. // Kind is derived from the chain. -var providers = []string{"infura", "alchemy", "chainstack", "ankr", "helius", "quicknode", "getblock"} +var providers = []string{"infura", "alchemy", "chainstack", "ankr", "helius", "quicknode", "getblock", "dwellir"} // Per-provider probe-interval multiplier. Infura's free tier 402'd daily // at the old 60 s cadence (its real daily credit budget is below the @@ -126,6 +126,15 @@ var defaultBudgets = map[string]int64{ "getblock": 600_000, "ankr": 300_000, "helius": 300_000, + // dwellir: Developer plan, $49/month, 25M API responses and 100 + // responses/sec, 1 RPC response = 1 API credit with no compute units. + // Three regions share the key, so 8.3M per region is what the plan + // actually allows; the eight EVM chains cost 173k per region per month at + // the 120 s cadence, under 1% of it. The number below is therefore a + // runaway guard, not a quota, and sits well inside the plan. + // Dwellir does not serve Solana, and a cell with no URL is simply + // skipped, so that chain stays at four providers with no special casing. + "dwellir": 1_000_000, } func budgetFor(provider string) int64 { diff --git a/public/logos/dwellir.png b/public/logos/dwellir.png new file mode 100644 index 000000000..2daec4a2f Binary files /dev/null and b/public/logos/dwellir.png differ diff --git a/public/logos/dwellir.svg b/public/logos/dwellir.svg deleted file mode 100644 index b5a801f97..000000000 --- a/public/logos/dwellir.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index 898df8b5a..28b17b6da 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -172,7 +172,7 @@ const RAW: Record = { plasma: "/logos/plasma.webp", ondo: "/logos/ondo-perps.svg", onfinality: "/logos/onfinality.png", - dwellir: "/logos/dwellir.svg", + dwellir: "/logos/dwellir.png", berachain: "/logos/berachain.png", @@ -1005,6 +1005,7 @@ const ALIASES: Record = { "quicknode-cold": "quicknode", "alchemy-cold": "alchemy", "chainstack-cold": "chainstack", + "dwellir-cold": "dwellir", }; export function logoPath(slug: string): string | null {