github NethermindEth/nethermind 1.37.0
v1.37.0

pre-release7 hours ago

Release notes

Overview

530 Changes across 2,643 Files. Major worldstate backend refactor, RocksDB snapshots, flat storage for snap sync, block-level access lists (EIP-7928), initial zkEVM groundwork, and a large round of JSON-RPC and EVM hot-path optimizations.

Breaking changes

  • eth/66 and eth/67 dropped; eth/69 is now default and eth/70 added and activated (#9938, #10246)
  • Engine API versioning reworked (#10786)
  • Vault and NDM code paths removed (#10478)

Highlights

Performance

State & storage

  • Worldstate backend refactor with pluggable backends (#9089)
  • RocksDB and column DB snapshots (#10080, #10262)
  • Flat storage for snap sync (#9854, #10426)
  • Discv5 nodes moved to a separate DB (#10027)

EVM extensibility

Consensus & EIPs

RPC & correctness

  • eth_estimateGas fixes (#10559); eth_getBlockByNumber canonical enforcement (#10024)
  • eth_getLogs faster (#9923); log index introduced (#8464)
  • engine_getBlobsV3 (#9942); engine_getPayloadV4 for Optimism (#10328)
  • eth_subscribe transactionReceipts (#10524)
  • debug_ block field overrides (#10405); GasCap enforced on debug/trace (#10457)
  • Hardened RPC tx validations (#10395)

Networking

  • Faster handshake parsing, Ethrex recognized (#9935)
  • Discovery v5 optimized (#10081); better peer decentralization (#10090)

Chain-specific

  • Taiko/Surge: Shasta changes, Hoodi activation, TDX attestation (#9998, #10406, #9954)
  • XDC: P2P layer, EIP-1559, fast sync, penalty/reward handlers (#10615, #10277, #10549)
  • OP Superchain: rolling updates

Flat DB (opt-in)

Nethermind 1.37.0 ships a new Flat DB state backend that stores the latest state as flat account/storage records instead of walking the Merkle-Patricia trie. Faster random reads, streaming snap serving, and per-column cache budgets. Disabled by default — opt in with --FlatDb.Enabled=true.

Activation

--FlatDb.Enabled=true

This swaps FlatWorldStateModule in for the pruning-trie wiring, disables admin_prune / admin_verifyTrie, and force-enables Sync.SnapServingEnabled=true.

Migration from an existing pruning-trie DB

Set the import flag alongside Enabled:

--FlatDb.Enabled=true 
--FlatDb.ImportFromPruningTrieState=true

Run the node. On first boot the ImportFlatDb step streams the head state into the flat DB and then exits cleanly (exit code 0). Just restart the node — the flag can stay on. On subsequent boots the step detects the populated flat DB, logs Flat db already exist, and returns without exiting, so the node proceeds to normal operation. There is no automatic in-place migration without the flag: if you enable Flat DB on a node that already has pruning-trie data and don't set ImportFromPruningTrieState, the flat DB is simply empty and you'll sync from scratch.

FlatLayout.PreimageFlat cannot be the import target (the importer uses raw hash-keyed writes) — use Flat or FlatInTrie for the import run.

Layouts — -FlatDb.Layout

Value Notes
Flat (default) Flat entries in a dedicated column DB with Hyper Clock caches (30% Account / 70% Storage of BlockCacheSizeBudget).
FlatInTrie Entries embedded into trie leaves. FlatRocksDbConfigAdjuster adds optimize_filters_for_hits=true, partitioned filters, two-level index — lower memory, higher tail latency.
PreimageFlat Preimage-DB-keyed layout. Requires a preimage DB populated via --FlatDb.EnablePreimageRecording=true on an earlier run.

Default-value changes

Implicit flips

  • Sync.SnapServingEnabled is force-true whenever FlatDb.Enabled=true (FlatWorldStateModule intercepts ISyncConfig). A -Sync.SnapServingEnabled=false passed alongside Flat DB is silently overridden.
## Overview

530 Changes across 2,643 Files. Major worldstate backend refactor, RocksDB snapshots, flat storage for snap sync, block-level access lists (EIP-7928), initial zkEVM groundwork, and a large round of JSON-RPC and EVM hot-path optimizations.

Breaking changes

  • eth/66 and eth/67 dropped; eth/69 is now default and eth/70 added and activated (#9938, #10246)
  • Engine API versioning reworked (#10786)
  • Vault and NDM code paths removed (#10478)

Highlights

Performance

State & storage

  • Worldstate backend refactor with pluggable backends (#9089)
  • RocksDB and column DB snapshots (#10080, #10262)
  • Flat storage for snap sync (#9854, #10426)
  • Discv5 nodes moved to a separate DB (#10027)

EVM extensibility

Consensus & EIPs

RPC & correctness

  • eth_estimateGas fixes (#10559); eth_getBlockByNumber canonical enforcement (#10024)
  • eth_getLogs faster (#9923); log index introduced (#8464)
  • engine_getBlobsV3 (#9942); engine_getPayloadV4 for Optimism (#10328)
  • eth_subscribe transactionReceipts (#10524)
  • debug_ block field overrides (#10405); GasCap enforced on debug/trace (#10457)
  • Hardened RPC tx validations (#10395)

Networking

  • Faster handshake parsing, Ethrex recognized (#9935)
  • Discovery v5 optimized (#10081); better peer decentralization (#10090)

Chain-specific

  • Taiko/Surge: Shasta changes, Hoodi activation, TDX attestation (#9998, #10406, #9954)
  • XDC: P2P layer, EIP-1559, fast sync, penalty/reward handlers (#10615, #10277, #10549)
  • OP Superchain: rolling updates

Flat DB (opt-in)

Nethermind 1.37.0 ships a new Flat DB state backend that stores the latest state as flat account/storage records instead of walking the Merkle-Patricia trie. Faster random reads, streaming snap serving, and per-column cache budgets. Disabled by default — opt in with --FlatDb.Enabled=true.

Activation

--FlatDb.Enabled=true

This swaps FlatWorldStateModule in for the pruning-trie wiring, disables admin_prune / admin_verifyTrie, and force-enables Sync.SnapServingEnabled=true.

Migration from an existing pruning-trie DB

Set the import flag alongside Enabled:

--FlatDb.Enabled=true 
--FlatDb.ImportFromPruningTrieState=true

Run the node. On first boot the ImportFlatDb step streams the head state into the flat DB and then exits cleanly (exit code 0). Just restart the node — the flag can stay on. On subsequent boots the step detects the populated flat DB, logs Flat db already exist, and returns without exiting, so the node proceeds to normal operation. There is no automatic in-place migration without the flag: if you enable Flat DB on a node that already has pruning-trie data and don't set ImportFromPruningTrieState, the flat DB is simply empty and you'll sync from scratch.

FlatLayout.PreimageFlat cannot be the import target (the importer uses raw hash-keyed writes) — use Flat or FlatInTrie for the import run.

Layouts — -FlatDb.Layout

Value Notes
Flat (default) Flat entries in a dedicated column DB with Hyper Clock caches (30% Account / 70% Storage of BlockCacheSizeBudget).
FlatInTrie Entries embedded into trie leaves. FlatRocksDbConfigAdjuster adds optimize_filters_for_hits=true, partitioned filters, two-level index — lower memory, higher tail latency.
PreimageFlat Preimage-DB-keyed layout. Requires a preimage DB populated via --FlatDb.EnablePreimageRecording=true on an earlier run.

All FlatDb.* flags (defaults from FlatDbConfig.cs)

Flag Default Purpose
Enabled false Master switch.
Layout Flat Flat / FlatInTrie / PreimageFlat.
ImportFromPruningTrieState false One-shot import from the pruning-trie DB; idempotent afterwards.
EnablePreimageRecording false Mirror account/slot hashes into a preimage DB.
VerifyWithTrie false Cross-check flat reads against a reconstructed trie. Diagnostic — slow.
InlineCompaction false Run compaction inline on writes instead of pooled.
CompactSize / MinCompactSize 32 / 2 Snapshot-group size bounds for hierarchical compaction.
MaxInFlightCompactJob 32 Compaction parallelism.
MinReorgDepth / MaxReorgDepth 128 / 256 Reorg retention window.
TrieWarmerWorkerCount -1 -1 = CPU - 1, 0 = disable warming.
BlockCacheSizeBudget 1 GiB RocksDB block cache for the flat column family (split 30/70 Account/Storage). Stacks on top of Db.* budgets.
TrieCacheMemoryBudget 512 MiB TrieNodeCache target; 0 disables it.

Config flag changes

Every user-facing config movement on 1.37.0 outside the FlatDb.* namespace. Flat DB flags are covered separately.

Added

Flag PR Default Purpose
Network.FilterPeersByRecentIp [#10090](#10090) true Reject peers whose IP key was seen recently (time-windowed).
Network.FilterPeersBySameSubnet [#10090](#10090) true Bucket peer IPs by subnet (IPv4 /24, IPv6 /64). Set false for co-located multi-node setups.
Network.FilterDiscoveryNodesByRecentIp [#10090](#10090) true Same filter for discovery.
Network.FilterDiscoveryNodesBySameSubnet [#10090](#10090) true Subnet bucketing for discovery.

Removed

Flag PR Notes
Db.XdcSnapshotsDbRocksDbOptions [#10329](#10329) Moved into XdcRocksDbConfigFactory in the XDC plugin.
Db.XdcSnapshotsDbAdditionalRocksDbOptions [#10329](#10329) As above — delete from any XDC config overrides.

Default-value changes

Implicit flips

  • Sync.SnapServingEnabled is force-true whenever FlatDb.Enabled=true (FlatWorldStateModule intercepts ISyncConfig). A -Sync.SnapServingEnabled=false passed alongside Flat DB is silently overridden.

Build signatures

The packages are signed with the following OpenPGP key: AD12 7976 5093 C675 9CD8 A400 24A7 7461 6F1E 617E

What's Changed

New Contributors

Full Changelog: 1.36.2...1.37.0

Don't miss a new nethermind release

NewReleases is sending notifications on new releases.