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
201 changes: 201 additions & 0 deletions benchmarks/hyperliquid-rpc.yml

Large diffs are not rendered by default.

163 changes: 163 additions & 0 deletions benchmarks/tron-rpc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# OpenChainBench. Bench № 093

slug: tron-rpc
number: "093"
title: Fastest free TRON RPC, live no-key JSON-RPC endpoint latency
seo_title: "Fastest free TRON RPC 2026"
seo_description: "{{best_name}} leads free TRON RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h). 3 no-key JSON-RPC-compat providers measured every 60s from 3 regions."
subtitle: HTTP round-trip latency for `eth_getBlockByNumber("latest", false)` against every free, no-key public TRON JSON-RPC-compatible endpoint, audited every 60 seconds from 3 regions.

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

seo_intro: |
TRON exposes two RPC surfaces: the native Tron HTTP API
(`wallet/getnowblock`, `wallet/triggersmartcontract`) and an
EVM-compatible JSON-RPC endpoint (`/jsonrpc`) that speaks standard
Ethereum method names (`eth_blockNumber`, `eth_getBlockByNumber`,
`eth_getBalance`). This bench measures the JSON-RPC surface because
that is the path every TRON-compatible EVM wallet, TronWeb bridge
and cross-chain bot integrates against. Provider cohort at launch:
TronGrid (Tron Foundation official), dRPC and PublicNode / Allnodes.
Ankr's JSON-RPC path is keyless in branding but rejected our probes
with `API key is not allowed to access blockchain`; Chainstack,
NOWNodes, GetBlock, Tatum and BlockPI require API keys on the TRON
JSON-RPC path; OnFinality and Blast API have no public TRON
JSON-RPC gateway at this time. The native TRON REST API surface
(used by TronWeb + TronBox) is out of scope for the RPC cluster
and would need a chain-specific probe added.

abstract: |
Per-chain member of the RPC latency cluster, extended to the TRON
JSON-RPC-compatible surface. We measure the round-trip latency of a
single, identical JSON-RPC call
(`eth_getBlockByNumber("latest", false)`) against every no-key
public TRON JSON-RPC endpoint that sustains continuous probing,
3 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 the EVM
staleness gap tuned for TRON's ~3 s block time (25 blocks ≈ 75
seconds). The cross-chain view lives on the parent `rpc-capabilities`
benchmark; this page is the TRON-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, roughly 75 seconds at TRON's ~3 s block time), `timeout`. Latency without reliability is a misleading ranking signal."
- "Surface scope: only the EVM-compatible JSON-RPC surface (`/jsonrpc` endpoints) is measured, because that is the path every cross-chain wallet, TronWeb / EVM bridge and arbitrage bot integrates against. The native TRON REST API (`wallet/getnowblock`, `wallet/triggersmartcontract`) is out of scope for this bench; a chain-specific `tron-rest` bench can be added later when there is clear demand from integrators using TronWeb directly."
- "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=\"tron\"`. Provider coverage at launch: 3 no-key JSON-RPC endpoints (TronGrid, dRPC, PublicNode). The TRON JSON-RPC provider market is materially smaller than the EVM one; most TRON infra vendors expose only the native TRON REST API keyless, and gate the JSON-RPC path behind an API key."
- "Excluded by the launch audit: Ankr (`rpc.ankr.com/tron_jsonrpc` returned `API key is not allowed to access blockchain` without a key), Chainstack / NOWNodes / GetBlock / Tatum / BlockPI (all require an API key on the TRON JSON-RPC path even though branded as public), OnFinality + Blast API + AllThatNode (no public TRON JSON-RPC gateway), Tron Foundation's `rpc.trongrid.io` (DNS not resolving; the correct official host is `api.trongrid.io/jsonrpc`)."

