Open app

HostDeFi › Library › EVM RPC endpoints, explained

EVM RPC endpoints — one dialect, every chain

Ethereum, Base, Arbitrum, BNB Chain, Polygon and thirty more networks all speak the same JSON-RPC dialect. What that shared wire actually is, which chain IDs matter, what a read lane should answer — and where a free endpoint ends and infrastructure begins.

Infra explainer · 9 min read · updated September 2026 · not financial advice

"EVM RPC" is shorthand for the Ethereum JSON-RPC specification — the method family that starts with eth_ and answers everything a wallet or backend asks a chain: eth_chainId, eth_blockNumber, eth_call, eth_getBalance, eth_getLogs, eth_getTransactionReceipt, eth_estimateGas, eth_sendRawTransaction. Every chain running an EVM — the Ethereum Virtual Machine — speaks this dialect, which is why the same client library works on dozens of networks. The endpoint URL plus the chain ID is the whole contract between you and a node.

The chain ID is the real identifier

Every EVM network has an EIP-155 chain ID — the number returned by eth_chainId and baked into signed transactions for replay protection. A URL is just a string; the chain ID is proof of which network the node is actually synced to. These are the mainnet lanes our relay serves today, with the IDs each endpoint must answer — the full list including testnet twins lives on /rpc/:

ChainChain IDLane
Ethereum1/rpc/ethereum/
Base8453/rpc/base/
Arbitrum One42161/rpc/arbitrum/
BNB Smart Chain56/rpc/bsc/
Polygon137/rpc/polygon/
OP Mainnet10/rpc/optimism/
Avalanche C-Chain43114/rpc/avalanche/
Monad143/rpc/monad/
Unichain130/rpc/unichain/
ZKsync Era324/rpc/zksync-era/
Linea59144/rpc/linea/
Scroll534352/rpc/scroll/
Mantle5000/rpc/mantle/
Gnosis Chain100/rpc/gnosis/
Sonic146/rpc/sonic/
Berachain80094/rpc/berachain/
Sei1329/rpc/sei/
Cronos25/rpc/cronos/
Oasis Sapphire23294/rpc/oasis-sapphire/

Each per-chain page shows the live upstream ladder that lane falls back across. The same engine also serves the testnet rehearsal networks — Sepolia (11155111), Base Sepolia (84532), Arbitrum Sepolia (421614), Monad testnet (10143) and the rest — so a deployment can be drilled end-to-end before it touches mainnet value.

What a read lane answers — and refuses

The EVM surface splits into three honest buckets. Reads are the bulk of all traffic: state reads (eth_call, eth_getBalance, eth_getCode, eth_getStorageAt), block and transaction reads (eth_getBlockByNumber, eth_getTransactionByHash, eth_getTransactionReceipt, eth_getBlockReceipts), fee reads (eth_gasPrice, eth_maxPriorityFeePerGas, eth_feeHistory, eth_blobBaseFee), log scans (eth_getLogs plus the filter family), and node metadata (net_version, web3_clientVersion). A good lane also passes through provider extensions per-call — simulate APIs, asset/metadata reads, single-transaction trace_/debug_ — where an upstream supports them.

Sends are one method: eth_sendRawTransaction — an already-signed payload. And then there's the bucket a free lane must never open: signing and enumeration. eth_sendTransaction, eth_sign, eth_signTransaction hand the node an unsigned payload or ask it to sign — refused on any sane relay, because a relay that accepts them is asking to hold your keys. Txpool/debug enumeration and whole-world scans are refused for a different reason: they burn an upstream's quota wholesale. An open relay that never gates methods is one billing alert away from vanishing — the worst time to find out is mid-incident.

Our lane enforces this as an explicit method allowlist per chain, with the mechanics that make a shared lane survivable: health-aware rotation (a failing upstream cools with exponential backoff instead of eating every request's latency), method-refusal memory (a node that can't serve a method is skipped for that method only), a micro-cache for immutable reads, and in-flight dedupe with id re-stamping so identical concurrent reads share one upstream call without leaking each other's request ids.

Sends are a different lane

A signed transaction is where "which endpoint" stops being about speed and starts being about ordering. Broadcast into a public mempool, a swap is observable before it lands — the sandwich surface every Ethereum user has met. Our relay treats sends as first-class: on Ethereum a raw transaction races rpc.flashbots.net (Flashbots Protect) and rpc.mevblocker.io first, with the read pool fanning out behind so a protected-path hiccup can't lose it. BNB Chain sends take MEV Blocker's BSC path the same way. On L2s like Base, Arbitrum and Optimism the sequencer model leaves no public mempool worth sandwiching, so sends fan out across the read pool — landing is what matters there.

