Run a Geth Node: Go-Ethereum on the Ethereum Network
You decide to stop trusting an Infura endpoint with your wallet traffic. Maybe a friend offered to walk you through staking 32 ETH. Maybe your dApp is one rate-limit away from breaking on launch day. Whatever the reason, the next sentence is always the same: you need to run a Geth node.
That sentence sounds heavier than it is. Geth, short for go-ethereum, is the original Ethereum execution client, written in the Go programming language by Jeffrey Wilcke and a global open-source team back in 2014. A modern laptop with a roomy SSD can run one. So can a $30-a-month Hetzner box. The pieces that trip people up are not the install commands. They are the choices around them: which sync mode to pick, which consensus client to pair Geth with, what happens after the Merge, how to keep the node alive when the disk gets full at 2 a.m.
This guide walks the full path. Hardware shopping, install, snap sync, post-Merge pairing with a consensus client, the JavaScript console, accounts and Clef, validator setup, common breakage. By the end you will know exactly what your machine is doing when those white logs scroll past, and what to do when they stop.
What Is a Geth Node and Why It Matters Today
A Geth node is a computer running the go-ethereum client and plugged into Ethereum's peer-to-peer network. The machine downloads blocks. It verifies every transaction. It runs smart contracts on the Ethereum Virtual Machine. It keeps a synchronized copy of the world state. From outside, it looks like a quiet process listening on a few ports. Inside, it is a stubborn bookkeeper that refuses to take anyone else's word for the ledger. It keeps its own copy of the blockchain data, lets your wallet check account balances or submit transactions to the chain, and lets your dApp interact with the blockchain directly instead of through someone else's API.
Why does any of this matter in 2026? Concentration. Most of the public dApp traffic on Ethereum flows through a small handful of hosted RPC providers — Infura, Alchemy, QuickNode, and a few smaller shops. Infura alone served more than 600 billion blockchain requests last year. They are reliable, mostly. They are also a single point of failure: when a provider goes down in one region, half the wallets pointed at that endpoint show stale balances and stuck transactions until somebody fixes it. Run your own Geth node and that whole class of failure stops being your problem.
It is also a numbers game. Etherscan's node tracker counts roughly 13,678 active Ethereum nodes worldwide as of April 2026. The United States holds 37.55% of those — about 5,171 nodes. Germany has 16.05%. China, 12.06%. Spinning up one more node is not heroic. It is just useful, and the network keeps quietly counting on people doing it.
There is a deeper reason too. Ethereum stays Ethereum because anyone can verify it without asking for permission. Geth is the most popular client doing that verification. Every time another independent operator brings a new Geth node online, capturing the chain gets a notch harder. That logic predates the Merge and has not weakened since.