findings:
- "{{best_name}} currently leads free TRON RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h) across 3 measured providers."
- "{{name:trongrid}} is Tron Foundation's official public API gateway; the bench measures the same `api.trongrid.io/jsonrpc` endpoint that every TronWeb + tronbox integrator points at first. Latency here reflects what a keyless TRON-EVM integrator sees end-to-end."
- "{{name:drpc}} routes TRON JSON-RPC through its multi-provider load balancer; latency here is a good proxy for what a cross-chain integrator (multi-chain wallets, bridges) can expect from a load-balanced setup."
- "{{name:publicnode}} extends its universal multi-chain footprint to TRON JSON-RPC without a keyed path; the reliability column matters as much as p50 since TRON JSON-RPC compat is a thin layer over the native TRON API and can drift under load."

faq:
- q: "What is the fastest free TRON RPC right now?"
a: "{{best_name}} currently leads at {{best_p50}} (eth_getBlockByNumber p50 over the last 24h), measured against 3 no-key JSON-RPC providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment."
- q: "Which TRON RPCs work without an API key?"
a: "Three JSON-RPC endpoints sustain continuous keyless probing at launch: TronGrid (`api.trongrid.io/jsonrpc`), dRPC (`tron.drpc.org`) and PublicNode / Allnodes (`tron.publicnode.com/jsonrpc`). Every listed endpoint was live-verified with an `eth_getBlockByNumber` POST returning a parsable hex head before inclusion. Excluded by the audit: Ankr's TRON JSON-RPC path rejects keyless probes with `API key is not allowed to access blockchain`; Chainstack, NOWNodes, GetBlock, Tatum and BlockPI require an API key on the TRON JSON-RPC path even though branded as public; OnFinality, Blast API and AllThatNode have no public TRON JSON-RPC gateway. The TRON JSON-RPC provider market is materially smaller than the EVM one , most TRON infra vendors expose only the native TRON REST API keyless."
- q: "Why only 3 providers when other RPC benches have 5+?"
a: "TRON's JSON-RPC compat layer is thinner than the EVM one, and most infra vendors gate it behind an API key even when their native TRON REST endpoints are keyless. The 3 providers on this page are all keyless endpoints that responded correctly to a plain POST during the launch audit; when other vendors open a keyless JSON-RPC path we will add them. Latency and reliability numbers here are still meaningful because the 3 providers span a Foundation-official endpoint, a multi-provider aggregator (dRPC) and a universal multi-chain gateway (PublicNode) , the three infra archetypes an integrator would compare against each other anyway."
- q: "Does this bench cover the native TRON REST API (`wallet/getnowblock`)?"
a: "No. This bench scopes only the EVM-compatible JSON-RPC surface (`/jsonrpc` endpoints), because that is the path cross-chain wallets, TronWeb bridges, and arbitrage bots integrate against. The native TRON REST API surface (used by TronWeb + TronBox directly) has different method semantics (address encoding, resource model, `wallet/*` vs `walletsolidity/*` paths) and would need a chain-specific probe added. That will land as a separate `tron-rest` bench when the demand from integrators using TronWeb directly is clear."
- q: "Does the fastest TRON RPC change by region?"
a: "Often. TRON public infra concentrates operations 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 on the page to a single origin; pick the one closest to where your requests actually originate."
- q: "How is TRON RPC latency measured here, technically?"
a: "One identical JSON-RPC POST (`eth_getBlockByNumber(\"latest\", false)`) every 60 seconds against each provider from each of 3 regions, using the same plain HTTP client the rest of the EVM 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

# Per-cell (region) ranking matrix for scoped badge claims. Chain is
# fixed for the whole bench, so cells key on region alone.
rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="tron"})

# Region is the only dimension: chain is baked into every query.
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: trongrid
name: TronGrid
tag: Tron Foundation's official public API gateway
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 TronGrid's no-key TRON JSON-RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="trongrid", chain="tron"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="trongrid", chain="tron"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="trongrid", chain="tron"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="trongrid", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="trongrid", chain="tron"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="trongrid", chain="tron"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="sgp"}[1h])

- slug: drpc
name: dRPC
tag: Multi-provider RPC load balancer, edge-close routing
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 TRON JSON-RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="tron"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="tron"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="tron"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="tron"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="tron"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="sgp"}[1h])