The invariant underneath: the relay never sees a key. Only raw, already-signed payloads cross it, and signing-shaped methods are refused before they're ever attempted upstream.

When public suffices — and when you need your own lane

Public keyless endpoints are how the whole ecosystem onboards, and for a person clicking in a wallet they're usually right. The honest deal: shared quota, best-effort freshness, occasional 429s at peak. The moment a stall costs you — a trading bot that missed a block, a backend serving stale balances, an agent mid-task — you've crossed into infrastructure: a keyed provider tier, a paid relay lane, or your own node.

Three tripwires mark the crossing in practice: rate limits (429s under load), archive depth (free tiers serve recent state; old receipts and historical state reads need archival capacity that costs real money to store), and accountability (a free endpoint owes you nothing; a paid lane has a commitment someone answers for). On our relay the same split shows up as free keyless reads versus x402 metered lanes — the paid read where the 402 response carries the price and settlement rides the request itself.

Before you trust any endpoint — one call: eth_chainId must return the EIP-155 number you expect, and eth_getBlockByNumber("latest") on two independent endpoints must agree within a block or two. An endpoint that answers the wrong chain ID, or trails the network by minutes, isn't a lane — it's a rumor. Two curls, thirty seconds, settled.

Multi-chain in practice

Because the dialect is shared, multi-chain work is mostly bookkeeping: one method set, N endpoints, N chain IDs to keep straight. The failure modes are bookkeeping too — a wallet pointed at a Base URL while configured for Arbitrum, a bot broadcasting a chain-1-signed transaction to a chain-56 endpoint (it bounces: the signature commits to the ID). Keep the table above as ground truth, verify eth_chainId on any new endpoint before wiring it in, and when you're doing the same read across chains — portfolio snapshots, price checks, log scans — a single relay that speaks one URL shape per chain beats maintaining nineteen provider accounts. Ours is /rpc/; /networks/ shows which of those chains we also run nodes and validators on.

Settle the chain ID in one call

The first check for any EVM endpoint — ask ours:

curl -X POST https://hostdefi.com/api/rpc/ethereum \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId"}'
# → "0x1" — Ethereum mainnet, proven not claimed

Frequently asked

What is an EVM RPC endpoint?

An EVM RPC endpoint is an HTTPS URL that answers the Ethereum JSON-RPC dialect — eth_call, eth_getBalance, eth_getLogs, eth_blockNumber, eth_sendRawTransaction — for a given EVM-compatible chain. Because the dialect is standardized, the same calls work on Ethereum, Base, Arbitrum, BNB Chain and the rest; the only thing that changes is which chain the node is synced to, identified by its EIP-155 chain ID.

Do all EVM chains use the same RPC methods?

The core dialect is identical — every EVM chain answers eth_chainId, eth_call, eth_getBalance, eth_getTransactionReceipt, eth_estimateGas and the standard block/log reads the same way. The differences are extensions: some chains or providers add extras (Polygon's bor_* validator reads, provider-specific simulate or asset APIs), and some methods exist but are refused on public lanes because they are too expensive to serve anonymously.

What is a chain ID and why does it matter for RPC?

The EIP-155 chain ID is the number the network returns from eth_chainId and the number baked into every signed transaction's replay protection. It is the machine-readable answer to "which chain is this endpoint actually serving". An endpoint that answers the wrong chain ID is pointed at a different network than the label claims — the first check to run before trusting any endpoint, free or paid.

Is it safe to send transactions through a public EVM RPC?

Your key is never at risk — the endpoint only sees an already-signed transaction. The real exposure is ordering: a raw transaction broadcast to a public mempool can be observed and sandwiched before it lands. That is why our relay routes Ethereum sends through Flashbots Protect and MEV Blocker first and BNB sends through MEV Blocker — protected paths, with the normal pool racing behind as backup so a protected-path hiccup can't lose the transaction.

Why does my wallet say "wrong network" or fail to switch chains?

A chain-ID mismatch: the RPC URL in the wallet's network entry answers a different eth_chainId than the network expects. It happens when a custom RPC URL is pasted under the wrong chain, when a provider silently serves a different network, or when a cached network list is stale. Re-check the endpoint with a raw eth_chainId call — one curl gives you the number that settles it.

HostDeFi is an educational risk tool, not financial advice. On-chain data can be incomplete or manipulated; a clean check is a dated snapshot, not a guarantee. Always do your own research. Free · no signup · a HostDeFi product