Releases: ethereum/go-ethereum
Coolant Cells (v1.16.5)
This is a maintenance release. We are issuing this release mostly to add a conversion path for blob proofs submitted via eth_sendRawTransaction. See https://blog.ethereum.org/2025/10/15/fusaka-blob-update for more information.
RPC
eth_sendRawTransactionhas an upgrade path for blob proofs after the Fusaka fork. Note this is temporary. We will remove support for blob proof conversion during the v1.17.x release cycle, please update RPC client libraries to support cell-level (v1) proofs. (#32849)eth_subscribenow supports atransactionReceiptssubscription. There is also a wrapper in ethclient for this new subscription type. (#32697, #32869)eth_simulateV1was fixed to return the block timestamp in logs, likeeth_getLogsdoes. (#32831)- In the abigen v2 runtime,
BoundContract.Transferwill now verify that the contract has a payable fallback or receive method. (#32374) - A
keccak256preimagetracer has been added. (#32569)
Networking
- The eth protocol handler will now drop peers sending duplicated transactions. This is to unify behavior with other client implementations. (#32728)
- A regression in the discovery system could cause high CPU usage under synthetic conditions (i.e. in tests). (#32912)
- A very rare shutdown hang related to peer discovery is resolved. (#32572)
- The eth protocol test suite has a new post-merge test chain and saw some bug fixes for flakey tests. (#32834, #32850)
Core
- Our freezer implementation now supports partial reads, i.e. reading just a slice out of a larger stored value. This functionality is used for the archive node state history. (#32132)
- The trie database now implements a storage layer for 'trie history', a precursor to serving historical state proofs for the path-based archive node. (#32596)
- The
txpool/valid.metermetric has been corrected. (#32845) - The engine API saw some fixes related to fork compatibility checks. (#32800, #32731)
For a full rundown of the changes please consult the Geth 1.16.5 release milestone.
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Bioelectric Infusers (v1.16.4)
This release enables the Osaka (Fusaka) fork on testnets. We also enable two blob-parameter only (BPO) forks for the testnets.
-
Holesky
- Osaka at time
1759308480(2025-10-01 08:48:00 UTC) - BPO1 at time
1759800000(2025-10-07 01:20:00 UTC) - BPO2 at time
1760389824(2025-10-13 21:10:24 UTC)
- Osaka at time
-
Sepolia
- Osaka at time
1760427360(2025-10-14 07:36:00 UTC) - BPO1 at time
1761017184(2025-10-21 03:26:24 UTC) - BPO2 at time
1761607008(2025-10-27 23:16:48 UTC)
- Osaka at time
-
Hoodi
- Osaka at time
1761677592(2025-10-28 18:53:12 UTC) - BPO1 at time
1762365720(2025-11-05 18:02:00 UTC) - BPO2 at time
1762955544(2025-11-12 13:52:24 UTC)
- Osaka at time
With BPO1 and BPO2, the blob capacity of these networks will increase as follows:
- BPO1: max blobs/block:
15, target:10 - BPO2: max blobs/block:
21, target:14
As of this release, the default block gas limit is set to 60M gas.
This is the recommended limit that we, as client authors, feel comfortable with.
CLI commands
geth snapshotand related commands no longer fail due to not finding the trie journal file. (#32531)- A regression in
geth snapshot dumpandgeth export-preimagesis resolved. (#32650) - We have added an experimental zkVM 'guest program',
keeper, to the source tree. (#32543, #32638, #32736)
RPC
eth_calland related operations were fixed to not apply the EIP-7825 per-transaction gas limit when executing under Osaka fork rules. (#32641)- For
eth_getLogsand other log filtering operations, it is now possible to configure the number of addresses allowed in the filter using the--rpc.logquerylimitflag. (#32327) - Starting Geth with the
--state.size-trackingoption enables collection of precise state size numbers, which can be read using thedebug_stateSizeendpoint. (#32362) - The new
debug_executionWitnessanddebug_executionWitnessByHashmethods create a block witness for stateless execution. (#32216)
Tracing & ABIGEN
- There is a new
CodeChangeV2hook, with aCodeChangeReasonparameter. (#32525, #32535) - In certain corner-cases related to SELFDESTRUCT,
OnBalanceChangewas not invoked. (#32526) BoundContractinaccounts/abi/bind/v2now exposes anAddressmethod. (#32559)
Core
- The EVM MODEXP precompiled account has seen some optimizations to improve performance for worst-case inputs. We are especially grateful for @GottfriedHerold's work on improving the underlying math/big library. (#32527, #32553, #32568, #32576)
- The blobpool will now perform a migration to the v1 blob proof format around the time of the fork. (#31966, #32577, #32534, #32656, #32716)
engine_getBlobshas been updated for improved spec compliance and to deal with the conversion of the blob tx proofs. (#32536, #32538, #32578)- The path-based state database has seen some fixes to prevent database corruption, which could sometimes occur when Geth is terminated abnormally, e.g. by a short stop timeout in Docker. (#32557, #32447)
- All
engineAPI operations, andeth_config, now support BPO-style forks. (#32589, #32615, #32636, #32579) - This release includes some work towards supporting historical state proofs in the path-based archive node implementation. (#32418, #32523, #32649)
- Pebble stall counter are now correctly reported for each opened database. (#32563)
Networking
- The node discovery iterator was updated to improved geth startup time and reactivity when the node table becomes empty. (#32517, #32518)
- A hang in the 'eth' protocol test suite was resolved. (#32551)
Build
- The KZG proof libraries have been updated to the latest release to fix a vulnerability. Fortunately, the vulnerability would only have become usable after the Osaka fork, so there is no risk for users of current versions. (#32640, #32639)
- go-ethereum now requires Go 1.24 or later. (#32584, #32598)
- This release is built with Go 1.25.1 (#32593)
- execution-spec-tests has been bumped to v5.1.0 (#32592, #32742)
Impact Restrictors (v1.16.3)
What's Changed
This is a maintenance release to prepare for the Fusaka release next week. It contains a state history rewrite, fixes for the Osaka devnets, performance improvements, and a few bug fixes.
Fusaka
Core
- Stabilize tx relay peer selection #31714
- Reduced number of allocation when comparing transactions #31912
- Rework tracer and track origin value of dirty nodes #32306
- Avoids loading the same blob tx multiple times #32190
- Fix modexp input check #32363
GetBlockReceiptsalso handles pending blocks #32461- Tree node prefetching for increased loader performance #32134
- Parallelized
db inspect#32506
RPC
- Apply precompile overrides in
DoEstimateGas#31795 - Fix uncle reward accounting in supply_tracer #31882
- Checks ErrGasLimitTooHigh in conditions in gas estimator #32348
- Implement EIP-7910 - eth_config JSON-RPC Method #32239
- Add SetWebsocketReadLimit in RPC Server #32279
- graphql: add query depth limit to prevent DoS attacks #32344
- Adds codeHash to prestateTracer's account structure #32391
- Remove deprecated method
debug_seedHash#32495
Others
- Introduce the TransitionState object #31634 and #32366
- Fix ledger version check for EIP-155 support #32417
- Fix: don't return an error when a nil peer is found in GetHeader #32369
- Add support for Go 1.25 #32425 and #32412
- Add trie depth-tracking metrics #32388 and #32507
- Implement EIP-7864 - binary trees 32365
- Improved ETA calculation #32521
For a full rundown of the changes please consult the Geth 1.16.3 release milestone.
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Sprouted Seed Vial (v1.16.2)
This is a maintenance release that includes implementations of the Fusaka EIPs, along with
several new features, optimizations, and bug fixes. Upgrading to this version is optional,
but feedback from those who do is greatly appreciated.
Fusaka:
- Implement EIP-7825 - Transaction Gas Limit Cap. (#31824,#32230)
- Implement EIP-7934 - RLP Execution Block Size Limit. (#31990)
- Implement EIP-7939 - CLZ opcode. (#31989,#32172)
- Implement EIP-7918 - Blob base fee bounded by execution cost. (#31965)
- Implement EIP-7951 - Precompile for secp256r1 Curve Support. (#31991)
- Implement EIP-7892 - Blob Parameter Only Hardforks. (#32193)
- Implement EIP-7883 - ModExp Gas Cost Increase. (#32231)
- Add Block-level accessList structure. (#31948)
- Limit the max blobs in blob transaction. (#32246)
Core:
- Reduce the memory allocation in trie hash function. (#31902)
- Improve the background sync mechanism of the freezer. (#32135)
- Introduce file-based state journal. (#32060)
- Fix the dropping oversized transaction announcements. (#32210)
- Fix the condition that disables direct ancient sync mode. (#32188)
- Add an interface for the jump destination analysis cache. (#32143)
- Fix incorrect address length in historical state reader. (#32248)
- Fix a dead lock in state history indexer. (#32260)
- Expose
SigHashof SetCodeAuthorization for customized signing. (#32298)
RPC:
- Reject
eth_getLogsrequests that include both block hash and block range. (#31877) - Fix block overrides in
debug_traceCall. (#32183) - Introduce
debug_syncto perform a trusted full chain sync. (#32177,#32149)
Others:
- Add automatic package aliasing in rlp code generator. (#31148)
- Add the metrics for tracking snap sync duration. (#32258)
- Update checkpoints for blsync and filtermaps. (#32336)
- Add test suite for ENRRequest. (#32303)
For a full rundown of the changes please consult the Geth 1.16.2 release milestone.
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Repair Actuals (v1.16.1)
This is a patch release, fixing some regressions with v1.16.0.
- abigen v2 now creates
TryPackmethods that return an error for invalid parameter values. (#31692) geth --vmtrace, enabling the live tracer, did not work due to a bug. (#32107)- The
blockTimestampas returned byeth_getLogsis now hex-encoded. (#32129) eth_getLogsand related endpoints now limit the number of queried addresses to 1000. (#31876)eth_getTransactionReceiptshould be a bit faster. (#32021)- A buggy interaction of the new archive node and snap sync is resolved. (#32104)
- A rare crash in
geth --devmode related todebug_setHeadis resolved. (#31871) - Release archives now contain statically-linked binaries. (#32118)
For a full rundown of the changes please consult the Geth 1.16.1 release milestone.
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Terran Rivets (v1.16.0)
We are proud to present the v1.16.0 release, introducing path-based archive node and several other improvements to the state database implementation. There is also the usual amount of bug fixes and small improvements.
Archive Node
This release includes a new, experimental implementation of the archive node (--gcmode=archive). As an archive node, Geth stores all historical states, and can thus retrieve account balances, nonces and storage values at old blocks.
In previous versions of Geth, running as an archive node was only possible using the legacy 'hash-based' state storage scheme (--state.scheme=hash). When syncing mainnet the resulting database would reach sizes larger than 20TB, and it all had to be stored on a high-speed SSD.
The new implementation provides the state archive in combination with 'path-based' storage (--state.scheme=path). Comparing to hash-based storage, there are three basic advantages:
- Geth can be configured to store historical states on a dedicated disk, and it doesn't have to be an SSD (it will be ~3x faster to access when stored on SSD though).
- For the full state history of mainnet, the state database will have a size of ~1.9TB (this is without the tx-by-hash index and log index).
- The amount of historical state kept by the node is configurable as well. By default, Geth will keep historical state for the last 90k blocks, and older state is pruned from disk automatically as the chain advances. You can set the number of states to keep with the
--history.stateflag.
Notably, there is also one drawback with the new archive node: eth_getProof is not supported for historical blocks. With --state.scheme=path, Geth can only serve state proofs for the latest 128 blocks. We believe this is an acceptable tradeoff. If you need older proofs, you can still a hash-based archive node as before, but we'd also really like to hear about your use case. Please contact us via email at [email protected] so we can learn more, and possibly find a solution that can be implemented within Geth.
How it works
With 'path-based' state storage, Geth keeps exactly one full state in the database. Specifically, the persistent state is 128 blocks in the past. For newer blocks up to the head, forward diffs are kept in memory. In order to support rolling back to blocks older than head-128, Geth also keeps 'state history' in the form of reverse key-value diffs. When the chain is reset to an old block, these diffs are applied to the persistent state, going backwards one diff at a time until the target block is reached.
A reverse state diff contains the previous values of all modified accounts and storage locations for a specific block. There is a reverse diff for each historical block. This makes reverse diffs suitable for storage into the 'freezer', i.e. they do not need to live within Pebble/LevelDB.
The new archive mode is built on the realization that reverse state diffs contain all necessary data to serve historical state queries. For example, in order to get the historical balance of an account X at block B, we can search forward through diffs starting at block B until we find a block where account X is modified. This diff will contain the balance of the account, since it stores the all modified pre-values.
To accelerate the search for a suitable diff, Geth creates a database index storing the block numbers in which an account was modified. This index is small compared to the overall state history, but it is crucial for correct operation of the archive node. The state index is stored in PebbleDB and will be generated automatically while geth is syncing the chain. It takes ~30h to build the archive state index for mainnet, and historical state will only be available when the index is fully built. Geth will report a syncing status through eth_syncing while the indexing happens.
Other state implementation changes
In v1.16.0, the implementation of the 'state snapshot' has been rewritten for improved integration with path-based state storage. As you may recall, Geth stores the state in two different ways:
- The 'snapshot' contains the flat keys and values of the state, in a layer-based struture.
- The trie database contains state trie nodes, necessary for the state root computation.
When the implementation of the snapshot and its layer tree was introduced in Geth v1.10.0, it was built to be entirely separate from the trie database. We added path-based state storage in v1.13.0, and that system contains a layer tree as well, with slight differences in semantics and implementation.
As of this release, the layer trees of the state snapshot and trie database have been merged into a single implementation (#30661). In path-based mode, the trie database now holds a reference to the corresponding snapshot layer for each tree state. The new layer tree has also been enhanced with an additional index of layers in which an account was modified (#30971). Note this is similar in spirit to the historical state index. The new index will enable us to increase the number of in-memory state layers in the future.
Full list of changes in this release
Geth
- The default block gas limit is now 45M. (#32087)
- Geth can now use era1 files to access history when running with pruned history. (#31604)
- There is a new
geth download-erasubcommand for fetching era1 files. (#31823, #31951, #32081) - When Geth is interrupted while it is syncing, pending block imports will now be canceled, leading to a quicker shutdown. (#32062)
Ready for fork activationmessages are now printed based on the current clock time. (#31800)- Geth no longer allows setting a different network ID when running a network preset. (#31630)
- The beacon-chain light client, blsync, has been fixed to work correctly after Pectra. (#31775)
geth --devnow shows a listing of pre-funded dev chain accounts and their keys. (#31898)geth --devnow always enables preimage recording. (#31821)
Fusaka
We have started merging some EIP implementations for the upcoming Fusaka fork:
- EIP 7883 - ModExp Gas Cost Increase (#31606, #32015)
- EIP 7823 - Set upper bounds for MODEXP (#31818)
- EIP-7594 - PeerDAS (#31791, #31992)
Core
- There is a new archive-node implementation using path-based storage. (#31156, #31161, #31725, #31781, #32091, #32099)
- The pathdb layer tree has been rewritten for tight integration with the state snapshot, and has an improved lookup structure that helps it scale to more than 128 layers. (#30661, #32086, #32097)
- The state prefetcher has been improved to run for all inserted blocks, not just during full sync. (#31557, #32075, #32071)
- Metrics for state cache utilization and the prefetcher have been added. (#31998)
- We have also added metrics for gas usage and mgas/s (#31753, #32004)
- The Pebble database is now synced to disk at explicit safepoints. In the beginning of the v1.15.x release cycle, we added a change that disabled fsync on the database level, then spent a bunch more time throughout the cycle triaging issues related to that. We eventually had to row back and enable fsync again in v1.15.8, causing a drop in performance. The new approach of syncing explicitly gives us the ability to disable fsync for most writes, improving performance. (#31703)
- Pebble parameters have been tweaked to ensure better compaction behavior. Specifically, some changes were made to smooth out compaction-related CPU and I/O spikes. (#31970, #31988, #31782, #30464)
RPC
- Logs returned by
eth_getLogsand similar requests will now return theblockTimestamp. (#31887) eth_getBlockReceiptswill no...
Armored Compartments (v1.15.11)
This is a maintenance release, correcting issues with log and transaction indexing. Upgrading to this release is not required to follow the Pectra fork on mainnet, you can keep using v1.15.9 or v1.15.10, but we recommend you upgrade at your convenience to fix RPC issues.
All changes
- A stall condition in
eth_getTransactionByHashis resolved. (#31752) - Two bugs in the new log indexer are resolved. Note: upon upgrading the log index will be rebuilt, expect high CPU load after startup. (#31750, #31734)
- Log indexing performance has been improved. (#31716)
eth_simulateV1now correctly returns the transaction sender (from). (#31480)- A corner-case in
eth_estimateGasrelated tofloorDataGasis resolved. (#31735) ethclient'sBlockByNumbercan now retrieve the pending block. (#31504)geth initwill once again exit in error when trying to re-initialize a database with an incompatible config. (#31743)- Transaction pool reorgs are slightly faster. (#31715)
- A transaction pool data race in
geth --devmode is resolved. (#31758)
For a full rundown of the changes please consult the Geth 1.15.11 release milestone
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Omni-Capacitors (v1.15.10)
This is a bug-fix release that corrects an issue with the new log indexer and configures the beacon chain light client for the Electra fork on mainnet (we forgot about this in v1.15.9).
This release is also suitable for following the Pectra fork on Mainnet.
All changes
- A deadlock condition in the log indexer is resolved. This only affected deployments of Geth in archive mode, and old databases still using LevelDB. (#31708)
- The beacon chain light client is now configured for the Pectra fork on mainnet. (#31706)
- The default block gas limit has been increased to 36M. (#31705)
- ethclient now allows passing an EIP-7702
authorizationListto calls. (#31198) - A new RPC endpoint
debug_setMemoryLimithas been added for tweaking Go garbage collector behavior. We do not recommended using this, it's just a facility for debugging Geth. (#31441)
For a full rundown of the changes please consult the Geth 1.15.10 release milestone
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Multicapacitor (v1.15.9)
This release enables the Prague execution-layer fork on mainnet.
Prague
As of this release, the Prague fork is scheduled to occur on mainnet at block timestamp 1746612311 (Wed May 07 10:05:11 2025 UTC). As a reminder, the fork contains the following EIPs:
- EIP-2537: Precompile for BLS12-381 curve operations
- EIP-2935: Save historical block hashes in state
- EIP-6110: Supply validator deposits on chain
- EIP-7002: Execution layer triggerable exits
- EIP-7251: Increase the
MAX_EFFECTIVE_BALANCE - EIP-7549: Move committee index outside Attestation
- EIP-7623: Increase calldata cost
- EIP-7685: General purpose execution layer requests
- EIP-7691: Blob throughput increase
- EIP-7702: Set EOA account code
- EIP-7840: Add blob schedule to EL config files
All changes
- The Prague fork timestamp was added for mainnet. (#31535)
- Transaction-sending RPCs will now add txs to the 'locals' tracker only when they have any chance of inclusion. This is a bit of a revert from the behavior we added in v1.15.4, where APIs such as
eth_sendRawTransactionwould always return a txhash, even if the transaction wasn't includable on chain. (#31618) - If an EVM system call fails during block execution, the block is considered invalid. (#31639)
- An corner-case crash in
eth_feeHistoryrelated to blob fees is resolved. (#31663) - Several correctness bugs in the new log indexer have been fixed. (#31590, #31680, #31671, #31668, #31642)
- The history pruning implementation was further improved. (#31638, #31636, #31656)
- Geth will now print periodic logs when a non-activated fork is configured. (#31340)
- Geth will now occasionally drop peers at random after being fully synced. (#31476)
- CPU usage of tx propagation has been optimized. (#31657)
- Peer disconnect metrics are improved. (#31629, #31621)
For a full rundown of the changes please consult the Geth 1.15.9 release milestone
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.
Combatives Upgrade (v1.15.8)
This is a bug-fix release with some performance improvements.
Geth
geth importnow applies database and cache flags correctly. (#31577, #31534)- The new log indexer now exports metrics about its operation. (#31511)
- The beacon chain light client,
blsyncnow has a feature to export checkpoint files. (#31469)
Core library
- Database writes have been made fully synchronous again. We disabled the use of
fsynca while ago to improve performance on slow filesystems, but it has lead to reports of instability. The performance hit from enabling data sync is negligible. (#31519) - The transaction pool now takes pending blob transactions into account when limiting pending EIP-7702 authorizations for an account. (#31526)
- A logic race in EIP-7702 transaction validation is resolved. (#31373)
- The blob transaction pool performs less disk reads when sending transaction announcements. (#31433)
- The EVM now has a special fast-path for PUSH2, which is the most common instruction. (#31267)
- The Trezor hardware wallet implementation now supports 32-bit chain IDs. (#17439)
- Geth can now stop syncing history at the PoS merge point. This behavior is not enabled yet. (#31414)
RPC
- When trying to access pruned history, all RPC APIs now return error code 4444. (#31361)
P2P networking
- UPnP support has been improved and some bugs got fixed. (#30265, #31486, #31566)
- The discv5 'talk request' API has been changed to pass
*enode.Nodeto handlers. This is a breaking change, but the only known user of this API is the shisui portal network client. (#31075) - A flaw in the recently added discv5 challenge resend logic was fixed. (#31543)
- The eth protocol now properly handles very large
skipvalues when processingGetBlockHeadersmessages from peers. This is not a security fix, despite looking like one, it's more about correctness. (#31522)
Build
- This release is built with Go 1.24.2 (#31538)
- Note: due to issues with our build environment, we can no longer provide binary builds for macOS. These may be restored at a later date, hopefully soon. For now, you'll have to install from Homebrew.
- The previous release's git tag, v1.15.7, was published twice, leading to an issue with the Go module cache.
For a full rundown of the changes please consult the Geth 1.15.8 release milestone
As with all our previous releases, you can find the:
- Pre-built binaries for all platforms on our downloads page.
- Docker images published under
ethereum/client-go. - Ubuntu packages in our Launchpad PPA repository.
- OSX packages in our Homebrew Tap repository.