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 estimating gas and make it configurable with
--JsonRpc.EstimateErrorMargin
by @ak88 in #6836 - Support PPA package on Ubuntu 24.04 by @rubo in #6956
- Cleanup/remove deprecated metrics by @asdacap in #6950
- Add diff mode for prestate tracer by @natebeauregard in #6959
- Add mgaspersec to metrics reported to grafana by @benaadams in #6963
- Logs: Line wrap peers summary by @benaadams in #6941
- remove transition timestamp and use spec instead by @tanishqjasoria in #6993
- Update chiado bootnodes by @kamilchodola in #7004
- Refactor/separate block production and running by @asdacap in #7012
- Remove/les protocol and canonical hash tree by @LukaszRozmej in #7022
- Fix NPE on aura plugin by @asdacap in #7031
- Feature/log halfpath conversion by @asdacap in #7051
- Migrate Docker images to Ubuntu 24.04 by @rubo in #7076
- Fix block metrics + reduce metric contention by @benaadams in #7094
- Highlight gigagas in logs by @benaadams in #7121
- Use string for additional rocksdb config by @asdacap in #7116
- Replace Bouncy Castle package by @rubo in #7124
New Contributors
- @FatTigerWang made their first contribution in #6915
- @kayano made their first contribution in #6991
- @pxyxyrus made their first contribution in #6889
Full Changelog: 1.26.0...1.27.0