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
138 changes: 138 additions & 0 deletions benchmarks/union-rpc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# OpenChainBench. Bench No 253

slug: union-rpc
number: "253"
title: Fastest free Union RPC, live no-key endpoint latency
seo_title: "Fastest free Union RPC 2026"
seo_description: "{{best_name}} leads free Union RPC at {{best_p50}} (block height p50, 24h). 3 providers measured every 60s from 3 regions."
subtitle: HTTP round-trip latency for Tendermint /status queries against every available public Union (union-1) endpoint, audited every 60 seconds from 3 regions.

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

seo_intro: |
Union is a trust-minimised, zero-knowledge cross-chain protocol built on a custom Cosmos SDK chain (chain ID union-1). It enables secure interoperability between Cosmos, EVM, and other ecosystems via ZK proof-based consensus verification — no external validators or multisigs required. The chain uses the standard Tendermint RPC interface; block height is fetched via the /status endpoint. Public keyless RPC nodes are provided by Nodes.Guru, Stake And Relax, and High Stakes. Every provider was live-verified with consecutive block-height probes at launch.

abstract: |
Per-chain member of the RPC latency cluster, extended to Union (union-1).
We measure the round-trip latency of a Tendermint /status query against
every available public Union endpoint that sustains continuous probing:
3 providers at launch, every 60 seconds, from us-east, eu-west and
Singapore. Each provider is probed via a GET /status request
from which the block number is extracted.
The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout)
with a Cosmos-scaled staleness gap (20 blocks, around 80 s at 4 s/block).
The cross-chain view lives on the parent rpc-capabilities benchmark;
this page is the Union-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: GET /status. The result.sync_info.latest_block_height field (string-encoded integer) is extracted as the current block height."
- "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms to 10 s), so percentiles are computed via Prometheus quantile_over_time over the last 24 hours."
- "Call-result classification: ok (parsable block height returned), http_err, jsonrpc_err, stale (block more than 20 behind the cross-provider tip), timeout."
- "This page is part of the per-chain RPC cluster derived from the cross-chain 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=union. Provider coverage at launch: 3 endpoints (Nodes.Guru, Stake And Relax, High Stakes)."

findings:
- "{{best_name}} leads free Union RPC at {{best_p50}} (Tendermint /status p50, 24h) across 3 measured providers."

faq:
- q: "What is the fastest free Union RPC right now?"
a: "{{best_name}} currently leads at {{best_p50}} (Union block height p50 over the last 24h), measured against 3 providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples."
- q: "Which Union RPC endpoints work without an API key?"
a: "3 endpoints sustain continuous keyless probing at launch: Nodes.Guru (rpc-1.union.nodes.guru), Stake And Relax (union-rpc.stakeandrelax.net), and High Stakes (union-rpc.highstakes.ch). Every listed endpoint was live-verified before inclusion."
- q: "What is Union and why does its RPC latency matter?"
a: "Union is a ZK-based cross-chain interoperability protocol with a native Cosmos SDK chain (union-1). It connects blockchains without trusted intermediaries by verifying consensus proofs on-chain. Developers building cross-chain applications, bridges, or omnichain protocols on Union need reliable low-latency RPC access to query transactions, proofs, and chain state."
- q: "Does the fastest Union RPC change by region?"
a: "Often. Community validators like Nodes.Guru and High Stakes host in different datacentres. The region tabs re-scope every number to a single probe origin so you can pick the best endpoint for your user base."
- q: "What makes Union different from other cross-chain protocols?"
a: "Union replaces trusted validator sets and multisigs with ZK consensus proofs, making cross-chain message passing verifiable on-chain. This means no external trust assumptions — the security of the bridge reduces to the security of the underlying chains and ZK proof system."

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="union"})

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: nodes-guru
name: Nodes.Guru
tag: Nodes.Guru public Union RPC, no API key required
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to rpc-1.union.nodes.guru."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodes-guru", chain="union"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodes-guru", chain="union"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodes-guru", chain="union"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="nodes-guru", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="nodes-guru", chain="union"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="nodes-guru", chain="union"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="sgp"}[1h])

- slug: stakeandrelax
name: Stake And Relax
tag: Stake And Relax public Union RPC, no API key required
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to union-rpc.stakeandrelax.net."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="stakeandrelax", chain="union"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="stakeandrelax", chain="union"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="stakeandrelax", chain="union"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="stakeandrelax", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="stakeandrelax", chain="union"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="stakeandrelax", chain="union"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="sgp"}[1h])