Geth, Go Ethereum, and the Ethereum Protocol
Three names, one project. People mash them together in conversation and nothing breaks, but here is the actual breakdown.
Ethereum the protocol is not code. It is a spec, written across the yellow paper and a long pile of EIPs, and anybody can write a client for it. Go Ethereum, sometimes written go-ethereum, is the Go-language implementation of the Ethereum protocol. Geth is the command-line program inside Go Ethereum that you run on the command line, configure with flags, and use to interact with the Ethereum network. Everything else in the repo is libraries and helpers wrapped around it. A "Geth node" is just a machine where you have started Geth, pointed it at a `chaindata` directory, and let it talk to the Ethereum mainnet.
Different clients exist for the same protocol. Nethermind, in C#. Besu, in Java. Erigon and Reth, both in Rust. Same wire format. Different code, different performance, different histories.
Geth is the oldest of them. Over 400 people have contributed; Péter Szilágyi has run point on it for years. Home is the Ethereum Foundation; source is at ethereum/go-ethereum on GitHub; the license is the GNU General Public License, GPL-3.0 for the binaries and LGPL-3.0 for the library code. The current stable, as I write this, is v1.17.2 — codename "EMF Suppressor" — out March 30, 2026. It patched three CVEs (CVE-2026-26313, -26314, -26315) and taught the client how to sync against chains whose pre-Prague history has already been pruned.
A handful of sister tools ship next to Geth. Clef is a separate signer that keeps your private keys away from the node itself. Abigen turns a Solidity ABI into Go bindings you can actually use. The `evm` tool lets you run bytecode in isolation when you need to debug something specific. None are required. You will end up reaching for at least one within a week.
Why Run a Node: Privacy, Speed, Sovereignty
Most people who run their own Geth node land there for one of three reasons. Privacy first. When a wallet talks to a hosted RPC, that provider sees every address, every contract call, and every quote request. A self-hosted node breaks that link. The provider does not exist. Your wallet asks your machine, your machine asks the network, and only your machine sees the pattern.
Performance is the second reason. Hosted RPCs throttle. Infura's free tier caps at 100,000 requests per day; the Team tier costs $225 per month for 75 million daily requests. A local node serves your traffic at memory speed with zero per-call cost. For a dApp pulling state on every page load, the latency difference is noticeable. For an arbitrage bot scanning the mempool, it is the difference between making the trade and watching it fly past. Mainnet itself processed about 200.4 million transactions in Q1 2026, peaking at 2.88 million transactions on January 16, so a node that can keep up with the network is doing real work.
Sovereignty is the third. If you stake on Ethereum, the network expects your validator to publish a block when its turn comes. Outsourcing that publication to a shared RPC is technically allowed and operationally fragile. Run your own execution layer client and you control your slot. The same goes for serious dApp builders, on-chain analysts, MEV searchers, and anyone whose business depends on Ethereum being available specifically to them.
After the Merge: Geth and Your Consensus Client
Before September 2022, a single Geth process did everything. It peered with the network. It ran the EVM. It picked a winner among competing blocks through proof-of-work mining. The Merge split that work in half. Geth still runs the EVM and keeps state. A second program — the consensus client — now handles proof-of-stake: gossiping blocks among validators, voting on what counts, and telling Geth which fork is canonical.
So every modern Geth setup is a pair, not a single process. Pick a consensus client to run alongside it. The choices are Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim), and Lodestar (TypeScript). The two processes talk to each other over a private channel called the Engine API, gated by a JWT secret you generate once and pass to both sides with `--authrpc.jwtsecret`.
Start Geth alone, without a consensus client, and the logs will say something like "Post-merge network, but no beacon client seen. Please launch one to follow the chain!" The node will sit there, polite and useless. Geth by itself is not a complete Ethereum node anymore. The pair is the unit.
Client diversity matters here. The Ethereum community asks operators to spread out across implementations on both sides of the split, because if more than two-thirds of validators end up on the same buggy client, those validators face the full 32 ETH slashing penalty when something breaks. The latest figures from clientdiversity.org put Geth at around 41% of execution clients in 2026; Stake.fish's 2026 report says closer to 50%. Either way, that is down from over 86% in 2023, but still above the 33% safety threshold the community considers ideal. Which is why some new operators deliberately pick Nethermind, Besu, or Reth — even though Geth is the easier first step.
Pectra, the Prague + Electra upgrade that activated on May 7, 2025, also reshaped what an operator does day to day. EIP-7251 raised the maximum effective balance per validator from 32 ETH to 2,048 ETH. A staking operator who used to babysit 1,000 individual validators can now consolidate them into 16 large ones. EIP-6110 cut the wait between depositing and going active from roughly 12 hours to about 13 minutes. EIP-7002 gave validators the ability to trigger their own withdrawal, instead of begging the original deposit signer to do it. Running a Geth-paired validator stack in 2026 is materially simpler than it was in 2024.
Hardware: CPU, RAM, and SSD for Geth Nodes
The honest hardware bar in 2026 is higher than the official docs admit. Plan for the next three years, not the last three.
| Component | Geth official docs (2023, still current) | Operator-grade reality (Cherry Servers, Chainstack, 2026) | Archive node (path-based, v1.16+) |
|---|---|---|---|
| CPU | Quad-core | 8-core / 16-thread modern AMD or Intel | 8+ cores, high single-thread |
| RAM | 16 GB | 32 GB minimum, 64 GB smoother | 64 GB or more |
| Storage | 2 TB SSD | 4 to 8 TB NVMe SSD | 4 TB NVMe (path-based, ~2 TB used) |
| Network | 25 Mbps | 300 to 500 Mbps for full RPC | 300+ Mbps |
| Power | UPS recommended | UPS strongly recommended | UPS required |
Storage is the line that surprises new operators. A snap-synced, pruned Geth full node sits around 650 GB today. Geth's own docs say it adds about 14 GB a week. Add a consensus client. Add a few months of growth headroom. Add any L2 RPC traffic you plan to serve. You land between 4 and 8 TB of NVMe, fast.
A word on disk type. SATA SSDs technically work. They also stall syncs and miss attestations under load. NVMe is not optional in 2026. Spinning disks have not been viable for years. If your provider only offers SATA on the cheap tier, pay up. The math is brutal: a stuck SATA disk costs you missed validator rewards every epoch.
RAM is trap number two. The official Geth hardware page, last touched in 2023, still says 16 GB. By 2026, Cherry Servers, Chainstack, and bacloud have all landed on 32 GB as the working floor, with 64 GB as the comfortable answer. Geth caches a meaty slice of state in memory. The consensus client wants its share. Add Prometheus, Grafana, anything else you actually use, and 16 GB runs out fast.
CPU is the easiest of the three. Modern desktop chips have more headroom than Geth knows what to do with. Clock speed is barely the question. Core count and modern instructions matter more. AVX2 keeps signature verification fast. Eight cores keep a sync surge from locking up your machine. Looking ahead, the block gas limit jumped from 30 million to 45 million to 60 million between mid-2024 and November 2025. The Ethereum Foundation has been telegraphing 100M+ through 2026. That is the curve you are sizing against, not last year's load.
Geth Sync Modes for the Ethereum Blockchain
Sync mode is the biggest knob a new Geth operator turns. Pick wrong and you waste a week downloading data you did not actually need.
| Mode | What it stores | Disk in 2026 | Sync time | Use case |
|---|---|---|---|---|
| Snap (default) | Recent state + recent receipts | ~650 GB, +14 GB/week | 1 to 3 days (faster on NVMe) | dApps, wallets, validators |
| Full | Recent state + every header back to genesis | ~1 TB | 3 to 5 days | Verifying every block from genesis |
| Archive (path-based, v1.16+) | Historical state via reverse diffs | 1.9 to 2.0 TB | 1 to 2 weeks | Most archive use cases |
| Archive (legacy hash-based) | Every historical state, every receipt, every trie | 12 to 20 TB | 4 to 8 weeks | DeFi indexers needing eth_getProof |
Snap is the default, and almost always the right choice. It grabs a recent state snapshot from peers, then quietly fills in headers and receipts behind that. You get a working Geth node in a couple of days on decent hardware. It serves wallets, dApps, and validators just fine. The one thing it cannot do is answer historical questions like "what was Vitalik's balance on October 7, 2017?" If you do not care about that, you are done thinking about sync mode.
Full sync still ships. Most people do not need it. Full mode walks every block back to the genesis block and re-runs every transaction, so the client can verify the blockchain end-to-end instead of trusting the snap snapshot. Useful if you are paranoid about snap, or if you are seeding a pruned-history archive. Not useful for normal operations.
Archive is the heavy one, and 2025 is when archive nodes changed. Until the v1.16 release, an archive node meant 12 to 20 TB of fast SSD — essentially a small server. v1.16 shipped a path-based archive mode that stores historical state as reverse diffs and cuts disk requirements to roughly 1.9 to 2.0 TB on mainnet. That brings Geth's footprint down close to Erigon's (~1.77 TB). The trade-off, at first, was that path-based archive did not support historical Merkle proofs (`eth_getProof` on old blocks). DeFi indexers and other proof-heavy workloads still needed the legacy hash-based archive. v1.17.0, in February 2026, added proof support to the path-based mode in some configurations — check the release notes for your exact version. The typical archive operators are block explorers, forensic teams, and serious analytics shops. Most people reading this guide will never need one.
One footnote. Light-client mode, the old `--syncmode "light"` flag, has been deprecated and is no longer maintained on mainnet. If a 2026 tutorial tells you to start Geth in light mode, the tutorial is out of date.

