From 83ae466237a67140642c3af077b4e0c3f3e60e32 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Wed, 9 Sep 2026 17:22:43 +0200 Subject: [PATCH] feat(rpc): add NOWNodes to ethereum-rpc and bnb-rpc NOWNodes exposes keyless public endpoints on a handful of chains. Tested apples-to-apples from the VPS with the harness's own eth_getBlockByNumber probe: public-eth.nownodes.io p50 38ms / head lag 0 blocks vs publicnode, public-bsc.nownodes.io p50 100ms / head lag 0 blocks. Both fresh, both under the 5 RPS free limit at the harness's 3-req/min cadence. Their other public endpoints don't fit an existing bench: Coreum returns 501 on the Tendermint /status our cosmos probe uses (only the gRPC-gateway REST works), and LUKSO/Bitcoin have no bench. A full scan of public-.nownodes.io across every RPC bench chain confirmed only eth, bsc, coreum and lukso answer keyless. Adds nownodes to the harness config for those two chains, the provider block in both specs, and enriches the registry entry. Co-Authored-By: Claude Opus 4.8 --- benchmarks/bnb-rpc.yml | 23 +++++++++++++++++++ benchmarks/ethereum-rpc.yml | 23 +++++++++++++++++++ .../rpc-capabilities/cmd/script/config.go | 6 +++-- src/data/provider-registry.ts | 13 ++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/benchmarks/bnb-rpc.yml b/benchmarks/bnb-rpc.yml index 95ca204e9..94bf6875c 100644 --- a/benchmarks/bnb-rpc.yml +++ b/benchmarks/bnb-rpc.yml @@ -86,6 +86,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes public no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="sgp"}[1h]) + - slug: drpc name: dRPC tag: Decentralized RPC mesh, consensus-checked diff --git a/benchmarks/ethereum-rpc.yml b/benchmarks/ethereum-rpc.yml index ce4e21741..98627c04d 100644 --- a/benchmarks/ethereum-rpc.yml +++ b/benchmarks/ethereum-rpc.yml @@ -87,6 +87,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes public no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="sgp"}[1h]) + - slug: drpc name: dRPC tag: Decentralized RPC mesh, consensus-checked diff --git a/harnesses/rpc-capabilities/cmd/script/config.go b/harnesses/rpc-capabilities/cmd/script/config.go index b61dc0d04..2907544b1 100644 --- a/harnesses/rpc-capabilities/cmd/script/config.go +++ b/harnesses/rpc-capabilities/cmd/script/config.go @@ -237,7 +237,7 @@ func chains() []Chain { {Slug: "tenderly", Name: "Tenderly Gateway", URL: envDefault("RPC_URL_MEGAETH_TENDERLY", "https://megaeth.gateway.tenderly.co")}, }, }, - // ─── Ethereum mainnet (8 providers) ──────────────────────── + // ─── Ethereum mainnet (9 providers) ──────────────────────── { Slug: "ethereum", Name: "Ethereum", @@ -250,6 +250,7 @@ func chains() []Chain { {Slug: "nodies", Name: "Nodies (POKT)", URL: envDefault("RPC_URL_ETHEREUM_NODIES", "https://eth-pokt.nodies.app")}, {Slug: "lava", Name: "Lava Network", URL: envDefault("RPC_URL_ETHEREUM_LAVA", "https://eth1.lava.build")}, {Slug: "bloxroute", Name: "bloXroute", URL: envDefault("RPC_URL_ETHEREUM_BLOXROUTE", "https://eth.rpc.blxrbdn.com")}, + {Slug: "nownodes", Name: "NOWNodes", URL: envDefault("RPC_URL_ETHEREUM_NOWNODES", "https://public-eth.nownodes.io")}, }, }, // ─── Polygon PoS (5 providers) ────────────────────────────── @@ -304,7 +305,7 @@ func chains() []Chain { {Slug: "bloxroute", Name: "bloXroute", URL: envDefault("RPC_URL_BASE_BLOXROUTE", "https://base.rpc.blxrbdn.com")}, }, }, - // ─── BNB Chain (5 providers) ──────────────────────────────── + // ─── BNB Chain (7 providers) ──────────────────────────────── { Slug: "bnb", Name: "BNB Chain", @@ -315,6 +316,7 @@ func chains() []Chain { {Slug: "binance", Name: "Binance Official", URL: envDefault("RPC_URL_BNB_OFFICIAL", "https://bsc-dataseed1.binance.org")}, {Slug: "blastapi", Name: "Blast API", URL: envDefault("RPC_URL_BNB_BLASTAPI", "https://bsc-mainnet.public.blastapi.io")}, {Slug: "bloxroute", Name: "bloXroute", URL: envDefault("RPC_URL_BNB_BLOXROUTE", "https://bsc.rpc.blxrbdn.com")}, + {Slug: "nownodes", Name: "NOWNodes", URL: envDefault("RPC_URL_BNB_NOWNODES", "https://public-bsc.nownodes.io")}, }, }, // ─── Avalanche C-Chain (6 providers) ──────────────────────── diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index c9782f304..8ec3e6919 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -2311,8 +2311,19 @@ export const PROVIDER_REGISTRY: Record = { nownodes: { url: "https://nownodes.io", description: - "NOWNodes is a multi-chain node provider covering Gram (TON), Bitcoin, Ethereum and 50+ other chains. Offers API-key-based access with a free trial tier.", + "Multi-chain node provider covering 110+ blockchains. Key-based REST and WebSocket RPC plus block explorers, with keyless public endpoints on a handful of chains (Ethereum, BNB, Bitcoin) rate-limited to 5 requests per second.", twitter: "@NOWNodes_io", + docs: "https://docs.nownodes.io", + chains: ["ethereum", "bnb", "bitcoin", "litecoin", "dogecoin", "gram", "xrp", "tron"], + features: [ + "110+ chains via a single API key", + "REST and WebSocket JSON-RPC endpoints", + "Block explorers for major UTXO chains", + "Keyless public endpoints on Ethereum, BNB and Bitcoin (5 RPS)", + "Free trial tier, then usage-based paid plans", + ], + pricing: + "Free trial key, then paid plans by request volume. Public no-key endpoints exist on select chains at 5 requests per second.", }, tatum: { url: "https://tatum.io",