- slug: publicnode
name: PublicNode
tag: Allnodes-operated, 70+ chains, keyless TRON JSON-RPC path
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 PublicNode's no-key TRON JSON-RPC endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="tron"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="tron"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="tron"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="tron"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="tron"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="sgp"}[1h])
47 changes: 47 additions & 0 deletions harnesses/rpc-capabilities/cmd/script/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,53 @@ func chains() []Chain {
{Slug: "soneium-official", Name: "Soneium Official", URL: envDefault("RPC_URL_SONEIUM_OFFICIAL", "https://rpc.soneium.org")},
},
},
// ─── Hyperliquid HyperEVM (chain 999) — added 2026-07-24. Standard
// EVM JSON-RPC surface bolted onto the HyperCore perps engine.
// Providers live-verified keyless via eth_blockNumber during launch
// audit: hyperliquid-official (rpc.hyperliquid.xyz/evm), dRPC,
// Stakely, Purroof Group, Hypurrscan. Excluded by that sweep:
// Alchemy demo (rate-limited dead), thirdweb (`Invalid chain`
// error on HyperEVM), Grove/Pocket public LB (needs app id at
// public LB path), AllThatNode + Blast API + Chainstack + Gelato
// + Imperator HyperEVM guesses (DNS-fail or 401 without key),
// PublicNode (no HyperEVM subdomain yet).
{
Slug: "hyperliquid",
Name: "Hyperliquid",
Providers: []Provider{
{Slug: "hyperliquid-official", Name: "Hyperliquid Labs", URL: envDefault("RPC_URL_HYPERLIQUID_OFFICIAL", "https://rpc.hyperliquid.xyz/evm")},
{Slug: "drpc", Name: "dRPC", URL: envDefault("RPC_URL_HYPERLIQUID_DRPC", "https://hyperliquid.drpc.org")},
{Slug: "stakely", Name: "Stakely", URL: envDefault("RPC_URL_HYPERLIQUID_STAKELY", "https://hyperliquid-json-rpc.stakely.io")},
{Slug: "purroofgroup", Name: "Purroof Group", URL: envDefault("RPC_URL_HYPERLIQUID_PURROOF", "https://rpc.purroofgroup.com")},
{Slug: "hypurrscan", Name: "Hypurrscan", URL: envDefault("RPC_URL_HYPERLIQUID_HYPURRSCAN", "https://rpc.hypurrscan.io")},
},
},
// ─── TRON (JSON-RPC compat surface only) — added 2026-07-24.
// TRON exposes both a native REST API (wallet/getnowblock) and
// an EVM-compatible JSON-RPC surface at /jsonrpc. We probe the
// JSON-RPC surface because that is the path every cross-chain
// wallet + TronWeb/EVM bridge integrates against. Providers
// live-verified keyless via eth_blockNumber during launch
// audit: TronGrid (api.trongrid.io/jsonrpc — Tron Foundation
// official), dRPC and PublicNode/Allnodes. Excluded by that
// sweep: Ankr (API key required despite public branding),
// Chainstack + NOWNodes + GetBlock + Tatum + BlockPI (all
// require API key on TRON JSON-RPC path), OnFinality + Blast
// API + AllThatNode (no public TRON JSON-RPC gateway). The
// TRON JSON-RPC provider market is materially smaller than
// EVM — most TRON infra vendors expose only the native TRON
// REST API keyless. Native REST API surface is out of scope
// for this cluster; a `tron-rest` bench would need a
// chain-specific probe.
{
Slug: "tron",
Name: "TRON",
Providers: []Provider{
{Slug: "trongrid", Name: "TronGrid", URL: envDefault("RPC_URL_TRON_TRONGRID", "https://api.trongrid.io/jsonrpc")},
{Slug: "drpc", Name: "dRPC", URL: envDefault("RPC_URL_TRON_DRPC", "https://tron.drpc.org")},
{Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_TRON_PUBLICNODE", "https://tron.publicnode.com/jsonrpc")},
},
},
}

filter := strings.TrimSpace(os.Getenv("OCB_CHAINS"))
Expand Down
Loading
Loading