Ethereum Backend Architecture: Why Applications Need a Middleware Layer Between App and Node
It’s a powerful piece of infrastructure that speaks the language of the protocol (JSON-RPC) and has absolutely no obligation to be convenient for product development.
On paper, everything looks trivial: “connect to geth, request a balance, send a transaction, get the hash.” But in practice you suddenly start writing the things you wish you didn’t have to write:
- where to store keys and how to issue addresses from them,
- how to restore a wallet from a seed phrase,
- how to track incoming/outgoing transactions across a large pool of addresses,
- how to implement “real-time” notifications instead of endless polling,
- how all of this survives a service restart without losing state.
That’s where EthBackNode comes in - an open-source Go service that acts as an “adapter” between your application and an Ethereum node, and provides a clean JSON-RPC 2.0 API for typical backend tasks.
Why living directly with Ethereum JSON-RPC is hard (and sometimes expensive)
Ethereum JSON-RPC is the right thing, but it’s low-level. It exposes node capabilities rather than answering the question “how do I build a product?”. During integration, you quickly realize that a single task breaks down into a dozen smaller ones, and half of them aren’t even about blockchain.
For example, “accept a payment to an address”:
- You need to issue an address to the customer.
- You need to ensure the address is tied to a specific order/invoice.
- You need to monitor the network and detect that the transaction actually arrived.
- You need to wait for confirmations (and remember that reorgs happen).
- You need to emit an event to your backend: “payment received, you can ship”.
- You need to persist all this state so that a restart doesn’t pretend “nothing happened”.
If you have one order per day - you can hack it together. If you have dozens/hundreds of addresses and it matters at all for the business - engineering begins.
And here’s the key point: the average backend developer usually wants exactly one thing - a predictable API, understandable events, and minimal attack surface. Not a deep dive into “how a node works.”
What EthBackNode does
EthBackNode is a “lightweight” service you deploy next to your node (or connect to one), and your application talks to it instead. From the outside it looks like a single JSON-RPC 2.0 endpoint; inside it’s a set of modules (managers) responsible for addresses, subscriptions, transactions, and smart contracts.
Key capabilities it exposes via API:
1) Address generation and management
The service can create and manage addresses on the backend side. The important part isn’t that “an address can be generated” (you can do that yourself), but that you get a single place where an address lives as an entity: binding to your userId / invoiceId, persistence, recovery.
2) Wallet recovery from a seed phrase (BIP-39/44)
A separate pain point is wallet import and recovery. EthBackNode supports seed phrases (BIP-39) and derivation (BIP-44), so you can implement “proper” recovery flows without reinventing the wheel.
3) Monitoring incoming/outgoing transactions
The most practical part: watching addresses. The service takes on the job of “watch these addresses and tell me when something happens.” That way you don’t turn your application into a block scanner and you don’t reimplement subscription logic from scratch.
4) Transfers: ETH and ERC-20
EthBackNode can execute transfers of both native ETH and ERC-20 tokens. For a backend it looks like a single “transfer” operation rather than a collection of low-level calls and checks. It also includes fee estimation - without it you either “guess” or run extra requests yourself.
5) Callback notifications for events
Probably the feature that saves the most nerves: event notifications. Instead of asking every N seconds “did it arrive yet?”, you can configure a callback and receive events like “transaction / new block / confirmation” in your backend.
Architectural details that look boring, but solve half the problems
In services like this, what matters isn’t “lots of features,” but how it behaves in real operations.
Go + fasthttp
Performance and deployment simplicity. One binary, fast startup, predictable load handling. In crypto backends this isn’t an abstract “optimization” - it’s a basic necessity: many addresses, many events, many requests.
Node connectivity: HTTP-RPC and IPC
EthBackNode supports connecting to a node via HTTP-RPC as well as via an IPC socket. IPC is often chosen when the service and geth run on the same machine: less network exposure, fewer access-control headaches, and often simply more reliable.
BadgerDB as an embedded store
Another pragmatic choice: an embedded database without requiring external Postgres/Redis from day one. It lowers the barrier significantly: you can bring the service up, point it at a data directory, and it will persist its own state.
Configuration in HCL
HCL is a human-friendly format from the HashiCorp ecosystem. It fits infrastructure workflows (Git, reviews, environments) while being easier to read than 200-line JSON configs.
Modularity: address, subscription, transaction, contract managers
This matters more than it seems. When everything is “one big pile,” every change becomes risky. When boundaries are explicit - testing is easier, extending is easier, understanding is easier.
Where it’s truly useful
EthBackNode doesn’t try to be a “universal indexer” or an analytics platform. Its niche is applied backend infrastructure for products.
- Payment processors: issuing deposit addresses, monitoring payments, notifications, subsequent withdrawals/sweeps.
- Custodial wallets: address pools, withdrawals, status tracking.
- Notification services: one component watches the chain, others consume events.
- Backend-for-frontend: mobile/web APIs don’t know about blockchain - only about business events.
- Exchanges and services with many addresses: mass deposit monitoring without a bespoke “scan the whole blockchain” stack.
A small example: what it might look like in an online store
Suppose you run a small e-commerce business and want to accept payments in ETH and one popular ERC-20 stablecoin.
A possible flow:
- The user places an order → your backend creates an
orderId. - Your backend asks EthBackNode for a new address for that order.
- Your backend registers a callback URL: “if anything arrives on this address - notify me”.
- The user pays.
- EthBackNode detects the transaction and posts an event to your callback: amount, token, hash, status.
- You wait for the required number of confirmations and mark the order as “paid”.
- On schedule (or immediately) you sweep funds to a primary cold/warm storage address.
As a result, the “crypto part” stops bleeding into your store codebase. It lives in a single service where it’s logical to maintain and test it.
Why this matters (without slogans)
In Web3, a lot of complexity isn’t “blockchain magic.” It’s plain engineering routine: addresses, keys, subscriptions, transaction status, confirmations, notifications, state persistence.
EthBackNode lowers the entry barrier for standard backend teams: instead of speaking to the node in its own language, you speak to a service in the language of tasks. And that’s probably the most useful kind of abstraction in applied crypto development: not to hide the blockchain, but to make operating it predictable.
If you have a product that must reliably receive and send ETH/ERC-20 and you don’t want to turn your core code into a pile of JSON-RPC glue — an adapter layer like this looks less like a luxury and more like common sense.
For additional technical explanations and common implementation questions, see the related Ethereum Integration FAQ section dedicated to this topic.