Ethereum
Go
go-ethereum — geth — is the reference Ethereum node, and the same module ships an ethclient package you import as a library. That gives Go the most complete and current EVM tooling around: the team maintaining the dominant execution client also maintains the API you call, so a new fork like Dencun lands in the bindings without a third-party catching up. Pull it in with go get github.com/ethereum/go-ethereum. It's stewarded by the Ethereum Foundation, which is why the types track the live protocol on chain 1.
go-ethereum is the official Go client, maintained by the Ethereum Foundation. For Go developers that means the most complete and up-to-date EVM implementation available — the library and the node move together, so what you build against matches what mainnet runs.
Go-Ethereum (geth)
ethclient.Dial(url) opens the connection to the Ethereum endpoint and returns a *ethclient.Client that speaks every JSON-RPC method as a typed Go call — BalanceAt returns a *big.Int of wei, SuggestGasPrice an eth_gasPrice reading. Wrapping that client in your own struct, as below, keeps the endpoint URL in one place and lets you swap in a mock client in tests instead of hitting mainnet from a unit test.
- GitHub: https://github.com/ethereum/go-ethereum
- Docs: https://geth.ethereum.org/
- A full Ethereum node implementation you can also import as a library
- Complete coverage of the Ethereum protocol, kept current with each upgrade
- High-performance client tuned for production load
- CLI tools (geth, abigen, clef) and mobile (Android/iOS) build targets
- Typed contract bindings generated from Solidity ABIs via abigen
Smart Contract Integration
The idiomatic path for contracts is abigen: feed it a Solidity ABI and it emits a typed Go package where each contract method becomes a Go method, with the parameter and return types already decoded. Under that generated code sits bind.BoundContract, which you can also use directly — it pairs the parsed ABI with the client and exposes Call for gas-free reads against an Ethereum contract and Transact for signed state changes. Generating bindings is what turns an ERC-20's transfer into a compile-checked call rather than a hand-built calldata blob.
Event Monitoring
SubscribeNewHead opens a live feed of block headers, but it only works over WebSocket — eth_subscribe can't ride a plain HTTP connection, so dial wss://ethereum.therpc.io/YOUR_API_KEY for this, not the HTTPS URL you use for one-off reads. Since a new Ethereum block arrives roughly every 12 seconds, you want the push rather than a polling loop. Run the receive logic in a goroutine and select over two channels: one for incoming headers, one for sub.Err(), so a dropped connection surfaces as an error you can reconnect on instead of a silent stall.
Utils and Helpers
Wei values on Ethereum routinely exceed what a float64 or even a uint64 can hold — a single ETH is 10^18 wei, and balances stack well beyond that. Do every wei calculation in big.Int, and only drop to big.Float at the last step when you divide by 10^18 for display. Reach for float64 anywhere in the middle and you'll silently lose precision, which is how an off-by-a-few-wei rounding bug ends up in a payout.