Releases: NethermindEth/nethermind
v1.30.1
Release Notes
⚠️ Important update for Linux systemd users
Major highlights
Startup logger fix
Fixed an issue when Nethermind crashes on startup if the Nethermind process doesn't have write access to its own directory.
Improved handling of JsonRpc.EnabledModules
Fixed an issue with trailing commas in JsonRpc.EnabledModules
values. For instance, --JsonRpc.EnabledModules [eth,net,]
that has been working previously, caused a failure because of the .NET 9 upgrade. To maintain compatibility and avoid disruption, adjustments have been made to continue supporting these cases, although it's highly recommended not adding trailing commas in array values.
Full Changelog: 1.30.0...1.30.1
v1.30.0
Release Notes
⚠️ We highly recommend using v1.30.1 instead
Major Highlights
Gas limit increase
The recent update increases the default gas limit from 30MGas to 36MGas, reflecting the current pre-Pectra safe limit; as identified by EF Research1 and tested on the Sepolia testnet, while ensuring compatibility with consensus layer clients. This adjustment is designed to improve transaction throughput and overall network efficiency.
To ensure the new default value is applied, do one of these:
- Remove the
Blocks.TargetBlockGasLimit
configuration option if any - Explicitly set it to 36000000.
If maintaining the previous gas limit is necessary, you can override the default by setting the following configuration option:
--Blocks.TargetBlockGasLimit 30000000
This approach provides flexibility while optimizing for evolving network demands and the rising asset price for the gas token.
Gnosis shutterized transactions
Shutter, a cutting-edge privacy solution leveraging threshold cryptography, is now officially supported in Nethermind 1.30.0. Initially enabled for a selected group of validators, it is now available for everyone. Shutter encrypts transactions in the mempool, keeping transaction details private until finalized on-chain. This ensures protection against frontrunning and supports fair and secure transaction execution on the Gnosis Chain.
Enabling Shutter in Nethermind:
-
Update to Nethermind 1.30.0
-
Generate validator registration files by following the instructions in Shutter Validator Registration repository
-
Configure Nethermind as follows:
--Shutter.Enabled true --Shutter.ValidatorInfoFile /data/execution/validatorInfo.json
-
Run Nethermind with the updated configuration to enable Shutter functionality.
Gigagas performance
We introduced several significant performance enhancements that substantially boosted tip-of-chain processing times. These improvements enabled us to achieve an impressive average processing throughput of 1 Gigagas/s, as recorded on the Base Mainnet chain.
One of the most impactful changes was optimizing and parallelizing in-memory pruning. This process is now significantly faster and no longer interferes with the block processing thread, reducing the likelihood of block processing spikes.
New supported chains
We added support for two new L2 networks: Taiko and Linea. To start with these networks, use the command below configurations:
taiko-mainnet
taiko-hekla
linea-mainnet
linea-sepolia
Additionally, as part of the preparation for Pectra hard-fork, we added support for the Mekong testnet. To run it, use -c mekong
and ensure the respective consensus client version is running alongside.
Optimism improvements
For the Optimism implementation, we introduced support for the new hard-fork, Holocene, which took place on the Sepolia chains.
Additionally, we enabled our AutoPivot mechanism for new nodes starting synchronization. This significantly reduces the duration of the initial sync stage for OP and Base nodes, cutting the total sync time by approximately 30–60 minutes.
CLI updates
As a part of our efforts following Posix CLI conventions for our command line options, we introduced all lowercase dash-separated alternatives for all Nethermind command line options. For instance, --JsonRpc.JwtSecretFile
can be spelled as --jsonrpc-jwtsecretfile
or --Metrics.Enabled
as --metrics-enabled
.
Some option names have been deprecated (while still supported with a warning) in favor of new ones. For instance, -dd, --datadir
is deprecated in favor of --data-dir
.
Also, Nethermind configuration files now have a .json
extension instead of the previous .cfg
one. While this should not cause any issues for our users, we highly recommend not using extensions when specifying config names – always prefer -c mainnet
over -c mainnet.json
, or -c mainnet.cfg
. Note that this does not apply to the cases when the -c
option specifies a path, e.g. -c path/to/mainnet.json
.
For more info, see configuration docs.
Changelog
New features
- Gnosis Shutter by @Marchhill in #7414
- Support for state override parameter in some RPC methods by @alexb5dh in #7362
Pectra
- Pectra EIPs 6110, 7002, 7685 by @MarekM25 in #7421
- Pectra payload bodies by @MarekM25 in #7429
- EIP-4844-Pectra: Blob gas fee collection for Gnosis by @Marchhill in #6866
- EIP-7702 and EIP-7251 by @ak88 in #7459
- Changes for EIP7685, 7002 & 6110: Flat Encoding of requests by @rjnrohit in #7670
New chains
- Add Linea L2 by @jmederosalvarado in #7555
- Taiko by @jmederosalvarado in #7326
- Add configs for mekong testnet by @ak88 in #7713
Performance
- Keccak avx512 by @benaadams in #7660
- fix casting when tracing by @LukaszRozmej in #7464
- Move txPool work from Processing loop event to txPool thread by @benaadams in #7469
- Remove 5 flow control exceptions by @benaadams in #7537
- Perf/Parallelize Pruning by @asdacap in #7541
- 7553 get elapsed time refactoring by @ssonthal in #7558
- Perf/skip commit queue by @asdacap in #7571
- Re Add Malloc Trim by @benaadams in #7587
- Disable txpool if SequencerUrl is set by @benaadams in #7513
- Skip committing state during warmup by @benaadams in #7595
- Reduce branches in HexPrefix.FromBytes by @benaadams in #7596
- Perf/parallelize storage commit by @asdacap in #7605
- Feature/FlushWAL on flush. by @asdacap in #7642
- Optimization/pre warm intra block cache fix nonce collisions by @LukaszRozmej in #7089
- Vectorize Keccak state copy, remove temp array use by @benaadams in #7663
- Avoid expensive Stelem_Ref covariant checks in Trie by @benaadams in #7675
- Perf/faster full tree visit by @asdacap in #7692
- Switch off Response Compression for loopback by @benaadams in #7782
- Perf/statesync use treepath by @asdacap in #7783
- Bls Signature refactoring & performance by @Marchhill in #7678
- Feature/Dont download existing block by @asdacap in #7665
4444
Shutter
- Shutter: P2P improvements by @Marchhill in #7545
- Shutter: validator registry V1 by @Marchhill in #7682
- Shutter: Validator registry v0 backwards compatibility by @Marchhill in #7724
- Shutter: refactor & increase disconnection log timeout by @Marchhill in #7722
- Shutter: p2p logging by @Marchhill in #7735
- Shutter: increase BlockUpToDateCutoff by @Marchhill in #7856
Optimism
- Remove barriers from OP/BASE mainnet by @kamilchodola in #7624
- Add pivot updator for optimism by @marcindsobczak in #7586
- Add OP Holocene fork by @emlautarom1 in #7761
- Enable Networking on OP/Base archive nodes by @kamilchodola in #7778
- Add missing Discv5 support for archive op/base nodes by @kamilchodola in #7870
- Fix op-mainnet snapshot by @deffrian in #7881
- Optimism post-bedrock Legacy transaction validation by @emlautarom1 in #7887
Bug fixes and stability
- Fix/discv5 not throttling by @asdacap in https://github.com/N...
v1.30.0-rc
Major Highlights
Gnosis shutterized transactions
Shutter, a cutting-edge privacy solution leveraging threshold cryptography, is now officially supported in Nethermind 1.30.0. Initially enabled for a selected group of validators, it is now available for everyone. Shutter encrypts transactions in the mempool, keeping transaction details private until finalized on-chain. This ensures protection against frontrunning and supports fair and secure transaction execution on the Gnosis Chain.
Enabling Shutter in Nethermind:
-
Update to Nethermind 1.30.0
-
Generate validator registration files by following the intructions in Shutter Validator Registration repository
-
Configure Nethermind as follows:
--Shutter.Enabled true --Shutter.ValidatorInfoFile /data/execution/validatorInfo.json
-
Run Nethermind with the updated configuration to enable Shutter functionality.
Gigagas performance
We introduced several significant performance enhancements that substantially boosted tip-of-chain processing times. These improvements enabled us to achieve an impressive average processing throughput of 1 Gigagas/s, as recorded on the Base Mainnet chain.
One of the most impactful changes was optimizing and parallelizing in-memory pruning. This process is now significantly faster and no longer interferes with the block processing thread, reducing the likelihood of block processing spikes.
New supported chains
We added support for two new L2 networks: Taiko and Linea. To start with these networks, use the command below configurations:
taiko-mainnet
taiko-hekla
linea-mainnet
linea-sepolia
Additionally, as part of the preparation for Pectra hard-fork, we added support for the Mekong testnet. To run it, use -c mekong
and ensure the respective consensus client version is running alongside.
Optimism improvements
For the Optimism implementation, we introduced support for the new hard-fork, Holocene, which took place on the Sepolia chains.
Additionally, we enabled our AutoPivot mechanism for new nodes starting synchronization. This significantly reduces the duration of the initial sync stage for OP and Base nodes, cutting the total sync time by approximately 30–60 minutes.
CLI updates
As a part of our efforts following Posix CLI conventions for our command line options, we introduced all lowercase dash-separated alternatives for all Nethermind command line options. For instance, --JsonRpc.JwtSecretFile
can be spelled as --jsonrpc-jwtsecretfile
or --Metrics.Enabled
as --metrics-enabled
.
Some option names have been deprecated (while still supported with a warning) in favor of new ones. For instance, -dd, --datadir
is deprecated in favor of --data-dir
.
Also, Nethermind configuration files now have a .json
extension instead of the previous .cfg
one. While this should not cause any issues for our users, we highly recommend not using extensions when specifying config names – always prefer -c mainnet
over -c mainnet.json
, or -c mainnet.cfg
. Note that this does not apply to the cases when the -c
option specifies a path, e.g. -c path/to/mainnet.json
.
For more info, see configuration docs.
Changelog
New features
- Gnosis Shutter by @Marchhill in #7414
- Support for state override parameter in some RPC methods by @alexb5dh in #7362
Pectra
- Pectra EIPs 6110, 7002, 7685 by @MarekM25 in #7421
- Pectra payload bodies by @MarekM25 in #7429
- EIP-4844-Pectra: Blob gas fee collection for Gnosis by @Marchhill in #6866
- EIP-7702 and EIP-7251 by @ak88 in #7459
- Changes for EIP7685, 7002 & 6110: Flat Encoding of requests by @rjnrohit in #7670
New chains
- Add Linea L2 by @jmederosalvarado in #7555
- Taiko by @jmederosalvarado in #7326
- Add configs for mekong testnet by @ak88 in #7713
Performance
- Keccak avx512 by @benaadams in #7660
- fix casting when tracing by @LukaszRozmej in #7464
- Move txPool work from Processing loop event to txPool thread by @benaadams in #7469
- Remove 5 flow control exceptions by @benaadams in #7537
- Perf/Parallelize Pruning by @asdacap in #7541
- 7553 get elapsed time refactoring by @ssonthal in #7558
- Perf/skip commit queue by @asdacap in #7571
- Re Add Malloc Trim by @benaadams in #7587
- Disable txpool if SequencerUrl is set by @benaadams in #7513
- Skip committing state during warmup by @benaadams in #7595
- Reduce branches in HexPrefix.FromBytes by @benaadams in #7596
- Perf/parallelize storage commit by @asdacap in #7605
- Feature/FlushWAL on flush. by @asdacap in #7642
- Optimization/pre warm intra block cache fix nonce collisions by @LukaszRozmej in #7089
- Vectorize Keccak state copy, remove temp array use by @benaadams in #7663
- Avoid expensive Stelem_Ref covariant checks in Trie by @benaadams in #7675
- Perf/faster full tree visit by @asdacap in #7692
- Switch off Response Compression for loopback by @benaadams in #7782
- Perf/statesync use treepath by @asdacap in #7783
- Bls Signature refactoring & performance by @Marchhill in #7678
- Feature/Dont download existing block by @asdacap in #7665
4444
Shutter
- Shutter: P2P improvements by @Marchhill in #7545
- Shutter: validator registry V1 by @Marchhill in #7682
- Shutter: Validator registry v0 backwards compatibility by @Marchhill in #7724
- Shutter: refactor & increase disconnection log timeout by @Marchhill in #7722
- Shutter: p2p logging by @Marchhill in #7735
Optimism
- Remove barriers from OP/BASE mainnet by @kamilchodola in #7624
- Add pivot updator for optimism by @marcindsobczak in #7586
- Add OP Holocene fork by @emlautarom1 in #7761
- Enable Networking on OP/Base archive nodes by @kamilchodola in #7778
Bug fixes and stability
- Fix/discv5 not throttling by @asdacap in #7511
- Fix Blob index locking v2 by @LukaszRozmej in #7572
- Fixes for P2P message disposing by @alexb5dh in #7578
- Fix null pointer in RecoverSignatures by @ak88 in #7564
- Fix recreation of light blob tx collection by @marcindsobczak in #7584
- Fix inacccurate memory metric due to concurrent writes by @asdacap in #7600
- Set metrics consistently before request completion by @benaadams in #7599
- Refactor TransactionForRpc (Alternative) by @emlautarom1 in #7483
- Fix BeaconBlockRootHandler by @yerke26 in #7604
- Block beacon header sync until global pivot is updated by @marcindsobczak in #7614
- Fix json response in engine_getBlobsV1 by @marcindsobczak in #7650
- Fix/allow beacon header sync if pivot update is disabled by @marcindsobczak in #7651
- Adjust Optimism (Mainnet) TotalDifficulty calculation by @emlautarom1 in #7647
- Fix tx registration order by @flcl42 in #7668
- Fix UnsafePivotUpdator by @marcindsobczak in #7673
- Fix + se...
v1.29.1
Release Notes
Major Highlights
Improved memory usage on Linux
In this version, we fixed a regression issue that caused Linux machines to slowly consume more memory than expected.
In 95% of situations, it did not cause any OOMs; in some specific situations, it restarted a node periodically.
Fixed and improved OP Stack sync
This version also addresses problems with the OP Mainnet sync and makes it faster by removing the snapshot download capability and improving snap sync performance. Now, OP Stack networks are syncing well.
In the meantime, we discovered a few potential further optimizations that will be added to an upcoming release.
Fixed an edge-case block production issue
On the Gnosis chain, we discovered an edge-case scenario in which an incorrect block could be built due to a bug in handling certain rare combinations of transactions. The issue has been fixed, and we can confirm that everything is working well now.
Full Changelog: 1.29.0...1.29.1
v1.29.0
Major Highlights
Breaking changes
Configuration flag Discovery.Discv5Enabled
is replaced with a more generic flag: Discovery.DiscoveryVersion
with V4
as a default value. To enable v5 discovery, use the following: --Discovery.DiscoveryVersion=V5
.
Heuristic transaction censorship detection
We have introduced heuristics-based censorship detection in the Nethermind client. Censorship is detected using two kinds of heuristics, namely, high-paying transaction censorship and address censorship.
In the former, a block is marked potentially censored if the highest non-blob transaction included in the block is worse than the best non-blob transaction available in the pool. The latter, which could also be opted out of, requires specifying a list of addresses that we want to track censorship for. We count the number of tracked addresses to which transactions better than the worst non-blob transaction in the block is sent. If the number of such addresses in the block is less than half the number of these addresses in the pool, we mark the block as potentially censored. If two consecutive blocks are flagged as potentially censored, regardless of the kind, we detect censorship.
Detection of censorship sets the ShouldOverrideBuilder
flag to true which acts as a circuit-breaker and communicates to the beacon node that it should fall back to local execution instead of relying on the builder's block.
Performance improvements
On Windows block validation performance used to degrade over several hours due to the default native allocator used by RocksDB. In #7418 we changed this to use the newer SegmentHeap
that was introduced in Windows 10 and you can see there is now no throughput degradation over-time and Nethermind maintains a very high tip of chain processing speed.
Base and Ethereum target MGas/s chain speed are added for reference above.
With this change, as well as 25 other performance improvements, Nethermind maintains a throughput an order of magnitude higher than even Base’s current gaslimit on a gaming or high end workstation PC (with locally PCIe attached Samsung 990 Pro NVMes).
This is also reflected in the end to end new payload processing; receiving and parsing the Json request from the consensus client to producing the validated Json response per block on average in under 20ms.
Slot time for mainnet is 12000ms, and ideally without ePBS the EL should complete in under 4000ms; with ePBS it has the full slot to complete. So Nethermind; on this setup, even at max time is completing the block with 98% of headroom remaining.
- Reduced memory during Archive, Full Sync and head catchup
- Introduced idle memory cleanup if waiting for new blocks from consensus layer; which can happen during head catchup, depending on consensus peering
- Introducing a new Macro Op:
EXTCODESIZE+POP
which was a common pattern during the Shanghai DoS attacks; however the opcode pair combination can also be evaluated to a NOP not requiring to access the account or code for the address referred to. - Non-allocating key generation for In64 keys; this becomes impactful as these sync modes process more than 3000 blocks per second.
- Calculate all the receipts’ blooms together in parallel
- Fast wait-free and lockless Keccak cache; applied in a targeted manner (as most Keccaks are random), where the same address or UInt256 is keccak’d multiple times.
- Further improvements to data prewarming for the transaction pipeline processing.
Changelog
New features
- Heuristic tx censorship detection by @Arindam2407 in #7259
- Add
engine_getBlobsV1
by @marcindsobczak in #7322 - Option to run Discovery V4 and V5 on the same port by @alexb5dh in #7213
- Implement eth_getRawTransactionByHash by @LukaszRozmej in #7425
- Feature/geth like system tx by @LukaszRozmej in #7252
Bug fixes and stability
- Incorrect batch unwrapping in JSON-RPC replay tool by @emlautarom1 in #7279
- Eth_simulate blob related bugfixes by @OlegJakushkin in #7308
- Bugfix/snap and syncerver by @MarekM25 in #7305
- fix eth_gasEstimate issue by @rjnrohit in #7312
- JSON RPC: fix missing params when all are optional by @LukaszRozmej in #7318
- Fix resources cleanup in eth/* protocols by @alexb5dh in #7311
- Removes custom args validation and uses library one by @LukaszRozmej in #7359
- Fix frequent warning on invalid Discovery packet size by @alexb5dh in #7395
Optimizations:
- Changes Windows native Allocator so it doesn't degrade over time by @benaadams in #7418
- Calculate receipt blooms in parallel by @benaadams in #7473
- Reduce backlog threshold for GC by @benaadams in #7415
- Introduces prewarming of all addresses; which can continue ahead of tx prewarming by @benaadams in #7423
- Macro Op: EXTCODESIZE+POP, turns a (historic) DoS vector into a NOP by @benaadams in #7437
- [Fix]
MultiSyncModeSelector
.Changed
event propagation being blocked by SyncFeed by @smartprogrammer93 in #6529 - Optimize out DaoTransition call by @benaadams in #7468
- Introduces memory cleanup while idle to reduce memory size by @benaadams in #7432
- Allows precaches to clear in background between blocks and reduces overclearing by @benaadams in #7442
- Use non-allocating Int64 key generation by @benaadams in #7413
- Fast SIMD address equals by @benaadams in #7417
- Removes two flow control exceptions for a faster path by @benaadams in #7436
- Reduce memory use during Archive Sync by @benaadams in #7407
- Add dual array concat overload by @benaadams in #7377
- Reduce collection resizing costs by @benaadams in #7360
- Only need single stack for stacks by @benaadams in #7375
- Prewarm txns in order (of processing) by @benaadams in #7327
- Improve parallel signature recover by @benaadams in #7353
- Reduce contention in ClockCache by @benaadams in #7338
- Clock cache additional improvements by @benaadams in #7339
- Move prewarm wait to end of all block activity by @benaadams in #7348
- Reduces memory use for peer Discovery message deserialization by @benaadams in #7427
- Use ClockCache rather than LurCache for blocks and headers by @benaadams in #7439
- Fast Keccak cache (wait-free and lockless) by @Scooletz in #7336
Other changes
- LoadFromTree improve tracing closure name by @benaadams in #7342
- Revise the configuration options docs by @rubo in #7465
- Fix compile errors by @rubo in #7357
- Fix argument null checks by @rubo in #7466
- Fix last seen asserts by @benaadams in #7384
- Refactor and improve DB size generator by @rubo in #7450
- Moved BlockProductionTimeout to config, increased BlockProductionTimeout by @MarekM25 in #7378
- OP funding by @MarekM25 in #7387
- Funding OP RPGF, project nr 2 by @MarekM25 in #7388
- Funding OP RPGF by @MarekM25 in #7389
- OP RPGF funding.json by @MarekM25 in #7391
- Upgrade to RocksDB v9.4.0 by @rubo in #7300
- Disable warning in engine_getBlobsV1 by @marcindsobczak in #7380
- removed log in EthereumEcdsa as dependency by @ak88 in #7217
- Configure Optimism and Base fast sync settings update by @rubo in #7448
- Refactor
TxValidator
by @emlautarom1 in #73...
v1.28.0
Release Notes
Major Highlights
eth_simulate
eth_simulate
is a new JSON-RPC method that expands on eth_call
ideas allowing simulation (mocking) of multiple blocks with multiple transactions. Also, it allows users to:
- Define block variables
- Replace code and balance of accounts
- Override
ecrecover
precompile - Event logs and ETH transfer logs (
traceTransfers = true/false
)
See also eth_simulate
in PEEPanEIP and ethereum/execution-apis#484.
Optimism adjustments and fixes
This release enhances Nethermind's support of Optimism with several key updates. JSON-RPC compatibility is improved, the API exposes Optimism-related fields in more places, and the OP transaction processor is now integrated into the trace
namespace of JSON-RPC. Fork rules, RIP-7212, gas calculations, and receipt fields are aligned with Optimism's Fjord specifications.
Several fixes for block production, gas calculations, and other areas have been applied, along with numerous general performance improvements. The new discovery protocol (discv5) allows participation in the P2P network and quick node sync.
Additionally, Nethermind can now act as an Optimism Sequencer, increasing its utility within the ecosystem. These updates dramatically enhance Nethermind's reliability and functionality for Optimism.
To run a node, use existing configs like op-mainnet
, base-mainnet
, op-sepolia
, base-sepolia
, or assemble your own. Don't forget to enable discv5 and provide the sequencer URL as needed:
--Discovery.Discv5Enabled true --Optimism.SequencerUrl https://sepolia-sequencer.optimism.io
Gnosis and Chiado snap sync enabled by default
Starting from this release, the Gnosis and Chiado chains will be synced much faster from scratch thanks to the Nethermind snap serving feature, which has been active on Gnosis for the last few months. With plenty of nodes capable of serving these data, the team decided to switch on snap sync on both chains.
Below is a comparison of sync time before and after this change:
Gnosis Sync Time | 1.27.1 | 1.28.0 |
---|---|---|
Tip of chain | 8 hours 20 minutes | 25 minutes |
Including historical data | 13 hours | 5 hours 45 minutes |
Pruning.CacheMb
values
We recently discovered that the Pruning.CacheMb
option with values higher than the default ones is causing performance degradation.
This setting was commonly increased on the previous state DB schema (before v1.26.0) to slow down disk growth, but starting from the beforementioned version, this gives negligible improvements while causing significant performance degradation during in-memory pruning.
So, we recommend reducing it back to 1024 (max to 2048) if the validator connected to the node experiences some missed attestations.
Nethermind Launcher removal
Nethermind Launcher has been removed from distribution packages as obsolete. Nevertheless, it's still available to download from its repo.
Removal of unused plugins
In this version we removed several not used plugins and deprecated implementations to reduce complexity of code base.
Users which are using Nethermind package directly (not through Docker, PPA or other sources) will need to wipe the Nethermind directory except nethermind_db
, logs
and configs
directories. Also any custom plugins in plugins
directory should be kept - all others should be removed.
The error message user will face is:
Failure System.TypeLoadException: Method 'Create' in type 'Nethermind.Mev.MevBlockProducerTransactionsExecutorFactory' from assembly 'Nethermind.Mev, Version=1.27.1.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
Changelog
New features
- Add eth_simulate , support array of eth_call for simulation across multiple blocks by @OlegJakushkin in #5530
- Implement
debug_standardTraceBadBlockToFile
method by @rubo in #7278
Verkle
- remove backfill from eip 2935 and serve hashes from state when eip 7709 enabled by @yerke26 in #7140
Performance
- Skip prewarming tx if main processing has caught up by @benaadams in #7143
- Handle parallel withdrawals in pre-warmer by @benaadams in #7152
- Remove parallel from withdrawal warmup by @benaadams in #7153
- Don't boost priority of forkchoice if syncing by @benaadams in #7158
- Fix low object LruCaches by @benaadams in #7160
- Optimization/cache precompiles by @LukaszRozmej in #7106
- Increase Lru tests by @benaadams in #7178
- Skip updating prewarm caches on main thread by @benaadams in #7203
- Reduce allocations in metrics backed by Zero Contention Counter by @benaadams in #7206
- Switch to lower contention ClockCache by @benaadams in #7215
- Use intrinsic for GetHighestSetBitIndex by @benaadams in #7224
- Add 256bit and 512bit vectorized hex decode by @benaadams in #7226
Gnosis
- Enable SnapSync on Gnosis by default by @kamilchodola in #7295
Optimism
- Add custom Eth module that exposes additional OP related fields by @flcl42 in #7096
- Use OP tx processor in trace RPC module by @flcl42 in #7118
- Update config, gas calculations, receipt fields according to OP's Fjord by @flcl42 in #7129
- EIP/RIP-7212 by @alexb5dh in #7135
- Add fields to OP rpc; fix Ecotone gas issue; update pivots by @flcl42 in #7180
- Fixes OP CL driven block production by @flcl42 in #7240
- Discv5 by @flcl42 in #7061
- Use Nethermind as Optimism Sequencer by @emlautarom1 in #7287
Bug fixes and stability
- Reduce space use spike after sync by @asdacap in #7138
- buffer until all logs are available: eth_getLogs by @rjnrohit in #7141
- Stop StreamPipeWriter from throwing when passed a null options feild by @smartprogrammer93 in #7144
- fix not completing the writing of the JsonRPC response by @smartprogrammer93 in #7146
- No batch processing needed in case of single blob by @flcl42 in #7159
- FCU to return VALID for blocks of a correct chain without state by @flcl42 in #7151
- Throw on non-empty storage by @flcl42 in #7194
- catch rlp exception: debug_traceBlock by @rjnrohit in #7204
- Discovery when offline on start by @flcl42 in #7223
- Handle un-accessed storage slots in self-destruct by @LukaszRozmej in #7255
- Allow zero sized caches by @benaadams in #7257
- Fix batch collection massages through sockets by @LukaszRozmej in #7265
- Load local key if MiningConfig.Enabled is true by @LukaszRozmej in #7267
- RPC Tx lookup changes by @LukaszRozmej in #7282
Other changes
- Don't limit eth_getLogs on authenticated context by @LukaszRozmej in #7149
- Replace
JwtSecurityToken
withJsonWebToken
by @rubo in #7177 - Add consistent progress bars for syncing by @benaadams in #7212
- Log state sync process every 10 secs rather than every 1 sec by @benaadams in #7254
- Switch to McMaster.Extensions.CommandLineUtils package by @rubo in #7261
- Switch to Microsoft.IdentityModel.JsonWebTokens package by @rubo in #7269
- Add module name to module disabled message by @LukaszRozmej in #7283
- Remove Mantic from PPA by @rubo in #7296
- Update packages by @rubo in #7298
New Contributors
- @healthyyyoung made their first contribution in #7163
- @bchcoke made their first contribution in #7176
- @alexb5dh made their first contribution in #7135
- @taikoonwang made their first contribution in https://github.com/NethermindEth/nethermind/pul...
v1.27.1
Release notes
⚠️
This release is a mandatory upgrade for all nodes operating on the Gnosis chain.
Please update your node to this version to ensure correct node functionality.
This release fixes improperly enabled pre-warming blocks on Aura and OP chains. In a very rare situation, this could cause an issue in block processing.
Full Changelog: 1.27.0...1.27.1
v1.27.0
Release notes
Major Highlights
This release brings 159 performance improvements and critical bug fixes to the Nethermind client, significantly enhancing its efficiency and reliability. It is a continuation of big block processing improvements:
- v1.25.4 to v1.26.0: Improved block processing by about 70 to 80% (from 68 to 107 MGas/s)
- v1.26.0 to v1.27.0: Improved block processing by about 150% (from 107 to 254 MGas/s)
We are already working on the next improvements, increasing MGas/s throughput even more.
Intra-block cache
One of the key advancements in this release is the implementation of an intra-block cache. This feature optimizes the processing of transactions within blocks. By leveraging caching mechanisms, the system can avoid recalculating the state for transactions within the same block. This not only reduces redundant computations but also accelerates block execution, leading to a notable boost in overall performance.
Building on this, the intra-block cache has been further enhanced with a pre-warming technique during block execution. This optimization pre-loads necessary state data into the cache ahead of time, minimizing delays caused by cache misses during transaction processing. The result is a smoother and more efficient block processing experience, with reduced latency and improved throughput.
Changelog
New features
- Add native prestate tracer by @natebeauregard in #6907
- Add native call tracer by @natebeauregard in #6945
- Intra-block cache by @benaadams in #7039
- Pre-warm intra block cache during block execution by @LukaszRozmej in #7055
- Feature external signer by @ak88 in #6780
Pectra
- EIP-2537 by @Marchhill in #6964
Verkle
- EIP-2935: Save historical block hashes in state by @tanishqjasoria in #6925
Optimism
- Override RLP decoders with ones from plugins; fix op decoder by @flcl42 in #6969
- Forward eth_sendTransaction to the sequencer by @deffrian in #7017
- Fix ecotone fee logic by @deffrian in #7009
Performance
- McsLock fast-paths by @benaadams in #6884
- Add caching to FeeHistoryOracle.GetFeeHistory by @obasekiosa in #6819
- Reduce contention inside RocksDB during OldReceipts by @benaadams in #6890
- Only persist net SStore changes by @benaadams in #6931
- Use Avx512Vbmi for endianness swapping by @benaadams in #6946
- Vectorize DataCost by @benaadams in #6953
- Optimize CountLeadingZeros by @benaadams in #6954
- Skip hash validations when block comes from NewPayload by @LukaszRozmej in #6952
- Optimize Rlp Encoding by @benaadams in #6957
- Less allocations for node processing by @benaadams in #6967
- Reduce string allocs by networking by @benaadams in #6971
- TxFilteringState as stack ref struct by @benaadams in #6972
- Only lookup from dirty nodes once by @benaadams in #6973
- Reduce TxPool allocations by @benaadams in #6970
- Perf/read rpc message to end by @LukaszRozmej in #6951
- Improve TrieStore Dictionary use and Hashing by @benaadams in #6979
- Traverse trie branches in same stack frame by @benaadams in #6981
- Don't use tracing for non-traced rpc calls by @benaadams in #6988
- ArrayPoolList.ReduceCount clear only remaining length by @benaadams in #6998
- Perf PatriciaTree.Run by @benaadams in #7002
- Use existing array for precompile result by @benaadams in #7001
- Remove subroutines (eip2315 withdrawn) by @benaadams in #7007
- Use ArrayPool for Kzg.AreProofsValid by @benaadams in #7016
- Wait for background JumpDestinationAnalysis if in progress by @benaadams in #7008
- Remove witness protocol support by @LukaszRozmej in #7020
- Set dedicated block cache for blob transactions by @asdacap in #7032
- Optimize/keccak by @LukaszRozmej in #7038
- Eliminate bounds checks in Bloom by @benaadams in #7049
- Only recalculate storage roots once per block by @benaadams in #7021
- Feature DB File warmer by @asdacap in #7050
- Parallel Trie Branch KeyGeneration by @benaadams in #7048
- Txpool state cache by @benaadams in #7046
- Use tighter locking for Node list enumerator by @benaadams in #7070
- Fast Call to Non contract addresses by @benaadams in #7074
- Reduce objects used by LruCaching by @benaadams in #7100
- Warm up empty trees for accesslists by @benaadams in #7111
- Use NonBlocking ConcurrentDictionary in a couple places by @benaadams in #7122
- Turn off GarbageCollectionAdaptationMode by @benaadams in #7127
- Limit contended paths to physical cores not logical cores by @benaadams in #7132
- Cap DotNetty Threads by @benaadams in #7134
- use AccountChanges only in main processing thread by @LukaszRozmej in #7128
Bug fixes and stability
- Fix sending new single tx p2p update by @flcl42 in #6895
- Update FCU params handling order and return codes by @flcl42 in #6870
- Fix PPA dependencies by @rubo in #6897
- Fix trie exception when killed after memory pruning before next block by @asdacap in #6902
- Fix JsonRPc Double dispose by @obasekiosa in #6901
- Load td for beacon block if possible to help handle multiple fcus sent with no delay by @flcl42 in #6878
- fix tracer name empty exception by @FatTigerWang in #6915
- Javascript Tracer resource leak by @Marchhill in #6929
- Fix too eager dispose in js block tracing by @LukaszRozmej in #6987
- fix: Use dpkg instead uname to get unified arch in postinst debian script by @kayano in #6991
- Fix/6790 return accepted for rejected tx added to broadcast by @pxyxyrus in #6889
- Fix commit in ClientVersionV1 to have only 4 bytes of info following the spec by @smartprogrammer93 in #7013
- fix blobbasefee opcode by @yerke26 in #7043
- Remove tx also from worst sorted values by @benaadams in #7079
- fixed KeyExists function in KeyValueStore by @yerke26 in #6984
- Fix/proof generation by @asdacap in #7081
- If worsevalue removed but not found, reinsert new worst item by @benaadams in #7097
- Fix/arg out of range SnapProvider.AddAccountRange by @ak88 in #7060
- Fixed EVM Metrics with a small modexp->exp bug by @MarekM25 in #7113
- Fix pruning with LruCaheLowObject by @benaadams in #7114
- Persistently remove worst item until actually removed by @LukaszRozmej in #7130
Other changes
- Add a more secure way of estimat...
v1.26.0
Release notes
Major highlights
State design upgrade: Half-path
This version introduces a new approach to the state database: half-path. It replaces the previous approach, which we will call hash for these notes.
The goal of half-path is to improve the performance of the existing database without significant codebase changes. It is a middleware between the hash and full-path-based designs (which we are currently working on). It is mainly aimed at validators' performance (we observed a significant improvement in effectiveness) and, as a side effect, improving archive nodes' sync.
Major achievements
- Block processing time is faster by about 30 to 50% (depending on the hardware setup), but we observed that it improves low-end setups more, so the cost of hosting nodes using Nethermind software may decrease.
- The state database size is ~25% smaller (the previous approach is now close to 200 GB while the half-path is around 150 GB). This is only for the state database. After snap sync, the entire database will decrease by ~50 GB but still hover around 900 GB.
- State database growth is significantly reduced—the slower the database grows, the less maintenance around the node is needed.
We are still observing the exact numbers and applying some optimizations to make it as close as possible to "live pruning", but the database should grow about 10 to 20 times slower (to see the full effect, it may need 1 or 2 weeks—growth ratio will be dropping after that time). - Faster archive node sync. As half-path is not meant to optimize archive nodes, we observe that it is quicker than the previous implementation (8mln blocks processed about 30 to 40% faster, and the gap was only increasing—more tests around that are to be conducted).
- Smaller archive node database. As stated above, the major goal of the half-path wasn't to make the archive node smaller, but what was observed was 2.4 TB vs 1.7 TB at the 8mln blocks checkpoint—and the gap was getting bigger. We are now checking the final numbers.
Making the migration to the half-path hassle-free
- All newly synced nodes will use half-path as the default state design. If node operators want to use the previous approach, they can specify it with
--Init.StateDbKeyScheme Hash
. - All existing nodes that are synced with the old hash approach will remain on it.
Env variable equivalent of this flag is: NETHERMIND_INITCONFIG_STATEDBKEYSCHEME=HalfPath/Hash
Migration to half-path
- Full resync. This is the simplest yet most effective way to migrate. As Nethermind syncs quickly back to the head, it may take just 1-2 hours to get back on track.
- Full pruning. There is an option to migrate while staying online using the full pruning functionality. The downside of that approach is that pruning will take much longer to finish, and users will need to restart their nodes with
--Init.StateDbKeyScheme HalfPath
— without it, pruning will behave as before, so it will recreate the state with the previous database approach. To reduce slowdown, the user should increase the default full pruning memory budget to at least 8 GB:--Pruning.FullPruningMemoryBudgetMb 8000
.
Upgrading from previous versions
- From v1.25.4. The node will remain on the previous hash design. To migrate to half-path please see the migration instructions above. If the node operator does not want to migrate, it is completely fine to stay on the hash design, as it will still be fully supported.
- From v1.26.0-exp. The node will remain on the half-path design. No resync is needed between v1.26.0 and its pre-release versions—all optimizations and bugfixes are automatically applied.
Learn more
More details about the half-path and other state redesigns which we are still exploring, can be found here. Please also refer to #6331, which contains all of the changes around the half-path and more in-depth details about specific performance metrics.
Snap serving
We're excited to share that Nethermind now supports snap serving, a capability previously unique to Geth. This is a big step for the Ethereum ecosystem, offering redundancy and easing Geth's considerable responsibility in maintaining network health.
This achievement doesn't diminish Geth's critical role but reinforces our shared goal of a resilient Ethereum. We see this as an opportunity to distribute the workload, ensuring the network's strength through diversity.
This feature was previously present but required a change to the database layout for efficient performance. Nodes running on the old hash approach will not enable snap serving by default. Snap serving's performance is too low on this design and may affect the node's overall performance. If a node operator wants to enable it on hash design, there is an option --Sync.SnapServingEnabled true
, although we don't recommend it.
Important
During snap serving for other nodes, the overall performance of the node may be slightly worse. Please reach out to us on Discord with all observations so more optimizations can be discovered and applied. At the same time, it is advised to keep it enabled for the sake of network health.
Rootless and chiseled Docker image
This release introduces a new chiseled rootless Docker image for enhanced security.
These image tags have the -chiseled
suffix and run the Nethermind process on behalf of the non-root app
user with UID/GID of 64198
.
Snappy dependency removal
Nethermind no longer needs the Snappy (libsnappy-dev) to be installed on Linux.
Deprecated options
--Sync.FastBlocks
has been deprecated. It is advised to remove this option from your custom configs, environment variables, or flags passed to the client. See #6792 for more details.
Deprecated metrics
Multiple database and networking metrics are now deprecated and will be removed in the next release. These metrics follow the format:
nethermind_*_db_size
nethermind_*_db_reads
nethermind_*_db_writes
nethermind_*_disconnects
nethermind_*_received
nethermind_*_sent
They have been consolidated to labeled metrics:
nethermind_db_size{db=*}
nethermind_db_reads{db=*}
nethermind_db_writes{db=*}
nethermind_local_disconnects_total{reason=*}
nethermind_remote_disconnects_total{reason=*}
nethermind_incoming_p2p_messages{message=*}
nethermind_outgoing_p2p_messages{message=*}
Changelog
New features
- Perf/HalfPath state db key by @asdacap in #6331
- Feature/snapsync server by @asdacap in #6722
- Feature/debug get bad blocks by @kjazgar in #3838
- Add eth_blobGasPrice/eth_gasPrices; update eth_feeHistory by @flcl42 in #6563
- Add engine_getClientVersionV1 API support by @rjnrohit in #6814
- Introduce chiseled Docker image by @rubo in #6467
- Feat/native 4byte tracer by @natebeauregard in #6864
Optimism
Performance
- Speed up trie node traversal by @benaadams in #6436
- Return to NoGCRegion now runtime bug is fixed by @benaadams in #6381
- Reduce allocations of Gossip filter closures by @benaadams in #6495
- Optimize Jump Destination Analysis by @benaadams in #6502
- Reduce allocations in StorageRangesMessageSerializer by @benaadams in #6534
- Propagate pooled arrays to RlpStream by @benaadams in #6536
- Further Improve JumpDestAnalysis (x20 improvement) by @benaadams in #6554
- Avoid boxing in AccessLists by @benaadams in #6578
- Trie RlpStreams as structs by @benaadams in #6584
- Hunting allocations by @LukaszRozmej in #6601
- Hunting allocations 2 by @LukaszRozmej in #6604
- Hunting allocations 3 - introduce AccountStruct by @LukaszRozmej in #6605
- Exclude Tx Hashes when serving Blocks & apply network back pressure by @benaadams in #6636
- Allow retrieving memory traces that are unconstrained in size by @guidovranken in #6649
- Perf/fetch blockheader from peer on FCU if block so that it start beacon header sync. by @asdacap in #6650
- Perf/background task scheduler by @asdacap in #6655
- Improved single byte Rlp.DecodeByteArray by @benaadams in #6711
- Optimize RLP length calculation by @PaulusParssinen in #6729
- Faster Json RPC Dispatch by @benaadams in #6746
- Leaf value collector by @asdacap in #6795
- Perf/dont redownload downloaded code by @asdacap in #6873
Bug fixes and stability
- Fix/flush on snap fin...
v1.25.4
Release notes
⚠️ This release is a mandatory upgrade for all nodes operating on the Ethereum Mainnet and Gnosis.
Please update your node to this version to ensure correct node functionality.
Major highlights
Mainnet Dencun hard fork
The Mainnet Dencun hard fork is scheduled on Mar 13, 2024 at 13:55:35 UTC (epoch 269568)
Gnosis Dencun hard fork
The Gnosis Dencun hard fork is scheduled on Mar 11, 2024 at 18:30:20 UTC (slot 14237696)
PPA package
The PPA package has been revised, including the version and installers. Since the version has been fixed to be 1.25.4 instead of 1.2540, installing the latest version requires the manual removal of the previous one as follows:
# ⚠️ If your data directory is in the default location of /usr/share/nethermind, back it up before the package removal.
sudo apt-get purge -y nethermind
sudo apt-get update
Changelog
Cancun
- Add Cancun hard-fork settings for Gnosis by @rubo in #6709
- Cancun spec and config for mainnet by @smartprogrammer93 in #6679
- Compact blobs db for disk savings by @flcl42 in #6595
- Make sure that blob pool do not exceed maximum value set by @benaadams in #6702
Optimism
Bugfixes and new features
- Reduce default peers amount from 100 to 50 on mainnet nodes (not on archive nodes) to reduce a load on it and reduce amount of block processing spikes in #6743
- Reduce amount of hanging sockets with TIME_WAIT status by @benaadams in #6594
- Fix ParityTraceActionConverter to output init on create by @LukaszRozmej in #6606
- Fix TraceStore plugin by @LukaszRozmej in #6609
- Return BlockForRpc from debug_getBadBlocks by @flcl42 in #6612
- Revise PPA packaging by @rubo in #6618
- Improve memory management and reduce traffic while serving data to other peers by @benaadams in #6636
- Add
debug_getBadBlocks
support by @kjazgar and @Marchhill in #3838 - Add
Metrics.ExposeHost
option so a hostname other than "0.0.0.0" can be exposed by @tgerring in #6528⚠️
For now we decided to keep default behavior so ExposeHost will default to "+" which means "0.0.0.0" but in the future we are going to change default of that flag to "127.0.0.1" to reduce risk of remote access to metrics.
Full Changelog: 1.25.3...1.25.4