- slug: highstakes
name: High Stakes
tag: High Stakes public Union RPC, no API key required
formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to union-rpc.highstakes.ch."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="highstakes", chain="union"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="highstakes", chain="union"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="highstakes", chain="union"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="highstakes", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="highstakes", chain="union"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="highstakes", chain="union"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="us-east"}[1h])
- region: eu-west
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="eu-west"})
series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="eu-west"}[1h])
- region: ap-southeast
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="sgp"}[1h])
11 changes: 11 additions & 0 deletions harnesses/rpc-capabilities/cmd/script/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -1693,6 +1693,17 @@ func chains() []Chain {
{Slug: "cosmos-directory", Name: "Cosmos Directory", URL: envDefault("RPC_URL_SENTINEL_COSMOSDIRECTORY", "https://rpc.cosmos.directory/sentinel")},
},
},
// 2026-08-29 wave-12. Union — Cosmos SDK (union-1), Tendermint /status. Nodes.Guru + Stake And Relax + High Stakes.
{
Slug: "union",
Name: "Union",
Kind: "cosmos",
Providers: []Provider{
{Slug: "nodes-guru", Name: "Nodes.Guru", URL: envDefault("RPC_URL_UNION_NODESGURU", "https://rpc-1.union.nodes.guru")},
{Slug: "stakeandrelax", Name: "Stake And Relax", URL: envDefault("RPC_URL_UNION_STAKEANDRELAX", "https://union-rpc.stakeandrelax.net")},
{Slug: "highstakes", Name: "High Stakes", URL: envDefault("RPC_URL_UNION_HIGHSTAKES", "https://union-rpc.highstakes.ch")},
},
},
// 2026-08-28 wave-11. Fetch.ai (FetchHub-4) — Cosmos SDK, Tendermint /status. Official + PublicNode + Cosmos Directory.
{
Slug: "fetchhub",
Expand Down
4 changes: 4 additions & 0 deletions public/logos/union.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions src/data/provider-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2619,6 +2619,26 @@ export const PROVIDER_REGISTRY: Record<string, ProviderRegistryEntry> = {
"Fetch.ai official public Tendermint RPC node for the FetchHub-4 mainnet. Keyless endpoint maintained by the Fetch.ai / ASI Alliance team.",
twitter: "@Fetch_ai",
},

// ─── Union providers (bench 253) ─────────────────────────────────────
"nodes-guru": {
url: "https://nodes.guru",
description:
"Nodes.Guru community validator and public RPC operator. Runs keyless Tendermint RPC endpoints for multiple Cosmos SDK chains including Union.",
twitter: "@nodes_guru",
},
stakeandrelax: {
url: "https://stakeandrelax.net",
description:
"Stake And Relax community validator providing public keyless Tendermint RPC for Cosmos SDK chains including Union.",
twitter: "@StakeAndRelax",
},
highstakes: {
url: "https://highstakes.ch",
description:
"High Stakes Swiss validator and public RPC operator. Provides keyless Tendermint RPC endpoints for multiple Cosmos SDK chains including Union.",
twitter: "@HighStakesCH",
},
};

/**
Expand Down
3 changes: 2 additions & 1 deletion src/lib/brand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,11 +173,12 @@ const BRANDS: Record<string, Brand> = {
acala: { color: "#E40C5B" }, // acala red/pink (official brand)
interlay: { color: "#1A3BDB" }, // interlay blue (official brand)

// ─── Cosmos SDK chains (benches 247, 250-252) ───
// ─── Cosmos SDK chains (benches 247, 250-253) ───
babylon: { color: "#F8811A" }, // babylon orange (official brand)
chihuahua: { color: "#E05F2A" }, // chihuahua orange-red (official brand)
sentinel: { color: "#00C2FF" }, // sentinel cyan (official brand)
fetchhub: { color: "#3B2D8E" }, // fetch.ai deep purple (official brand)
union: { color: "#6366F1" }, // union indigo (brand kit)
"cosmos-directory": { color: "#1B1B2F", dark: true }, // cosmos directory dark navy

// ─── Bitcoin Cash chain + providers (bench 244) ───
Expand Down
1 change: 1 addition & 0 deletions src/lib/logo-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ const RAW: Record<string, string> = {
chihuahua: "/logos/chihuahua.svg",
sentinel: "/logos/sentinel.svg",
fetchhub: "/logos/fetchai.svg",
union: "/logos/union.svg",
"cosmos-directory": "/logos/cosmos-directory.svg",

// ─── Oracle deviation (bench 025) — additional brand logos ───
Expand Down
Loading