Releases: NethermindEth/nethermind
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.27.0-rc
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
v1.25.3
Release notes
⚠️ This release is a mandatory upgrade for all nodes operating on the following chains: Sepolia, Holesky, and Chiado.
Please update your node to this version to ensure correct node functionality.
Major highlights
Sepolia Dencun hard fork
The Sepolia Dencun hard fork is scheduled on Jan 30, 2024 at 22:51:12 UTC (epoch 132608)
Chiado Dencun hard fork
The Chiado Dencun hard fork is scheduled on Jan 31, 2024 at 18:15:40 UTC (epoch 516608)
Holesky Dencun hard fork
The Holesky Dencun hard fork is scheduled on Feb 07, 2024 at 11:34:24 UTC (epoch 29696)
Full Changelog: 1.25.2...1.25.3
v1.25.2
Release notes
This hotfix addresses the consensus issue in Nethermind that was introduced in v1.23.0. This release is mandatory for all Nethermind users.
No resync required. A consensus client restart is required without the need to resync it.
The v1.22.0 and below weren't affected.
A full postmortem will be published soon.
v1.25.1
⛔ THIS VERSION HAS A CONSENSUS ISSUE. Use v1.25.2 or later instead.
Release notes
Major highlights
Goerli Dencun hard fork
⚠️
This version supports the upcoming Goerli Dencun hard fork that is scheduled on Jan 17, 2024 at 06:32:00 UTC (epoch 231680)
Please update your node to this version to ensure correct node functionality.
Chiado Dencun hard fork
⚠️
This version supports the upcoming Chiado Dencun hard fork that is scheduled on Jan 31, 2024 at 18:15:40 UTC (epoch 516608)
Please update your node to this version to ensure correct node functionality.
Fixed eth_syncing
invalid behavior
In v1.25.0, the eth_syncing
method misbehaves for those who upgraded from the older version to the latest one (returned "syncing" when a node was fully synced). This version addresses this issue, so it properly returns the sync status.
Fixed extra bodies and receipts downloaded for the Mainnet after upgrading the long-living node
In v1.25.0, in some cases, the old bodies and old receipts started to download even though it should not have been the case on the synced nodes. This usually happens for older nodes that were synced a long time ago without any resync in the meantime.
Full Changelog: 1.25.0...1.25.1
v1.25.0
⛔ THIS VERSION HAS A CONSENSUS ISSUE. Use v1.25.2 or later instead.
Release notes
Major highlights
Goerli Dencun hard fork
⚠️
This version supports the upcoming Goerli Dencun hard fork that is scheduled on Jan 17, 2024 at 06:32:00 UTC (epoch 231680)
Please update your node to this version to ensure correct node functionality.
Optimism Canyon hard fork
The initial support of the OP in Nethermind was implemented right before the Canyon hard fork happened. Because of that, Nethermind nodes could not follow the chain after Canyon activation. Since this version, Nethermind supports Canyon hard fork on all OP-related chains.
Improved JSON serialization
We replaced the famous Json.NET library with the System.Text.Json implementation. As a result, we drastically reduced the memory overhead, improved the block processing time, and sped up JSON-RPC handling in general.
JavaScript tracers
The debug_trace*
JSON-RPC methods now support custom tracers written in JavaScript. This allows custom tracing logic and is in line with the Geth implementation.
Improved concurrency and reduced lock contention
- Changed to more scalable locks for both the transaction pool and LRU caches, ensuring better scalability on systems with high core counts.
- Used more scalable priority locks where block production and other tasks cross to give precedence to block production, optimizing performance in critical areas.
- During signature recovery, it was changed to access the transactions from the pool serially to reduce lock contention on the transaction pool while maintaining parallel processing for ECDSA and Keccak calculations for faster throughput.
New JSON-RPC methods
eth_getBlockReceipts
that is based on the previous Parity implementation and gives an easier way to get all receipts for transactions within a specified blockdebug_getRawBlock
debug_getRawReceipts
debug_getRawHeader
debug_getRawTransaction
These methods have been added to have a possibility to analyze encoded block/receipt/header/transaction
Downloading all historical bodies and receipts by default
On newly synced nodes, instead of using barriers set for a block with deposit contract for beacon chain (11052984), the node will sync all bodies and receipts till genesis:
- Healthier for the entire network
- Makes the database size bigger for freshly synced nodes (about 200 GB extra space will be needed)
- The change is made in a way that already synced nodes that are synced till the ancient barrier 11052984 will not sync anything in addition (to sync all of them, resync from scratch is required)
- This may be revisited as part of EIP-4444
Other performance improvements
With the migrations to .NET 8, we got a performance boost in various areas and reduced memory usage, which is especially beneficial for validators.
Changelog
New features
- Implemented eth_getBlockReceipts by @Marchhill in #6281
- Feature/ratelimit discovery messages by @asdacap in #6265
- Feature/javascript tracers by @LukaszRozmej in #6217
- [Config] Change default barriers of mainnet to 0 by @smartprogrammer93 in #6225
- Improved Json Serialization by @benaadams in #6152
- Add new RPC methods debug_getRawBlock, debug_getRawReceipts, debug_getRawHeader, debug_getRawTransaction by @Demuirgos in #6368
- Feature/exit on blocknumber by @asdacap in #6428
- Change locks to reduce lock contention by @benaadams in #6417
Cancun
- [Cancun]{Spec} Goerli config and fix for
ChainSpecBasedSpecProvider
by @smartprogrammer93 in #6409 - [cancun] fix
BlobBaseFee
not consistent with geth whenExcessBlobGas
is null by @smartprogrammer93 in #6320 - Blob txs reorgs by @marcindsobczak in #6254
- Enable blob txs support in goerli configs by @marcindsobczak in #6430
Optimism
Performance
- Serialize Json direct to Http stream rather than through intermediary buffers; further increasing performance and reducing latency of Json RPC by @benaadams in #6369
- Fix double write during full pruning by @asdacap in #6415
- Return error codes in Evm rather than throwing more expensive exceptions by @benaadams in #6406
- Reduce memory for GetPayloadBodiesByRangeV1 and GetPayloadBodiesByHashV1 by streaming the results immediately rather than building up the total response and then sending it all at once by @benaadams in #6287
- Don’t throw exceptions for missing nodes when searching for them (missing nodes) during sync by @benaadams in #6425
- Remove duplicate calls to FindHeader in eth_getLogs by @benaadams in #6421
- Remove Duplicate call to TryGetPendingTransaction in RPC by @benaadams in #6420
- RateLimiter: Remove unneeded async statemachine by @benaadams in #6418
- Increase regex cache size; which reduces memory usage in logging by @benaadams in #6408
- Reduce dictionary lookups by @benaadams in #6373
- Fix excessive timer allocation in rate limiter by @benaadams in #6354
- Use TryGetValue to halve Dictionary lookups by @benaadams in #6352
- Use runtime throw helpers to increase hot code (reduce cold code) in processor cache by @benaadams in #6348
- Broadcast local txs only if MaxFeePerGas is equal at least 70% of current base fee by @marcindsobczak in #6350
Metrics
- added metrics for bad blocks by @Marchhill in #6270
Logging
Bug fixes and stability
- [Fix] Potential fix to missing tx index sometimes (related to reorgs) by @smartprogrammer93 in #6422
- fix(db, rocks): total table size should include blobs by @shekhirin in #6289
- Fix missed release span on column db by @asdacap in #6302
- Fixed FinalTotalDifficulty based on genesis by @MarekM25 in #6435
Other changes
- Migrate to .NET 8 by @rubo in #6150
- Unify reputation settings by @asdacap in #6242
- Update Gnosis bootnodes by @4rgon4ut in #6329
- Refactor/state cleanup by @asdacap in #6260
- Skip signature only for TxType.DepositTx by @LukaszRozmej in #6349
- fix: typos in comment by @AdventureSeeker987 in #6360
- chore(src/Nethermind): typo fix by @dzizazda in #6363
New Contributors
- @Marchhill made their first contribution in #6281
- @shekhirin made their first contribution in #6289
- @4rgon4ut made their first contribution in #6329
- @shashankshampi made their first contribution in #6301
- @AdventureSeeker987 made their first contribution in #6360
- @dzizazda made their first contribution in #6363
Full Changelog: 1.24.0...1.25.0
v1.24.0
⛔ THIS VERSION HAS A CONSENSUS ISSUE. Use v1.25.2 or later instead.
Release notes
⚠️ WARNINGThis version cannot be downgraded. Once you upgrade to this version or sync from scratch with it, you cannot downgrade to any previous version.
Major highlights
-
Improvements to the headers database
- Reduce IOPS and bandwidth requirements during sync by up to 200Mbps or ~8% of overall bandwidth during sync
- Reduce IOPS and bandwidth requirements when serving headers to peers
- Require an additional 800MB of metadata database for the Mainnet
-
Supported networks adjustments
- Added OP Sepolia and Base Sepolia support
- Added archive configuration support for both Optimism and Base
For more info, see the
-c, --config <value>
flag and supported networks.For Optimism networks, ensure that networking is disabled to reduce unnecessary hardware usage.
Changelog
New features and important changes
Optimism
- Remove syncing check from ReviewBlockTree step by @jmederosalvarado in #6332
- Disable networking on OpStack configs by @jmederosalvarado in #6334
- Fix / Add OP configs by @jmederosalvarado in #6364
Bug fixes and stability
- Skip signature only for TxType.DepositTx by @LukaszRozmej in #6349
- Use Kestrel on Windows for metrics by @benaadams in #6326
Full Changelog: 1.23.0...1.24.0
v1.23.0
⛔ THIS VERSION HAS A CONSENSUS ISSUE. Use v1.25.2 or later instead.
Release notes
Major highlights
-
Optimism Support
-
Nethermind can now be used as an execution client for OP Stack chains, including Optimism and Base mainnets.
-
OP Stack network have a EL and CL concepts similar to Ethereum. Nethermind works as EL client, refer to optimism’s docs for how to run
op-node
as your CL client. -
Just run
nethermind -c op-mainnet
ornethermind -c base-mainnet
and you’re ready. -
The Canyon upgrade went live in Optimism and Base testnets very recently. Support for this upgrade is being worked on at the moment and will land in a future release, so if you try to sync this networks you won’t be able to go past the hardfork block.
💡 Some OP Stack networks (e.g. Op Mainnet and Op Goerli) have some legacy state that you need to download before actually running the client. We are hosting this legacy data as a snapshot file in our servers. The Nethermind client will automatically download and decompress it when you run it for the first time on Optimism Mainnet, no need for manual downloads. Refer to the snapshot plugin docs for more info.
-
-
Initialize Database from Snapshot
- There is now support for initializing the nethermind database from a
.zip
snapshot file. - This will be useful if you want to have backup copies of your node’s database for faster setup.
- For more information refer to the plugin docs.
- There is now support for initializing the nethermind database from a
-
Reduced memory usage spikes when node overloaded with CL requests
- Over the past few weeks, we've noticed a spike in memory usage on nodes, primarily due to numerous simultaneous GetPayloadBodiesByRangeV1 requests from CL clients.
- Our developers have identified an opportunity for optimization. Through these improvements, we've managed to significantly reduce memory consumption in high-stress scenarios. During our stress tests, we observed a reduction in additional RAM usage from 12GB to just 1-1.5GB.
- Furthermore, this memory is quickly freed up, allowing the node to return to its normal usage levels.
Changelog
New features and Important changes
- Optimism plugin by @deffrian in #6146
- Initialize database from snapshot by @jmederosalvarado in #6177
- Activate (most) JsonRPC endpoints before BlockReprocessing by @Demuirgos in #6143.
- Reduce memory for GetPayloadBodiesByRangeV1 and GetPayloadBodiesByHashV1 by @benaadams in #6287
Cancun
- TxPool: refactoring for blob txs by @marcindsobczak in #5953
- Make EIP-4844 parameters configurable by @rubo in #6192
- Rename EIP-4844 chain spec parameters by @rubo in #6205
- Upgrade ckzg which uses the final setup by @flcl42 in #6208
- Announce txs to newly connected peer only when we are synced by @marcindsobczak in #6202
- Use blob gas instead of count by @flcl42 in #6229
Gnosis
Bug fixes and stability
- Fix unable to decode auth message with invalid version by @asdacap in #6180
- Fix on handshake failure not disconnecting connection by @asdacap in #6179
- Fix tx index was removed during reorg by @asdacap in #6188
- Fix Antithesis NullPointerException in Evm by @Demuirgos in #6191
- Fix incorrect exitcode in SIGTERM and SIGINT. by @asdacap in #6215
- Fix max write buffer number is 0 on holesky. by @asdacap in #6216
- Handle concurrent WebSockets messages by @emlautarom1 in #6210
- Fix old blocks hang on insert failure by @asdacap in #6233
- Fix/nethermind not sending hello on disconnect by @asdacap in #6241
- Fix/gas estimations precompile error by @LukaszRozmej in #6259
Performance
- Perf/prefix block key with blocknum by @asdacap in #6158
- Perf/NoWAL during OldBodies by @asdacap in #6227
Logging
- Fix typos in logs and comments by @xiaolou86 in #6228
- BlockDownloader - client type in logs by @MarekM25 in #6240
Other changes
- Feature/more diagnostics bad blocks by @LukaszRozmej in #6207
- Blob test tool files moved by @ak88 in #6168
- rename keccak by @tanishqjasoria in #6197.
- Extract revert messages by @emlautarom1 in #6226
- Remove
Rinkeby
testnet by @emlautarom1 in #6273 - Select proper drive when using
VolumeFreeSpace
trigger by @emlautarom1 in #6269
New Contributors
- @ak88 made their first contribution in #6168
- @xiaolou86 made their first contribution in #6228
Full Changelog: 1.22.0...1.23.0