Install Geth on Ubuntu, macOS, and Windows
The install step is short. Pick the platform you actually plan to run on, not the one on your laptop.
Linux / Ubuntu (the workhorse)
Most production Geth nodes live on Ubuntu. The Ethereum team maintains a PPA, and three commands through the Ubuntu package manager get you a working binary:
```
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
```
Run `geth version` to confirm. The PPA tracks the latest stable. In production you usually pin a known-good build with something like `apt-get install ethereum=1.17.2-...` and upgrade on a calmer schedule than "whenever apt feels like it."
macOS (developer-friendly)
On macOS, Homebrew does the work. Two lines:
```
brew tap ethereum/ethereum
brew install ethereum
```
Macs are great for testnet experiments and dApp development. Almost nobody runs a mainnet validator on a Mac, though. Power management is too aggressive, and macOS will happily put your beacon node to sleep at the wrong moment.
Windows
There are `.exe` installers and `.zip` archives on geth.ethereum.org and on the project's GitHub releases page. Click through the installer, let it edit your PATH, then open a Command Prompt or PowerShell and run `geth version`. It should answer.
Windows Server can host a perfectly fine stand-alone Geth node. Validator stacks tend to lean Linux because the consensus clients ship Linux-first, but you can mix and match if you want. The rest of this guide writes its commands in Linux shell style. Translating to PowerShell is mostly a matter of path separators and a different way of doing line continuations.
Docker
`docker pull ethereum/client-go:stable` gets you a clean container. Docker is by far the easiest way to test a new Geth release without messing up your host. It is also a respectable production deployment if your team is already container-shaped. One caveat: the Docker volume holding `chaindata` has to be on NVMe. Putting it on a regular EBS volume, an HDD datastore, or a Docker Desktop volume on a Mac will reproduce every "stuck sync" thread on Reddit.
Building from source
Source builds want Go 1.23 or newer, plus a C compiler. `make geth` builds just the node. `make all` gets you the full utility suite: geth, clef, abigen, evm, devp2p, rlpdump. Reach for source builds when you want a release that has not been packaged yet, or when you have a private patch you do not feel like maintaining as a fork.
Run Geth: First Sync and the JSON-RPC Console
Binary installed, jwt secret generated, consensus client ready. The first command on a mainnet box looks roughly like this:
```
geth \
--mainnet \
--datadir /var/lib/geth \
--syncmode snap \
--http \
--http.addr 127.0.0.1 \
--http.port 8545 \
--http.api eth,net,web3 \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8551 \
--authrpc.jwtsecret /etc/geth/jwt.hex \
--authrpc.vhosts localhost
```
Three ports do the work here. 30303 over TCP and UDP — that is your peer-to-peer line to the rest of Ethereum. 8545, the HTTP-RPC door your wallet and scripts come through. 8551, the Engine API, reachable only by your consensus client and gated by the JWT secret.
To poke at the running node, attach the Geth console. (It is a JavaScript console glued to the node's APIs.) Open a second shell:
```
geth attach http://127.0.0.1:8545
```
Now every JSON-RPC method is a JavaScript call. `eth.blockNumber`. `net.peerCount` (thirty-ish is healthy on mainnet). `eth.syncing` returns `false` once the node has caught up. Want a balance? `web3.fromWei(eth.getBalance('0x...'), 'ether')`. That is the whole interactive surface.
Then there is the log file. Watch it. The line you want to see is `Imported new chain segment`. It means Geth has caught the head and is keeping pace, eating each new list of transactions off the Ethereum blockchain network as the network ships them. If your logs say `Looking for peers` and nothing else, the firewall is dropping inbound P2P. Open 30303 on TCP and UDP, restart Geth, try again. That is the fix nine times out of ten.
For automation, every Ethereum library worth using speaks JSON-RPC over HTTP, or over WebSocket if you also pass `--ws`. ethers.js. web3.js. viem. The Go client. The Python client. They all treat your local Geth node exactly like Infura — point them at `http://127.0.0.1:8545` and stop. The code stays the same. The only thing that changed is who answers the call.
Use Geth: Accounts, Clef, and Transactions
Geth still ships an account manager, but the modern recommendation is to separate signing from the node by running Clef. Clef is a tiny separate program that holds your keys and asks for explicit confirmation every time something tries to use them.
Creating an account through Clef looks like this:
```
clef newaccount --keystore /var/lib/geth/keystore
```
Clef wants a password of at least ten characters. It writes an encrypted keystore file and hands you back an address. That address is an externally-owned account (EOA) — the same flavor a hardware wallet or MetaMask would create. Nothing exotic.
To make Geth use Clef, point the node at Clef's IPC socket: `--signer=/path/to/clef.ipc`. From that moment on, every transaction request, whether it comes from the Geth console or from a dApp using the JSON-RPC API, has to be approved at the Clef terminal. That is the model the Geth team recommends in 2026. Keys live outside the node. The node, by itself, cannot spend a single wei.
A transfer from the console looks like this:
```
eth.sendTransaction({
from: '0xca57f3b40b42fcce3c37b8d18adbca5260ca72ec',
to: '0xce8dba5e4157c2b284d8853afeeea259344c1653',
value: web3.toWei(0.1, 'ether')
});
```
Clef pops up. You confirm. The transaction enters the mempool, and a few seconds later it is in a block. Behind that single line, Geth did the nonce lookup, the fee estimation, the signature handoff to Clef, the broadcast, and the inclusion check. That same loop runs under every dApp.
For more involved work, the same JSON-RPC endpoint accepts transaction submissions, event subscriptions, view function calls, and traces. From a library's point of view, your local Geth instance is indistinguishable from a hosted node — except it is faster, free per call, and yours.
Validator Setup: Stake Ether and Earn Rewards
Once your Geth node is synced and paired with a consensus client, adding a validator is mostly configuration. You do not install a new node. The execution layer (Geth) keeps doing its job. The consensus client picks up a validator role on top: it signs attestations every epoch, and when the protocol selects your validator, it asks Geth to assemble the block contents.
There are three moving parts to bring online. First comes the 32-ether deposit. You generate validator keys with the official deposit CLI, send the deposit transaction to the contract on mainnet, and wait for activation. Second is the validator client process. It runs alongside the beacon node, holds your signing key, and signs attestations on schedule. Third is MEV-Boost or a relay setup, if you want transaction-ordering rewards on top of the base reward. Geth itself does not run the validator. The consensus client does. Geth is the execution endpoint that builds the actual block payload when your validator's slot comes up.
Day-to-day, validators care about three numbers: missed attestations, sync uptime, and disk pressure. Missed attestations almost always trace back to a node that fell behind the head, which in turn almost always traces back to disk I/O or peer loss. Disk pressure on Geth is the classic culprit. Slip below the recommended NVMe spec, and your attestation effectiveness drops. Rewards drop with it.
Most home-stakers run a dedicated mini-PC: an Intel NUC, a Beelink, or a custom Ryzen build. Hardware lands somewhere between $800 and $2,000 one-time. Power and internet add another $10 to $20 a month. Coin Bureau's 2026 breakdown puts a professional Hetzner validator at $30 to $40 a month, an AWS basic full node under $100, and an AWS archive node around $1,500. Solo staking yields about 4% APY on the base reward and climbs to 5–6% with MEV-Boost; on home hardware, that breaks even in roughly 4 to 6 months at today's ether price. As of late 2025 the network had about 1.06 million active validators, holding 35 to 37 million ETH (29 to 31% of supply). Lido alone controls 27.7% of the staked total. Coinbase, 8.4%. Every additional independent validator quietly tilts that concentration the other way, which is much of why solo staking is still a thing people do.
Testnet vs Mainnet: Where to Run an Ethereum Node
Do not start on mainnet. Mistakes are cheap on a testnet, and they do not get cheaper than free. Geth handles every supported network with a single flag.
The two Ethereum testnets you should care about in 2026 are Holesky, the long-running validator-focused testnet, and Sepolia, the lighter, application-focused one. Want a Sepolia Geth node? Swap `--mainnet` for `--sepolia`. Holesky? `--holesky`. Your data directory should be a separate path from your mainnet `chaindata`. If you reuse the same folder, Geth refuses to start because the chain ID does not match — which is the kind of error message that takes thirty seconds to fix and an hour to find.
Testnet ether is free. Faucets like the Paradigm Multifaucet and the Sepolia faucet at faucet.sepolia.dev will hand out enough Sepolia ETH to deploy contracts, run integration tests, and send several thousand transactions. The "ether" is fake. Everything else is real: the EVM behaves the same, the JSON-RPC API is the same, the coupling to your consensus client is the same, the operational pain is the same. Run your stack on Sepolia for a week before pointing anything at mainnet.
Old testnets are gone. Ropsten, Rinkeby, Kovan, Goerli — all retired. If a tutorial still tells you to start Geth with `--ropsten`, it is pre-Merge and you should close the tab.
For a true private environment, run your own network. Geth's `--dev` mode boots a single-node chain in seconds, which is great for unit tests. For multi-machine private networks, write a custom `genesis.json`, share it across the boxes, and start each Geth process with `--datadir` pointing at a fresh chaindata folder. The Kurtosis framework packages all of this behind one command if you would rather not do the wiring by hand.
Common Geth Node Issues and Troubleshooting
Most Geth incidents fall into a small set of patterns. The fix is usually fast once you recognize the shape.
Sync stalled at a few percent. Your Geth node is online but not catching up: peer count is too low, your bandwidth is saturated, or the disk cannot keep up. Check `net.peerCount` in the console. If it is under fifteen, your inbound P2P port is firewalled. Open 30303 TCP and UDP. If it is healthy, run `iostat -xm 5` on Linux during sync; if the SSD is hitting 100% utilization, you are I/O bound and need faster storage. A version-specific note: Geth v1.17.1 (March 3, 2026) was released specifically to fix a snap-sync regression in v1.17.0; if you are stuck on that version, upgrading is the fix.
"Post-merge network, but no beacon client seen." The consensus client is not running, the JWT secret does not match, or the consensus client is pointed at the wrong AuthRPC port. Check the JWT path, port 8551, and that both processes were started with the same secret file.
Disk fills up overnight. Snap sync can spike disk usage during the initial state-healing phase. Pruning runs automatically afterwards. If you started on a 1 TB SSD, the head will eventually catch you. The fix is always more space, not more aggressive pruning, because Geth's pruning is already tuned. Move chaindata to a larger NVMe and rsync over.
Geth won't start: "database compatible with this version of geth not found." A previous run was on a different chain ID, an older Geth version, or a corrupted state. The `chaindata` folder is mismatched. Either resync into a fresh datadir or roll back to the prior Geth release.
Validator missing attestations. If your Geth node is reading every new block correctly but the validator still misses attestations, look at disk pressure first, network second, CPU last. The pattern in monitoring tools like Netdata is unmistakable: PSI (Pressure Stall Information) for disk hits 30% or more during attestation windows.
RPC requests slow. A heavy dApp client hammering `eth_getLogs` or `debug_traceTransaction` can saturate Geth's CPU. Move that traffic to a separate node, or use `--rpc.gascap` and `--rpc.txfeecap` to bound expensive calls.
A final habit. Watch logs continuously during the first week to keep Geth running cleanly under real load. Tools like Netdata, Prometheus + Grafana, or simply `journalctl -fu geth` make the early failure modes obvious. By week two, alerting on missed attestations and disk fill rate is enough.
Geth vs Other Ethereum Clients: Trade-offs
Geth is the default first step. It is not the only one, and the answer to "should I switch" depends on what you need.
| Client | Language | 2026 share (clientdiversity.org / Stake.fish range) | Strengths | Use if... |
|---|---|---|---|---|
| Geth | Go | 41 to 50% | Stability, large community, official defaults | You want the safest first node |
| Nethermind | C# | 25 to 38% | Fast snap sync, plugin-friendly, Hyperledger | You want a non-Go execution client |
| Besu | Java | 10 to 16% | Enterprise features, permissioned chains, Hyperledger | You operate a permissioned chain |
| Reth | Rust | 2 to 8% | Modular, modern codebase, fast sync | You want the leading Rust client |
| Erigon | Rust/Go | 3 to 7% | Compact archive (~1.77 TB), fast historical queries | You need a small archive node |
The community argument for picking something other than Geth is client diversity. If a single execution client crosses the two-thirds supermajority on mainnet and ships a buggy upgrade, validators on that client risk slashing. Splitting your validator fleet across two clients halves that risk. For a single home staker, the math is more boring: pick the one you can keep alive, run it well, and only switch if you have a specific reason. The node architecture is similar across all of them, so swapping later is easier than it sounds. Erigon and Reth in particular are now mature enough to be primary clients, not curiosities.