Ethereum's Remote Procedure Call (RPC) system is the backbone of decentralized application (dApp) communication with the blockchain. Whether you're using web3.js in a frontend interface or building backend services in Go, understanding how Ethereum handles RPC requests and responses is essential for developers diving into blockchain technology. This article explores the Ethereum JSON-RPC mechanism, analyzes real Go implementation examples, and walks through creating a custom API — all while optimizing for clarity, depth, and developer relevance.
What Is RPC? A Foundation for Blockchain Communication
Remote Procedure Call (RPC) allows one program to trigger a function on another machine over a network as if it were a local call. In Ethereum, this enables clients — such as wallets, dApps, or nodes — to query blockchain data or send transactions without running a full node locally.
RPC abstracts the complexity of network communication by serializing method calls and parameters into a standard format (like JSON), transmitting them across systems, and deserializing responses back into usable data.
Ethereum uses JSON-RPC 2.0, a lightweight remote procedure call protocol encoded in JSON. It’s language-agnostic, stateless, and ideal for web-based interactions.
Common alternatives to RPC include:
- RMI (Remote Method Invocation): Java-specific; limited to JVM environments.
- JMS (Java Message Service): Focuses on message queuing rather than direct method invocation.
- SOAP: XML-based, verbose, and largely outdated compared to modern REST or JSON-RPC.
In contrast, Ethereum’s choice of JSON-RPC ensures broad compatibility with tools like web3.js, Postman, and native Go clients.
👉 Discover how blockchain APIs power real-world applications today.
Core Components of Ethereum’s RPC Architecture
To understand how Ethereum implements RPC, we must examine its underlying infrastructure:
1. Communication Protocols
Ethereum supports multiple transport layers:
- HTTP-RPC: Default for most development setups (
http://localhost:8545) - WebSocket-RPC: Enables real-time event subscriptions
- IPC-RPC: Inter-process communication; faster but limited to local machine access
2. Serialization Format
All data exchanged via Ethereum RPC is serialized into JSON, ensuring readability and cross-platform compatibility. Parameters and return values are encoded as JSON objects following the RPC 2.0 specification.
3. API Namespaces
Ethereum organizes its RPC methods into namespaces:
eth_: Core Ethereum blockchain operations (e.g.,eth_getBalance)net_: Network-level information (e.g., peer count)web3_: Client identification and utility functionspersonal_: Account management (requires secure configuration)
These namespaces help modularize functionality and control access permissions.
Starting an Ethereum RPC Server with Geth
The Go Ethereum (Geth) client provides built-in support for launching an RPC server. Use the following command to enable HTTP-based JSON-RPC:
geth --rpc --rpcaddr "localhost" --rpcport "8545" --rpcapi "eth,net,web3,personal"Key options explained:
--rpc: Enables the HTTP-RPC server--rpcaddr: Sets the listening address (default:localhost)--rpcport: Specifies port (default:8545)--rpcapi: Defines which API modules are exposed--rpccorsdomain: Allows cross-origin requests (critical for browser dApps)
🔒 Security Note: Never expose --rpc on public interfaces without authentication. For production use, consider secure proxies or WebSocket with origin filtering.You can also start RPC from within the Geth console:
admin.startRPC("localhost", 8545)Testing Ethereum RPC with Postman
Postman is a powerful tool for testing JSON-RPC endpoints manually. Here's how to retrieve your client version:
- Set request type to POST
- Target URL:
http://localhost:8545 Body → Raw → JSON:
{ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 67 }
Example response:
{
"jsonrpc": "2.0",
"id": 67,
"result": "Geth/v1.13.5-stable/linux-amd64/go1.21.6"
}This confirms your node is running and responding to RPC calls.
👉 Learn how developers leverage API access for advanced trading strategies.
Calling Ethereum RPC from Go Code
While JavaScript tools like web3.js dominate frontend development, Go offers high-performance alternatives for backend services.
The go-ethereum library provides the ethclient package for interacting with Ethereum nodes via RPC.
Example: Get Account Balance
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("http://localhost:8545")
if err != nil {
log.Fatal(err)
}
account := common.HexToAddress("0x71c7656ec7ab88b098defb751b7401b5f6d8976f")
balance, err := client.BalanceAt(context.Background(), account, nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Balance: %s Wei\n", balance.String())
}Under the hood, BalanceAt maps directly to the eth_getBalance RPC method:
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
}This demonstrates how Go wrappers encapsulate raw JSON-RPC calls into clean, type-safe interfaces.
Building a Custom Ethereum RPC API
Let’s extend Ethereum’s functionality by adding a custom method: eth_forking, which multiplies an account balance by a given rate.
Step 1: Add Server-Side Logic
In the ethapi package, define a new method in PublicBlockChainAPI:
var rateFlag uint64 = 1
func (s *PublicBlockChainAPI) Forking(ctx context.Context, rate uint64) uint64 {
rateFlag = rate
return rate + 1 // Return incremented value for testing
}Step 2: Implement Client-Side Call in Go
Add a corresponding method in ethclient:
func (ec *Client) ForkingAt(ctx context.Context, rate uint64) (uint64, error) {
var result hexutil.Uint64
err := ec.c.CallContext(ctx, &result, "eth_forking", rate)
return uint64(result), err
}Step 3: Compile and Test
Rebuild Geth:
make gethStart testnet node with RPC enabled:
geth --testnet --rpc --datadir ./node0 consoleTest via Postman:
{
"jsonrpc": "2.0",
"method": "eth_forking",
"params": [3],
"id": 1
}Response:
{ "jsonrpc": "2.0", "id": 1, "result": "0x4" }Now query balance — it should reflect the multiplied value when processed through custom logic.
How Web3.js Relates to Ethereum RPC
Web3.js acts as a convenient wrapper around Ethereum’s JSON-RPC layer:
"To make your app work on Ethereum, you can use the web3 object provided by the web3.js library. Under the hood, it communicates with a local node through RPC calls."
Every call like web3.eth.getBalance() translates into a structured JSON-RPC request sent over HTTP or WebSocket. This abstraction simplifies development but understanding the underlying RPC mechanics helps debug issues and optimize performance.
Data Storage in Ethereum: LevelDB and State Management
Ethereum uses LevelDB — a key-value store written in C++ and wrapped in Go — to persist blockchain state locally.
Each account is stored with its address as the key and state object as the value. The StateDB structure tracks balances, nonces, storage roots, and code hashes:
type Account struct {
Nonce uint64
Balance *big.Int
Root common.Hash
CodeHash []byte
}When you call eth_getBalance, the node retrieves this data from LevelDB using the provided address.
Frequently Asked Questions
Q: What is JSON-RPC in Ethereum?
A: JSON-RPC is a stateless protocol used by Ethereum clients to communicate with nodes. It defines how requests and responses are formatted in JSON, enabling standardized interaction across platforms.
Q: Can I call Ethereum RPC from a browser?
A: Yes, but you must configure CORS using --rpccorsdomain. However, exposing RPC publicly poses security risks. Consider using services like Infura or Alchemy instead.
Q: How does Go implement RPC calls internally?
A: The go-ethereum/rpc package manages connections and message dispatching. It serializes requests into JSON, sends them over HTTP/WebSocket, and unmarshals responses into Go types using context-aware concurrency patterns.
Q: Is it safe to expose my Geth node’s RPC endpoint?
A: Not without safeguards. Avoid enabling sensitive APIs like personal_ publicly. Use firewalls, authentication layers, or private networks in production.
Q: What’s the difference between HTTP and WebSocket RPC?
A: HTTP is request-response only. WebSocket supports persistent connections and event subscriptions (e.g., new blocks or logs), making it better for real-time dApps.
Q: Can I create custom RPC methods in Geth?
A: Yes — as shown in our example, you can extend the ethapi backend with new methods and expose them via --rpcapi. Recompile Geth after changes.
👉 See how institutional-grade platforms handle secure blockchain connectivity.
Conclusion
Ethereum’s RPC system forms the bridge between decentralized applications and blockchain data. From simple balance queries to complex smart contract interactions, every action flows through JSON-RPC.
By exploring both client-side tools like Postman and server-side implementations in Go, we’ve uncovered how Ethereum enables flexible, extensible communication across ecosystems.
Whether you're building a wallet, analytics dashboard, or DeFi protocol, mastering RPC mechanics empowers you to build faster, more reliable blockchain applications.
Understanding the journey from API call to database lookup — through serialization, networking, and consensus — reveals the elegance of Ethereum’s architecture and opens doors to innovation.