26.4.0
Repository Migration
- The Besu repository has moved from
hyperledger/besutobesu-eth/besu. GitHub automatically redirects all existing links from the old location.
Breaking Changes
- Clique consensus has been removed. Besu can no longer start or mine on pure Clique networks. Syncing networks that started as Clique and have since transitioned to PoS via
terminalTotalDifficulty(e.g. Linea Mainnet) are still supported. #9852 - Deprecated
--min-block-occupancy-ratiofor removal and make it noop. That option, that is ignored on PoS networks, is related to the deprecated PoW, and allowed to broadcast a mined block as soon as it reached a satisfying fill threshold. The option is still recognized, but it has no effect and will be completely removed in a future release. #10036 - Plugin API
- Removed
TransactionSelectionResult.BLOCK_OCCUPANCY_ABOVE_THRESHOLD, in general it could be replaced withBLOCK_FULL
- Removed
- Experimental Bonsai Archive column families have changed to improve performance during bonsai to archive migration. If you are using the Bonsai archive you will need to do a full resync #10058
debug_traceTransactionanddebug_traceBlockByNumber: theerrorfield inStructLogentries is now serialized as a plain string (e.g."INVALID_JUMP_DESTINATION") instead of an array of strings, aligning with the execution-apis opcode tracer spec. #10117debug_traceTransactionnow returns a JSON-RPC error response (-32000: Transaction not found) instead of a success response withnullresult when the transaction hash is unknown #10150debug_traceBlockByNumbernow returns a JSON-RPC error response (-32000: genesis is not traceable) instead of a success response withnullresult when tracing the genesis block #10133- Removed deprecated Holesky network.
--network holeskyis no longer a valid option. #10161
Upcoming Breaking Changes
- RPC changes to enhance compatibility with other ELs
- Block number parameter in RPCs will only support hex values. Support for non-hex (decimal) block number parameters is deprecated.
- This affects several RPCs, including
admin_logsRemoveCache,debug_getRawHeader,eth_call,eth_simulateV1,trace_calland more.
- Sunsetting features - for more context on the reasoning behind the deprecation of these features, including alternative options, read this blog post
- Proof of Work consensus (PoW)
--min-block-occupancy-ratiois deprecated and will be removed in a future release- Plugin API
PluginTransactionSelectorFactory.create(final SelectorsStateManager selectorsStateManager)is deprecated for removal
--Xmax-tracked-seen-txs-per-peerrenamed to--Xmax-tracked-seen-txs(old name kept as deprecated alias will be removed in a future release)- Besu will require Java JDK 25 to build and run in a future release.
Bug fixes
- Fix eth/69 snap sync receipt root mismatch by correctly identifying Frontier transaction type in SyncTransactionReceiptEncoder #9900
- Fix outstanding request counter leak in RequestManager that could cause peers to appear at capacity #9900
- BFT forks that change block period on time-based forks don't take effect 9681
- Fix QBFT
RLPExceptionwhen decoding proposals from pre-26.1.0 nodes that do not include theblockAccessListfield #9977 - Fix eth_simulateV1 discrepancy [9960] (#9960) eth_simulateV1 now accepts calls where both input and data
are provided with different values, using input as per the execution-apis spec instead of returning an error. - Fix eth_simulateV1 returning wrong error code when transaction gas exceeds block gas limit: now correctly returns -38015 (BLOCK_GAS_LIMIT_EXCEEDED) instead of -38014 or succeeding #10073
- Wait for peers before starting chain download. Prevents an OutOfMemory (OOM) error when the node has zero peers #9979
- Upgrade besu-native libraries version to 1.5.0. This fixes the issue of besu-native/secp256r1 exporting OpenSSL symbols in JVM space. besu-native #308
Additions and Improvements
- Add
transactionReceiptssubscription type toeth_subscribethat pushes all transaction receipts when a new block is added, with optionaltransactionHashesfilter to receive receipts for specific transactions only #10190 - Add
enableMemoryparameter todebug_traceTransactionanddebug_traceBlockByNumber. Defaults tofalse; memory is only included in trace output when explicitly enabled. The existingdisableMemoryparameter continues to work for backwards compatibility #10169 --net-restrictnow supports IPv6 CIDR notation (e.g.fd00::/64) in addition to IPv4, enabling subnet-based peer filtering in IPv6 and dual-stack deployments #10028- Stop EngineQosTimer as part of shutdown #9903
- Add
--max-blobs-per-transactionCLI option to configure the maximum number of blobs per transaction #9912 - Add
--max-blobs-per-blockCLI option to configure the maximum number of blobs per block when block building #9983 - Use JDK SHA-256 provider to leverage hardware SHA-NI instructions instead of BouncyCastle #9924
- Support EIP-7975: eth/70 - partial block receipt lists
- Support EIP-8159: eth/71 - block access list exchange
- Support EIP-8189: snap/2 - block access list exchange
- Limit pooled tx requests by size and remove pre-eth/68 transaction announcement support #9990
- Reduce tx p2p broadcast bandwidth and memory used #9937
- Improve syncing time of the experimental Bonsai Archive storage by migrating after a Bonsai full sync #9979
- Layered txpool: enable balance check by default #10175
Plugin API
- Plugin API: Allow the registration of multiple PluginTransactionPoolValidatorFactory #9964
- Plugin API: pass pending block header when creating selectors #10034
RPCs
- Add
blockTimestampto transaction RPC results #9887 - Add
txpool_statusRPC method #10002 - Add
txpool_contentFromJSON-RPC method #10111 - Add
txpool_contentJSON-RPC method #10120 - Add
txpool_inspectJSON-RPC method #10121 - Add
maxUsedGasfield to eth_simulateV1 results #10066 - Add
latestBlockfield to admin_peers result #10163
Performance
- UInt256 arithmetics with long limbs #9677
- Fix edge case in MOD variant operations regarding multiply subtract step #9934
- Fix addMod case with 256bit moduluses #10001
- Performance improvements on MOD variant instructions while converting from byte[] to longs #9976
- Implement DIV and SDIV with long limbs #9923
- Improve MULMOD worst cases #10088
- Optimized MUL and SUB to use UInt256 #10030
- Use cache locality to improve Shift opcodes #9878
- Defer Snappy decompression of inbound P2P messages from the Netty I/O thread to the worker thread, reducing memory held in the transaction worker queue to compressed size #10048
- Dispatch snap server request processing (GET_ACCOUNT_RANGE, GET_STORAGE_RANGE, GET_BYTECODES, GET_TRIE_NODES, GET_BLOCK_ACCESS_LISTS) off the Netty event loop to prevent heavy trie/DB work from blocking ETH protocol message handling #10083
- Add
-Pcasescase name filtering to JMH benchmark suite #9982
Discovery V5
- Add IPv6 dual-stack support for DiscV5 peer discovery (enabled via
--Xv5-discovery-enabled): new--p2p-host-ipv6,--p2p-interface-ipv6, and--p2p-port-ipv6CLI options enable a second UDP discovery socket;--p2p-ipv6-outbound-enabledcontrols whether IPv6 is preferred for outbound connections when a peer advertises both address families #9763; RLPx now also binds a second TCP socket on the IPv6 interface so IPv6-only peers can establish connections #9873 - Add DiscV5 discovery metrics (
discv5_live_nodes_current,discv5_total_nodes_current) to track node counts in the routing table #9692 - Make DiscV5 discovery parameters externally configurable:
--Xv5-discovery-interval-seconds(default: 1),--Xv5-discovery-timeout-seconds(default: 30), and--Xv5-minimum-peer-ratio(default: 0.8) allow tuning of the peer discovery cadence, per-round timeout, and peer saturation threshold without code changes #10127