TopGit
GitHub Repo Review

Geth (Go Ethereum): the Ethereum execution client

ethereum/go-ethereum
GTopGit review image for ethereum/go-ethereum
Review by Topgit.dev for ethereum/go-ethereum, with GitHub repository stats and README context.
Quick verdict

Geth (Go Ethereum) is worth running if you want your own authoritative view of Ethereum chain state rather than depending on someone else's node. Skip it if you only need occasional reads — a hosted provider saves the sync time and the beacon-chain pairing Geth needs post-Merge; keep it if you're writing Go code against abigen-generated contract bindings or need archive-level history for indexing.

Stars
★ 51.4k
Forks
⑂ 22.2k
Contributors
👥 1.3k
Language
Go
License
LGPL-3.0
Topic
Backend
Updated
Oct 2026
Homepage
GitHub

What is Go Ethereum (Geth)?

Geth (Go Ethereum) is the Go-language implementation of the Ethereum protocol's execution layer, published as both a library and a set of CLI executables in the ethereum/go-ethereum repository. The main binary, geth, runs as a full, archive, or light node and talks to your code over JSON-RPC exposed on HTTP, WebSocket, or IPC transports.

Geth executables and what each one does

  • ✓geth — the main CLI client; runs full (default), archive, or light node modes and exposes JSON-RPC over HTTP, WebSocket, or IPC.
  • ✓abigen — turns a contract's ABI (and bytecode, if you have it) into a type-safe Go package, so you call contract methods like normal Go functions instead of hand-rolling ABI encoding.
  • ✓evm — a standalone EVM you feed raw bytecode to for opcode-level debugging, e.g. `evm --code 60ff60ff --debug run`.
  • ✓devp2p — pokes at the networking layer directly, without spinning up a full blockchain.
  • ✓rlpdump — decodes Ethereum's RLP wire format into something you can actually read, e.g. `rlpdump --hex CE01...`.
  • ✓Snap sync by default — `geth console` downloads state without replaying the entire chain's history, which the README calls very CPU intensive to do the long way.
  • ✓Built-in JS console (via `geth console` or `geth attach`) that speaks web3 methods plus geth's own management APIs.
  • ✓Config via TOML file (`geth --config file.toml`) instead of long flag lists, with `dumpconfig` to export what you're already running.
How this repository's GitHub stars have grown over time. Source: star-history.com.View the star history ↗

When to run your own Geth node

  • •Backing a dApp with your own RPC endpoint instead of trusting a third-party provider's view of chain state.
  • •Generating type-safe Go bindings from a contract ABI with abigen, so a Go backend can call a smart contract without writing raw calldata by hand.
  • •Debugging EVM bytecode in isolation with the evm tool before it's wrapped in a full transaction.
  • •Running a private or dev-mode network to test contracts in CI via the Simulated Backend or Dev Mode, without touching mainnet or a testnet.
  • •Joining the Holesky test network to try contract deployments with play-Ether before touching real funds.

Building Geth from source

Building from source needs Go 1.23 or later plus a C compiler. Prerequisites aren't detailed further in the README itself — it defers to the external Installation Instructions page. Once those are installed, `make geth` builds just the geth binary, or `make all` builds the full set of executables (devp2p, abigen, evm, rlpdump). Prebuilt binary archives for stable releases and the unstable master branch are published at https://geth.ethereum.org/downloads/. There's also an official Docker image, ethereum/client-go, with an alpine tag for a slimmer build.

Running a Geth node — mainnet, testnet, and Docker

`geth console` starts a full node on mainnet in snap-sync mode (the default) and drops you into the built-in JS console; leave off `console` and attach later with `geth attach`. Swap in `geth --holesky console` for the Holesky test network — it uses its own bootnodes, network ID, and genesis state, and nests its data under a `holesky` subfolder so it can't collide with your mainnet data dir. For RPC access from outside the container, the Docker quick start is `docker run -d --name ethereum-node -v /Users/alice/ethereum:/root -p 8545:8545 -p 30303:30303 ethereum/client-go` — remember `--http.addr 0.0.0.0` if you want other containers or hosts to reach the RPC port, since geth binds to localhost only by default. For a private network, the README is blunt that since the Merge you can't just spin up geth nodes without a beacon chain too; it points to the Simulated Backend, Dev Mode, or Kurtosis depending on what you're testing.

