Skip to content

Conversation

dependabot[bot]
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Jun 27, 2025

Bumps github.com/ethereum/go-ethereum from 1.15.11 to 1.16.0.

Release notes

Sourced from github.com/ethereum/go-ethereum's releases.

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.state flag.

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-era subcommand 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 activation messages 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)

... (truncated)

Commits
  • 57f8971 version: release go-ethereum v1.16.0 stable
  • 0c90e4b all: incorporate state history indexing status into eth_syncing response (#32...
  • 36bcc24 triedb/pathdb: fix journal resolution in pathdb (#32097)
  • a92f2b8 core, eth, triedb: serve historical states over RPC (#31161)
  • ce63bba eth, triedb/pathdb: permit write buffer allowance in PBSS archive mode (#32091)
  • 429e821 cmd/utils: fix formatting for beacon flag errors to fit Fatalf form (#32090)
  • cafa5e6 core, consensus/beacon: defer trie resolution (#31725)
  • 6dd38d2 cmd/geth, triedb: add pathdb state verification (#32086)
  • 9c5c0e3 core/rawdb, triedb/pathdb: implement history indexer (#31156)
  • ebff350 miner: default gaslimit 45M (#32087)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.15.11 to 1.16.0.
- [Release notes](https://github.com/ethereum/go-ethereum/releases)
- [Commits](ethereum/go-ethereum@v1.15.11...v1.16.0)

---
updated-dependencies:
- dependency-name: github.com/ethereum/go-ethereum
  dependency-version: 1.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
@dependabot dependabot bot added dependencies Pull requests that update a dependency file go Pull requests that update go code labels Jun 27, 2025
Copy link
Contributor Author

dependabot bot commented on behalf of github Jul 2, 2025

Superseded by #150.

@dependabot dependabot bot closed this Jul 2, 2025
@dependabot dependabot bot deleted the dependabot/go_modules/github.com/ethereum/go-ethereum-1.16.0 branch July 2, 2025 13:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file go Pull requests that update go code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

0 participants