Release notes
This release brings over 341 improvements across 2012 files, ranging from performance enhancements, protocol upgrades, and node-runner improvements.
Nethermind UI (initial release)

This version introduces the first iteration of the Nethermind UI (#9090), providing an integrated interface to interact with and monitor your node. This marks the beginning of a more user-friendly experience for running Nethermind.
The UI is enabled when UI health checks UI is enabled: --healthchecks-enabled --healthchecks-uienabled
If you wish to expose only the UI and not RPC externally, then you can do this using capabilities on HTTP endpoints with the JsonRpc.AdditionalRpcUrls
parameter.
For example, if your consensus client is running locally (running in the same instance) and your external IP is 10.4.0.4, then you can expose only the UI using just the http|health
capabilities on the external IP binding and want it enabled at HTTP port 80, then binding the other capabilities needed by the consensus client to localhost:
--jsonrpc-additionalrpcurls "[http://10.4.0.4:80|http|health,http://localhost:8551|http;ws|net;eth;subscribe;engine;web3;client]"
This ensures you don't additionally enable your node as a public RPC endpoint while also enabling the UI.
Historical data live pruning
We’ve added automatic history pruning capabilities (#8040), giving operators the ability to keep disk usage under control by pruning historical chain data as the node runs. This feature is disabled by default but can be enabled via configuration. It is an experimental feature, not yet recommended for use on production nodes.
History pruning can be enabled by passing the flag History.Pruning=UseAncientBarriers
. This will automatically prune any blocks older than the ancient barriers cutoff.
Alternatively, pruning can be enabled in rolling window mode with the flag History.Pruning=Rolling
. This will prune any blocks older than 82125 epochs, which is around 1 year on the Ethereum Mainnet. The specific number of epochs can be configured with the flag `--history-retentionepochs ' -- the number of epochs must be a minimum of 82125.
History pruning can be disabled with the flag --history-pruning disabled
-- currently this is the default behaviour, but this may change in the future.
Peering improvements for OP Stack
Several improvements were made to Optimism and OP Stack, including:
- better handling of finalized/safe blocks #8658
- a dedicated
optimism
RPC namespace #8667 - refined peer management to improve stability and sync performance #8684, #8960
Performance improvements
A wide range of EVM and networking optimizations were introduced, including:
- Reduced allocations in opcode execution #8687, #8740 and transaction sender recovery #8781, #8824.
- Warmup and precomputation improvements for EVM instructions #8699, #8836.
- Faster logging and RPC handling #8879, #8976.
- RocksDB upgrades and optimizations #8640, #9059.
These changes collectively reduce CPU and memory usage while improving throughput and responsiveness.
Other improvements
Additionally, this release includes important fixes and feature updates:
- EIP implementations:
- EIP-7823: Gas accounting #8649
- EIP-7825: Transaction gas limit cap #8663
- EIP-7883: ModExp changes #8489, #8964
- EIP-7907: Contract code size metering #8845
- EIP-7910:
eth_config
#8956 - EIP-7918: Blob base fee updates (#8656, #8935
- EIP-7934: Execution block size limit #8815
- EIP-7939: CLZ instruction #8759
- EIP-7951: RIP-7212 renamed & enabled in Osaka #8753
- Consensus layer & OP-CL: Split finalized/safe blocks #8658, new RPC methods for Taiko and OP #8874, and refined health checks #8755.
- Discovery & peering: Faster removal of inactive peers #9037, improved gossip prioritization for peers on the same fork #9043, and fixes for discv4/discv5 edge cases #9046, #9113.
- Testing & tooling: Revamped Hive/Assertoor test integrations #8711, #8862, new worldstate benchmarks #9051, and initial support for HTML and Grafana reporting #9074, #8960.
What's Changed
- Fix infinite loop in tx pool by @asdacap in #8632
- Fix filter timeouts, set to 15m by @LukaszRozmej in #8633
- Update System.CommandLine package by @rubo in #8639
- Remove SkipLocalsInit to avoid garbage in first bytes of hash by @wurdum in #8634
- add surge hoodi chainspec by @smartprogrammer93 in #8643
- Fix for
Block.AccountChanges
not being disposed in some cases by @alexb5dh in #8647 - taiko alethia pacaya fork activation by @smartprogrammer93 in #8642
- Revert wrong code on missing receipt by @LukaszRozmej in #8653
- Set default
LegacyTransactionForRpc
gas price to zero by @Hyodar in #8630 - Fix #8648 - eth_getTransactionByBlockNumberAndIndex out of bounds by @LukaszRozmej in #8654
- Update RocksDB package by @rubo in #8640
- Kute: order by filename by @benaadams in #8657
- PatriciaTree ignoreMissingDelete is not used by @MarekM25 in #8646
- Implement Eip7823 by @benaadams in #8649
- Sync OP chains after Isthmus by @emlautarom1 in #8638
- Use RocksDB PinnableSlice when available by @benaadams in #8661
- Optimize RlpStream.Encode(ulong) by @benaadams in #8660
- Slight discovery refactor. by @asdacap in #8664
- Mild performance tweaks by @benaadams in #8674
- Remove TD based peer allocation strategy by @asdacap in #8670
- Improve WebSocketMessageStream by @benaadams in #8676
- Optimism CL: Split finalized/safe blocks by @deffrian in #8658
- Fix ClockCache.Set by @benaadams in #8679
- Implement EIP-7825: Transaction Gas Limit Cap by @Marchhill in #8663
- Implement OP CL
optimism
RPC namespace by @emlautarom1 in #8667 - Hide OP-CL specific options by @emlautarom1 in #8684
- Reduce
Forward header starting block number did not changed.
exception to log. by @asdacap in #8683 - Refactor/Reduce
AuraNethermindApi
usage. by @asdacap in #8686 - Optimize 12 x 20byte & 32byte OpCodes by @benaadams in #8687
- Perform stack writes as single 32 byte vector by @benaadams in #8691
- Reintroduce Jit time branch elimination by @benaadams in #8692
- Fixes one discv5 test by @ak88 in #8635
- Migrate to Microsoft.Testing.Platform by @rubo in #8190
- Fix/aura hive startup by @asdacap in #8694
- EIP-7594: PeerDAS by @marcindsobczak in #8417
- Refactor build scripts by @rubo in #8601
- Refactor/make all blockprocessor arg required by @asdacap in #8688
- Warm up evm instructions by @benaadams in #8699
- Add BPOs by @flcl42 in #8631
- Update TxParser by @LukaszRozmej in #8698
- eip-7883 implementation by @yerke26 in #8489
- Add logo on startup by @benaadams in #8701
- Refactor/deduplicate ReadOnlyTxProcessingEnvFactory by @asdacap in #8697
- Restore and fix tests by @rubo in #8696
- Return
null
instead of errors in RPCget
methods by @emlautarom1 in #8702 - Cleanup/move some aura components to di by @asdacap in #8704
- Optimize: Number, GasLimit, Coinbase, PrevRandao opcodes by @LukaszRozmej in #8700
- EIP-7918: Blob base fee bounded by execution cost by @Marchhill in #8656
- TxParser: Add signature validation, keep errors in 1 line by @LukaszRozmej in #8706
- Refactor tests configuration and work around Rider issue by @rubo in #8703
- Some fixes for clef integration in RPC by @ak88 in #8626
- Fix Nethermind.Test.Runner Dockerfile by @rubo in #8708
- GetStorageRange fix for no storage slots found by @damian-orzechowski in #8538
- Fix Assertoor workflow by @rubo in #8711
- Optimize debugging container by @rubo in #8710
- Update known_chain_sizes test by @benaadams in #8714
- Use less allocating .ToValueHash than .ToBigEndian by @benaadams in #8713
- TxParser add chain id validation by @LukaszRozmej in #8709
- Fix/disconnect without sending reason by @asdacap in #8712
- Optimize JournalSet by @benaadams in #8716
- Fix exception on exit for incomplete nethermind startup. by @asdacap in #8717
- Remove Nethermind.Tools.GasHistorian by @rubo in #8720
- Remove obsolete scripts by @rubo in #8721
- Feature/snapsync storage log by @asdacap in #8675
- Refactor/Consolidate ISealEngine. by @asdacap in #8705
- Surface acceptTx on sync via config by @benaadams in #8728
- Improve JumpDest analysis by @benaadams in #8725
- Cleanur/remove create heath hint service by @asdacap in #8727
- Fix tx blob deserialization after PeerDAS by @alexb5dh in #8729
- Move unit tests to use IWorldState instead of ITrieStore by @asdacap in #8724
- Support for eth/69 by @alexb5dh in #7052
- Fix runner test by @asdacap in #8731
- Increase Ethereum mainet gaslimit default to 60M by @benaadams in #8671
- Refactor/use block producer env factory by @asdacap in #8730
- Feature/Step dependents by @asdacap in #8734
- ExecutionEnvironment pass Uint256 as in by @LukaszRozmej in #8736
- Refactor/remove additional tx source param by @asdacap in #8735
- Adjust block size to CL pessimistic block size by @MarekM25 in #8737
- Fix secp256r1 precompile test cases by @alexb5dh in #8738
- Improve performance of CALL opcodes by @benaadams in #8732
- Add min memory rent size by @benaadams in #8740
- Make
StateProvider
hot code in the common path by @benaadams in #8744 - chore(evm): fix 7918 blob gas calculator by @spencer-tb in #8743
- Add boundary tests for EIP-7918 by @Marchhill in #8748
- Update EIP-7883: Assume minimal base/mod length of 32 by @MarekM25 in #8749
- Fix/CL health checks by @deffrian in #8755
- Activate devnet-1 in Osaka by @flcl42 in #8733
- SpanSource for TrieNode rlp by @Scooletz in #8719
- Add max blobs per tx limit taken from blob schedule by @flcl42 in #8754
- EIP-7939 CLZ by @LukaszRozmej in #8759
- Dispose EvmState on warmup by @benaadams in #8771
- Include debug symbols in distribution packages by @benaadams in #8773
- optimize some precompiles by @LukaszRozmej in #8770
- Remove txPool contention from block validation by @benaadams in #8779
- Recover signer direct from keccak without intermediary array by @benaadams in #8781
- Refactor/taiko extended eth module by @asdacap in #8769
- Cleanup/make transaction executor always take adapter by @asdacap in #8750
- Fix/era import by @asdacap in #8774
- Increase setup timeout by @emlautarom1 in #8790
- Change Ethereum mainet gaslimit default to 45M by @benaadams in #8793
- Base prewarming on logical cores by @benaadams in #8796
- Add tx payload form bytes only by @flcl42 in #8777
- PatriciaTree remove unused field by @benaadams in #8800
- Perf/allow archive node to use prune cache by @asdacap in #8655
- Fix validation when protocols are added concurrently by @alexb5dh in #8798
- Ignore
Celo
in Superchain Registry by @emlautarom1 in #8804 - Skip recovery queue when no blocks queued by @benaadams in #8801
- Fix adaptive code resolver by @marcindsobczak in #8797
- Refactor/Deduplicate Proof, Trace, Debug, BlockchainBridge RPC by @asdacap in #8741
- Add flag for persistent broadcast by @marcindsobczak in #8752
- Lighter Memory.Save by @benaadams in #8808
- Fix aura wrong reward components by @asdacap in #8805
- Use GetOrAdd for DirtyNodeCache by @benaadams in #8812
- Update packages by @rubo in #8811
- Cleanup/Deduplicate aura block processor. by @asdacap in #8814
- Rename RIP-7212 to EIP-7951 & enable in Osaka by @Marchhill in #8753
- Drop pre-merge history for Ethereum Mainnet by @MarekM25 in #8764
- Single line [DoesNotReturn, StackTraceHidden] by @benaadams in #8821
- Allocate 96 bytes less per tx sender recovery by @benaadams in #8824
- Faster generic logger lookup by @benaadams in #8822
- TransactionSubstate to readonly ref struct by @benaadams in #8825
- Only notify about main BlockchainProcessor shutdown by @benaadams in #8819
- Adjusted CL Block size - EIP 7934 by @MarekM25 in #8807
- Remove AncientReceiptsBarrier and AncientBodiesBarrier from sepolia_archive.json by @Copilot in #8834
- Warmump evm by @benaadams in #8836
- Update Sepolia AncientBarriers to 1450409 per EIP-3675 for pre-merge PoW history expiry by @Copilot in #8835
- Implement Eip7907: Meter Contract Code Size And Increase Limit by @benaadams in #8845
- Split SSTORE to two Opcodes by @benaadams in #8853
- Fix yparity issue in RPC setcode tx by @ak88 in #8809
- Refactor/Move the rest of built in rpc modules to DI by @asdacap in #8844
- Feature/lazy rpc module factory by @asdacap in #8846
- Fix ParityStyleTracerTests in debug mode by @asdacap in #8857
- Remove INethermindPlugin.GetSteps by @asdacap in #8858
- Don't broadcast txs while processing a block by @benaadams in #8820
- Add Surge Custom Pricing RPC by @dipkakwani in #8662
- Only create Spec once per block by @benaadams in #8855
- Set default pruning boundary to 128 by @benaadams in #8863
- Optimize opcodes by @benaadams in #8864
- Refactor/Slight reduction in duplicated block producer code by @asdacap in #8865
- Validate parenthash is same as given parent by @asdacap in #8840
- Configure Volta Zurich hard fork by @rubo in #8851
- Replace Nethermind.Gmp with Nethermind.GmpBindings by @rubo in #8799
- Add BuilderNet to highlighted log brands by @benaadams in #8870
- Json serializing doubles - decimal part optional for round numbers by @LukaszRozmej in #8873
- Optimise OpOrigin by @benaadams in #8867
- Optimize JwtAuthentication.Authenticate by @benaadams in #8875
- Reduce log noise: Move high volume logs from Debug to Trace by @benaadams in #8789
- Add taikoAuth_setHeadL1Origin, taikoAuth_updateL1Origin, BuildPayloadArgsId by @flcl42 in #8874
- Update Nethermind.GmpBindings package by @rubo in #8876
- Refactor/deduplicate block producer env by @asdacap in #8871
- Reduce use of InitializeNetworkProtocol and review step dependencies by @asdacap in #8859
- Trim JsonRpc Webhost for lower latency by @benaadams in #8879
- Fix CPU compatibility issues by @rubo in #8882
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #8881
- Log chainId disconnect as trace by @benaadams in #8877
- Test/Call block producer directly in test by @asdacap in #8885
- Further isolate overridable env by @asdacap in #8806
- Optimize BlockForRpc for eth_getBlockByNumber by @benaadams in #8883
- Add Surge Hoodi Config in Runner by @dipkakwani in #8890
- Update Volta bootnode by @rubo in #8888
- Fix Surge Hoodi Genesis Hash in Config by @dipkakwani in #8892
- Fix forkids by @flcl42 in #8895
- Refactor/Move PayloadPreparationService to DI by @asdacap in #8884
- Feature/Flashbots auto RPC by @asdacap in #8893
- Taiko Add Preconf Check by @dipkakwani in #8886
- Update spaceneth to mainnet spec by @LukaszRozmej in #8901
- Unwrap invalid configuation exception by @asdacap in #8898
- Update SurgeGasPriceOracle (Issues from Devnet) by @dipkakwani in #8903
- Just removes the timeout in tests when debugging an rpc call by @ak88 in #8904
- Update single node directly rather than creating array by @benaadams in #8907
- Drop async where just pass through and return Task directly by @benaadams in #8906
- set nonce to current, ignoring all nonce check on CallAndRestore by @ak88 in #8897
- Fix/unencodable header by @asdacap in #8899
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #8880
- Ensure produced block have expected transaction in test by @asdacap in #8913
- Implement EIP-7934: RLP Execution Block Size Limit #8757 by @Marchhill in #8815
- Remove "constructor" in chiado chainspec by @ak88 in #8916
- Fix a few Hive tests of
eth_simulatev1
by @rubo in #8862 - Remove State from Evm dependencies by @deffrian in #8866
- Shareable tx processing source by @asdacap in #8920
- Reintroduce ThreadBoost for main Processing thread by @benaadams in #8926
- Remove lock in PersistentStorageProvider by @benaadams in #8927
- Ensure exception in block downloader is caught by @asdacap in #8931
- EIP-7918 Blob Base cost constant change by @Marchhill in #8935
- Cleanup/reduce use of specific simulate pattern by @asdacap in #8921
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #8945
- Refactor/deduplicate engine rpc by @asdacap in #8919
- Feature/Address state by block header by @asdacap in #8911
- Feature/convert simulate to di by @asdacap in #8923
- Use reference equals in clock cache by @benaadams in #8947
- Only return peers in admin_peers that match the network id by @skylenet in #8915
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #8944
- Reprice EIP-7951 by @Marchhill in #8938
- Make simulate env lazy by @asdacap in #8957
- Renable targeted GC cleanup by @benaadams in #8961
- Add Seq and Grafana to sync supported chains by @kamilchodola in #8960
- Improve Surge Pricing Oracle by @dipkakwani in #8924
- Move all unnecessary tracers to Blockchain by @deffrian in #8925
- Fix/Aura hive test by @asdacap in #8932
- Improve package publishing workflow by @rubo in #8869
- Run background tasks at BelowNormal priority by @benaadams in #8968
- Update CLZ gas cost for devnet3 by @benaadams in #8953
- Update tx gas cap for devnet3 by @benaadams in #8954
- Don't block background tasks when syncing by @benaadams in #8971
- Rename blob metrics by @flcl42 in #8972
- Fix Taiko Engine Api by @asdacap in #8974
- Better null-ckecks in TryGetCanonicalTransaction by @LukaszRozmej in #8969
- Revise JSON-RPC docs generation by @rubo in #8967
- Fix/OOM when downloading from genesis. by @asdacap in #8975
- Cache PropertyInfo lookups for JsonRpc by @benaadams in #8976
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #8978
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #8979
- Remove use of Linq.Sum from hot paths by @benaadams in #8977
- Isolate Tracer in Proof Module and remove IVisitingWorldState by @asdacap in #8981
- More hot code in ConnectNodes by @benaadams in #8982
- Only access "warmup" hashtable once per warmup by @benaadams in #8983
- EIP-7594: Constant maxBlobsPerTx by @flcl42 in #8940
- Fail fast on Db corruption by @benaadams in #8986
- Configure EWC Zurich hard fork by @rubo in #8985
- feat: Add RegexOptions.Compiled flag to NewPayloadJsonRpcValidator by @reallesee in #8984
- Improve locking when looking up RlpDecoders by @benaadams in #8987
- Fix naming of data cost in ExecutePrecompile by @marcindsobczak in #8994
- Move precompiles by @deffrian in #8962
- Add EIP-7910: Add eth_config by @flcl42 in #8956
- Replace
eth_pairings
withmcl
by @rubo in #8992 - Unify BN254 naming by @rubo in #9004
- Refactor/Move init DB to DI by @asdacap in #8997
- Fix BN254 point deserialization by @rubo in #9009
- Optimize ModExp by @benaadams in #9008
- Remove last orphan readonly tx processing scope. by @asdacap in #9005
- Update winget command by @rubo in #9011
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #9013
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #9014
- Tidy up ecdsa overloads by @benaadams in #9015
- Cleanup/Remove unnecessary SetBaseBlock by @asdacap in #9006
- Update chain sizes test by @benaadams in #9016
- Fix surge average gas usage estimation by @smartprogrammer93 in #8998
- Make Ethereum.Blockchain test logs more readable by @benaadams in #9018
- Increase the machine size for op-mainnet by @kamilchodola in #9017
- Fix error on exit by @asdacap in #9019
- Update
ModExp
precompile to the newest version of EIP-7883 (triple pricing) by @marcindsobczak in #8964 - Fix devnet 3 by @flcl42 in #9022
- Revise BN254 precompile names by @rubo in #9023
- Ignore and decline gas intensive transactions when eip-7825 is activated by @flcl42 in #8747
- Rollback discv5 update by @flcl42 in #9026
- Test/Disambiguate TxPool Constructor by @asdacap in #9027
- Feature/adjust rocksdb config by memory by @asdacap in #9000
- Remove Linq from Block Processing by @benaadams in #9025
- NewPayloadTimeout in miliseconds by @MarekM25 in #8929
- Fix/Orphaned block error on freshly restarted node by @asdacap in #9034
- Refactor/Move aura block processor to DI. by @asdacap in #8950
- Refactor/Move block processor in test to DI. by @asdacap in #8959
- Exit on invalid block flag by @asdacap in #9036
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #9038
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #9039
- Fix/unable to download all receipts by @asdacap in #9040
- Cycle out bad peers faster by @benaadams in #9037
- Include peer count in both peer reports by @benaadams in #9042
- Prefer gossiping nodes as neighbours if on same fork by @benaadams in #9043
- Add test suite and Dockefile for Kute by @emlautarom1 in #9024
- Separate branch and block processor by @asdacap in #8980
- Harden background queue by @benaadams in #9049
- Hardening/Separate buffer allocator by @asdacap in #9044
- Purge KnownChainSizes Test by @benaadams in #9050
- Revert "Set default pruning boundary to 128 (#8863)" by @benaadams in #9052
- Fix Discv4 / ENR response / request-hash by @flcl42 in #9046
- Vectorize Node distance by @benaadams in #9054
- Add support for Prometheus by @emlautarom1 in #9048
- fix fullPrunning referencing wrong dbFolder by @Demuirgos in #9060
- fix: Replace mutable TxReceipt.SkipStateAndStatusInRlp with constructor-based approach by @richardgreg in #9057
- Fix/some simulate call by @asdacap in #8989
- Throw less exceptions during peer connection by @benaadams in #9068
- Feature/worldstate benchmark by @asdacap in #9051
- Add HTML report format by @emlautarom1 in #9074
- Use proper block params by @emlautarom1 in #9076
- Auto-update fast sync settings by @core-repository-dispatch-app[bot] in #9079
- Update OP Superchain chains by @core-repository-dispatch-app[bot] in #9080
- Optimize EthereumIesEngine by @benaadams in #9081
- Optimize Peer Range Broadcast by @benaadams in #9083
- Optimize unused logging from Diagnostics, Activity and Metrics by @benaadams in #9082
- Apply RlpxHost options in correct place by @benaadams in #9085
- Fix/TrieException due to persisted parent but not child. by @asdacap in #9086
- Fix independent build of the solutions by @flcl42 in #9073
- Fix Hive tests default parameters by @rubo in #9087
- L1SLOAD Precompile for Surge by @dipkakwani in #9030
- Fix eth_config by @flcl42 in #9071
- Check block limit too by @flcl42 in #9072
- Drop pre-merge data on Gnosis by @Marchhill in #9093
- fix(sync): validate account and slot order and boundaries in SnapProviderHelper by @Pricstas in #8551
- Update RocksDB to v10 by @rubo in #9059
- Fix Taiko Anchor Transaction Validation by @dipkakwani in #9092
- Remove use of blockchain processor in RPC by @asdacap in #9021
- Nethermind UI (initial) by @benaadams in #9090
- Fix crash on after db dispose and concurrent full pruning start by @asdacap in #9111
- Use lighter GetBlockNumber for OnForkChoiceUpdated by @benaadams in #9112
- Report processing log for reorg'd blocks by @benaadams in #9116
- Automatic history pruning by @Marchhill in #8040
- Add space for easier node parsing by @benaadams in #9117
- Add opcode count per block in logs by @benaadams in #9118
- Fix history pruner logs by @Marchhill in #9119
- Fix for RISC-V by @benaadams in #9121
- Disable history pruner by default by @Marchhill in #9125
- Update packages by @rubo in #9062
- Add OutputCache to metrics endpoint by @benaadams in #9139
- Fix discv5 by @flcl42 in #9113
- Perf/Non blocking memory pruning by @asdacap in #9096
New Contributors
- @spencer-tb made their first contribution in #8743
- @dipkakwani made their first contribution in #8662
- @reallesee made their first contribution in #8984
- @Pricstas made their first contribution in #8551
Full Changelog: 1.32.4...1.33.0