Ethereum has emerged as a foundational platform for decentralized applications (dApps), smart contracts, and blockchain innovation. At the heart of its architecture lies the Remote Procedure Call (RPC) mechanism — a critical component that enables seamless communication between clients and Ethereum nodes. This article explores the Ethereum RPC system in depth, covering its underlying principles, implementation details, practical usage via tools like Postman, and even extending it with custom APIs.
Whether you're a developer building on Web3 or a blockchain enthusiast seeking deeper technical insight, this guide offers a comprehensive walkthrough of Ethereum’s JSON-RPC infrastructure.
What Is RPC and Why It Matters in Ethereum
Remote Procedure Call (RPC) allows one system to invoke functions on a remote server as if they were local. In Ethereum, this mechanism powers interactions between dApps and the blockchain through standardized methods. Unlike traditional APIs, Ethereum uses JSON-RPC 2.0, a lightweight remote procedure call protocol encoded in JSON.
This protocol is language-agnostic and operates over HTTP or WebSocket, making it ideal for cross-platform development. When you interact with Ethereum using libraries like web3.js or ethers.js, those calls are internally translated into JSON-RPC requests sent to an Ethereum node.
Key Characteristics of Ethereum RPC:
- Stateless, lightweight communication
- Supports both synchronous and asynchronous calls
- Uses standard HTTP POST or WebSocket transport
- Enables full node interaction: querying balances, sending transactions, deploying contracts
Core Ethereum RPC Communication Layers
To understand how Ethereum handles RPC, we must examine the layers involved in request processing:
- Client Layer: Applications (like web3.js) generate JSON-RPC requests.
- Transport Layer: Requests are sent via HTTP or WebSocket.
- Node Layer: Geth or other Ethereum clients process incoming RPC calls.
- Execution Layer: The actual logic — retrieving data from LevelDB, executing EVM code, etc.
The most common Ethereum client, Geth (Go-Ethereum), exposes these capabilities through configurable RPC endpoints.
Setting Up an Ethereum RPC Server with Geth
You can launch a local Ethereum node with RPC enabled using Geth commands:
geth --rpc --rpcaddr "localhost" --rpcport "8545" --rpcapi "eth,net,web3,personal"Essential Geth RPC Options:
--rpc: Enables HTTP-RPC server--rpcaddr: Sets listening address (default: localhost)--rpcport: Sets port (default: 8545)--rpcapi: Specifies which APIs to expose (eth,net,web3,personal)--rpccorsdomain: Whitelists domains for browser access (e.g.,http://localhost:3000)
⚠️ For security reasons, never expose your RPC endpoint publicly without authentication or rate limiting.
If you're running a frontend application that needs to query the blockchain directly from the browser, enabling CORS is essential:
geth --rpc --rpccorsdomain "http://localhost:3000"Alternatively, within the Geth console, you can dynamically start RPC services:
admin.startRPC("localhost", 8545)Testing Ethereum RPC with Postman
One of the easiest ways to test Ethereum RPC endpoints is using Postman, a popular API development tool.
Example: Fetching Client Version
Send a POST request to http://localhost:8545 with the following JSON body:
{
"jsonrpc": "2.0",
"method": "web3_clientVersion",
"params": [],
"id": 67
}Expected response:
{
"jsonrpc": "2.0",
"id": 67,
"result": "Geth/v1.13.0-stable/linux-amd64/go1.21.5"
}This confirms your node is running and accessible.
👉 Explore secure and scalable ways to connect to blockchain networks using reliable gateways.
Another useful method is checking account balance:
{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0xYOUR_ADDRESS", "latest"],
"id": 1
}The result returns balance in wei — the smallest unit of Ether.
Behind the Scenes: How Go-Ethereum Handles RPC Calls
The Go implementation of Ethereum (go-ethereum) structures its RPC layer meticulously. Let's dive into how a simple balance query works under the hood.
Client-Side Call in Go
In the ethclient package:
func (ec *Client) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) {
var result hexutil.Big
err := ec.c.CallContext(ctx, &result, "eth_getBalance", account, toBlockNumArg(blockNumber))
return (*big.Int)(&result), err
}Here:
ec.c.CallContextsends the JSON-RPC request.- Parameters are serialized automatically.
- Response is unmarshaled into a Go type.
The actual network communication happens via the lower-level rpc.Client, which manages connections, message encoding, and context-based timeouts.
Server-Side Implementation: From API to State Database
On the server side, Ethereum processes the eth_getBalance call through the PublicBlockChainAPI struct:
func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*big.Int, error) {
state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)
if state == nil || err != nil {
return nil, err
}
return state.GetBalance(address), state.Error()
}Eventually, this leads to LevelDB — Ethereum’s embedded key-value store — where account states are persisted.
Data Storage in Ethereum: LevelDB and State Objects
Ethereum uses LevelDB as its default database engine. It stores:
- Blockchain headers
- Transaction logs
- Account states (including balances)
Each account is represented as a state object, containing:
type Account struct {
Nonce uint64
Balance *big.Int
Root common.Hash
CodeHash []byte
}When you query a balance, the node retrieves this object from disk (or cache), extracts the Balance field, and returns it in hexadecimal format.
Extending Ethereum: Building a Custom RPC API
Let’s extend Ethereum with a custom API that multiplies an account’s balance by a user-defined rate.
Step 1: Add New Method in ethapi
var rateFlag uint64 = 1
func (s *PublicBlockChainAPI) Forking(ctx context.Context, rate uint64) uint64 {
rateFlag = rate
return rate + 1
}Step 2: Register the API
Ensure the method is exposed by including it in the API list returned by GetAPIs().
Step 3: Compile and Run
Rebuild Geth:
make gethStart the node:
geth --testnet --rpc --datadir ./node0 consoleStep 4: Test via Postman
Request:
{
"jsonrpc": "2.0",
"method": "eth_forking",
"params": [3],
"id": 1
}Response:
{ "jsonrpc": "2.0", "id": 1, "result": "0x4" }Now modify eth_getBalance logic to multiply the result by rateFlag.
Integrating Custom APIs with web3.js
To use your new method in a browser environment:
- Locate the
ethmodule inweb3.js. - Add a new method definition:
var forking = new Method({
name: 'forking',
call: 'eth_forking',
params: 1,
inputFormatter: [null],
outputFormatter: web3.utils.numberToHex
});- Inject it into the
ethobject.
After reloading the page, call:
web3.eth.forking(3);Frequently Asked Questions (FAQ)
Q: What is JSON-RPC in Ethereum?
A: JSON-RPC is a stateless protocol used to communicate with Ethereum nodes. It allows developers to query blockchain data and send transactions using standardized methods like eth_getBalance and eth_sendTransaction.
Q: Can I expose my Geth node publicly?
A: While possible, exposing your node without protection risks abuse and attacks. Use firewalls, authentication layers (like JWT), or services like Infura or OKX Node Relay instead.
Q: How does web3.js relate to Ethereum RPC?
A: Web3.js is a JavaScript library that wraps JSON-RPC calls. Every function call in web3.js (e.g., web3.eth.getBalance) translates into a corresponding RPC request sent to an Ethereum node.
Q: What databases does Ethereum use?
A: Geth uses LevelDB by default — a fast key-value store written in C++. Other clients may use different backends, but all maintain compatibility with Ethereum’s state trie structure.
Q: Is WebSocket better than HTTP for Ethereum RPC?
A: Yes — WebSockets support real-time event listening (e.g., new blocks or logs). Use --ws in Geth for subscriptions like eth_subscribe.
Q: How do I handle large volumes of RPC requests?
A: Consider load balancing across multiple nodes or using scalable infrastructure like OKX Chain API services for high-throughput applications.
Conclusion
Understanding Ethereum’s RPC mechanism unlocks powerful capabilities for developers building decentralized systems. From basic balance queries to crafting custom APIs, the JSON-RPC interface provides granular control over node interactions.
By leveraging tools like Postman, diving into Go-Ethereum source code, and extending functionality safely, you gain not just operational knowledge — but architectural mastery over one of blockchain’s most vital components.
Whether you're debugging a dApp or designing a high-performance indexer, mastering Ethereum RPC is a crucial step toward Web3 excellence.