What's Behind Your RPC: Node Types, Clients, and Why It Matters
I’m currently open to collaborations and development projects across blockchain, smart contracts, and full-stack systems, feel free to connect if you’re building something interesting.
Every interaction with Ethereum goes through a node, and not all nodes are built the same. Some only store the latest few hundred blocks, others keep every state since genesis. Some clients return rich traces, others silently drop unsupported RPCs. Knowing which kind of node and client you’re using can save hours of debugging and confusion.
In this post, we’ll unpack how Ethereum nodes actually work from Full, Archive, and Light nodes to the major execution clients like Geth, Nethermind, Erigon, and Besu. You’ll see how their data retention, sync methods, and RPC implementations affect your ability to debug, trace, and replay transactions.
Finally, we’ll look at when it makes sense to run your own node instead of relying on a shared RPC provider, what it really costs, and how to decide what’s worth hosting yourself.
Node Types
Before we can talk about eth_call and debug_traceCall, we need to address the next question: what kind of node are you connected to?
The type of Ethereum node you use determines what data is available and how far back you can go when simulating or tracing transactions. Picking the wrong one can lead to confusing “missing state” errors or incomplete traces.
Full Node
A full node stores all block headers and bodies and enough recent state data to validate the blockchain and serve queries for the latest part of the chain.
It does not store the full historical state for every block, only a small recent slice of it. Commonly around the most recent 128 blocks. Older intermediate states are pruned to save resources.
Full nodes validate the blockchain one block at a time, downloading and checking both the block’s transactions and its corresponding state changes.
There are variations in how they sync: some begin at the genesis block, verifying every block in history, while others like Geth’s snap sync start from a more recent, trusted checkpoint and work forward from there.
No matter the sync method, a full node keeps only a local copy of the most recent state. Anything older is removed to conserve disk space. This doesn’t mean the data is gone forever. The node can reconstruct older state by replaying transactions from earlier blocks if needed, though this is slower than reading it directly from storage.
Historical access:
Can handle queries for recent blocks, but cannot retrieve account/storage state for older blocks without reconstructing it.
Typical use cases:
Maintains a complete copy of the blockchain’s data, but periodically prunes older state so it doesn’t retain every state entry all the way back to genesis.
Actively takes part in validating the chain by checking every block and its associated state transitions.
Can supply any state data either directly from its local storage or by rebuilding it from stored snapshots.
Contributes to the peer-to-peer network by responding to requests and sharing data with other nodes.
Gotcha:
If you try to eth_call or debug_traceCall on a block from months or years ago, a full node will likely fail because that state was pruned long ago.
Archive Node
An archive node contains everything a full node has, plus a complete record of historical state for every block since genesis. That means it retains every account balance, contract storage value, and state trie exactly as it was at any point in time without pruning.
When you query an archive node for state at block 5,000,000, it can return the data instantly without having to reconstruct it from earlier blocks. This makes it ideal for developers and services that require precise historical data.
Typical uses:
Provides instant access to historical balances, contract storage, and state at any block in history.
Supports detailed transaction tracing (
debug_traceCall) for any past block without extra computation.Powers block explorers, analytics platforms, historical research, and dApps that need deep history.
Trade-offs:
Running an archive node demands significantly more storage and resources than a full node. Because of this, many teams rely on RPC providers that offer archive access for a fee rather than hosting their own.
Light Node
A light node only stores block headers and relies on full or archive nodes to fetch any additional data it needs. It verifies that data using cryptographic proofs contained in the headers, allowing it to confirm correctness without holding the full chain.
This makes light nodes extremely resource-efficient, they can run on devices with limited storage or bandwidth but also means they are dependent on other nodes for most queries.
Typical uses:
Runs in wallets, mobile apps, or embedded devices where storage and CPU power are limited.
Verifies transactions and block headers without downloading the entire chain.
Quickly syncs with the network for fast startup times.
Limitations:
Cannot perform
debug_traceCallbecause it doesn’t hold execution data.Even
eth_callis only possible if the connected full/archive node supports it for the requested block.Historical queries depend entirely on the capabilities of the upstream node.
Different Node Clients, Different Behaviors
When you run an RPC call like eth_ or debug_, you are not talking to “Ethereum” as a single system you’re talking to a specific implementation of the Ethereum protocol, known as a client.
Ethereum has multiple execution layer clients, all built by different teams, in different programming languages, and with their own design choices. They all follow the same consensus rules, but they can vary in:
Features available: Some clients support certain
debug_ortrace_RPC methods; others don’t implement them at all.Output formats: Even if two clients support the same method, the JSON structure of the result can be different.
Performance characteristics: How quickly a client can serve historical data or produce traces depends on its database design and sync mode.
Sync methods & pruning: Clients differ in how they sync from the network and what historical state they keep locally.
Popular Execution Layer Clients
Geth: Go Ethereum; the most widely used client in the ecosystem.
Nethermind: C#-based client known for performance and flexibility.
Erigon: Go-based, highly optimized for archive nodes and fast queries.
Besu: Java-based client, often used in enterprise and permissioned networks.
These clients are interchangeable in terms of consensus rules, but their RPC capabilities and performance differ, especially when it comes to advanced debugging/tracing.
When You Might Want to Run Your Own Node
Running your own node can be the right move if:
You need guaranteed access to features like
debug_traceCallor archive history without relying on a provider’s limitations.You require predictable performance for high-frequency calls (avoiding shared RPC congestion or rate limits).
You want full control over sync mode, pruning, and client configuration for specialized debugging or analytics.
You need data privacy (queries don’t leave your infrastructure).
Cost note:
A full node can often run on a mid-range cloud VM or dedicated server, but you’ll still pay for compute, storage, and bandwidth easily $50–$150+/month if hosted.
An archive node is a serious commitment: multi-terabyte storage, high IOPS SSDs, and substantial RAM. Cloud-hosted archive nodes can cost $400–$1,000+/month.
Self-hosting can reduce cloud costs but comes with hardware purchase, maintenance, and electricity bills.