Strengths

  • ✓Snap sync being the default means a first `geth console` run doesn't force a full historical replay just to reach current state.
  • ✓Config files plus `dumpconfig` scale better than a shell script full of flags once a deployment gets non-trivial.
  • ✓The official `ethereum/client-go` Docker image (with an alpine variant) means containerizing a node is a one-liner, not a homemade Dockerfile.
  • ✓abigen's generated bindings turn contract calls into compile-checked Go instead of runtime-checked ABI blobs — bugs show up at build time, not in production.

Hardware requirements and storage trade-offs

  • △Minimum hardware per the README: a 4+ core CPU, 8GB RAM, and 1TB of free storage just to sync mainnet — the recommended spec is 8+ cores, 16GB+ RAM, and a high-performance SSD with 1TB free.
  • △Since the Merge, geth alone can't run a private network — you now also need a paired beacon chain client, which the README pushes you toward Kurtosis or Dev Mode to avoid setting up by hand.
  • △The bundled web3 console library is old and, per the README, out of sync with the current official web3.js docs — don't treat its behavior as representative of the latest web3 API.
  • △HTTP/WS RPC is opt-in for a reason: the README warns that exposed nodes are an active target, and any browser tab on the machine can reach a locally bound RPC port too.

Other Ethereum execution clients

Erigon — a from-scratch Go execution client built around a different, more storage-efficient database layout for archive nodes.Nethermind — a .NET execution client with its own JSON-RPC and plugin architecture, popular with staking-as-a-service operators.Hyperledger Besu — a Java execution client aimed at enterprises that also supports permissioned/private network configs.Reth — a newer Rust execution client focused on modularity and sync speed.

Frequently asked questions about Geth

Is Geth free to use in commercial products?

Geth (Go Ethereum) is open source: the library code outside the cmd directory is under the GNU Lesser General Public License v3.0, and the cmd binaries are under the GNU General Public License v3.0. Both permit commercial use, but GPL-licensed binary code carries copyleft obligations if you redistribute modified versions.

Can I run Geth on Windows or only Linux and macOS?

Geth (Go Ethereum) supports Windows alongside Linux and macOS — its own Holesky testnet instructions specifically note that Windows users aren't affected by the IPC socket path quirk that Linux and macOS users need to handle manually.

What is the difference between a full node, archive node, and light node in Geth?

A full node (Geth's default) keeps current chain state without processing full history. An archive node retains all historical state, useful for querying old balances or contract storage at any past block. A light node retrieves data live from peers instead of storing it locally. Geth (Go Ethereum) picks the mode via the `--syncmode` flag.

How do I enable JSON-RPC access on Geth for my dApp?

Pass `--http` to turn on the HTTP-RPC server (`--http.addr`, `--http.port`, and `--http.api` control the interface, port, and exposed namespaces), or `--ws` for the WebSocket equivalent. Geth (Go Ethereum) binds to localhost by default, so set `--http.addr 0.0.0.0` if another container or host needs to reach it.

What programming languages can interact with Geth via RPC?

Any language can talk to Geth (Go Ethereum) over its JSON-RPC interface, since JSON-RPC is a plain HTTP/WebSocket/IPC protocol, not a Go-specific one. Go developers get an extra shortcut: abigen generates type-safe Go bindings straight from a contract's ABI, skipping manual JSON-RPC calls entirely.

Is Geth production-ready after the Merge?

Geth (Go Ethereum) remains a maintained, actively developed execution client after the Merge, but running one now requires pairing it with a separate beacon chain client — geth alone can no longer produce or validate blocks by itself. Plan for two processes, not one.

The problem it solves

Talking to Ethereum from your own code means picking between two default paths: trust a third-party JSON-RPC provider's black-box node, or stand up your own — and standing up your own has historically meant hand-rolling ABI encoding for every contract call and picking a node implementation with a maintained toolchain around it. Geth (Go Ethereum) is Go's answer to the second half of that: it bundles the node, a JS console for manual poking, and abigen to generate typed Go bindings so contract calls stay compile-checked instead of stringly-typed JSON blobs.

Who should try it — and who should skip

Reach for Geth if you're building anything that needs its own authoritative view of chain state — a dApp backend, an indexer, or a Go program using abigen-generated contract bindings — and you're comfortable running Go tooling and managing a beacon chain pairing. Skip it if you just need occasional read calls to Ethereum; a hosted RPC provider gets you there in five minutes instead of a multi-hundred-gigabyte sync.

Related repositories

Source & attribution

Facts and quoted commands sourced from the ethereum/go-ethereum GitHub repository and its README.

GitHub data · last synced Aug 14, 2026Reviewed by Henry
← Back to TopGit

Curious whether go-ethereum is right for you?

Let ChatGPT, Claude, or Perplexity look into it — click below and see what AI actually says about go-ethereum.

GitHub