Upcoming Breaking Changes
--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)- BFT option
xemptyblockperiodsecondshas been taken out of experimental and been renamedemptyblockperiodseconds. The old config option is deprecated and will be removed in a future release. --Xbft-legacy-protocol-encodingwill be removed once Besu 25.x is no longer supported. #10499--Xsnapsync-synchronizer-pivot-block-distance-before-cachingis deprecated and will be removed in a future release; the flag is now a silent no-op.--snapsync-synchronizer-pre-checkpoint-headers-only-enabledis deprecated and will be removed in a future release; the flag is now a silent no-op.--rpc-tx-feecapwill treat a value of 0 as limiting fees to 0. Today it treats 0 as "do not cap fees". To achieve similar behaviour set it to a suitably large value to effectively prevent any fee capping.
Breaking Changes
- The experimental
--Xv5-discovery-enabledflag is removed; discovery now defaults to--discovery-mode=V4. Use--discovery-mode=BOTHor--discovery-mode=V5to enable DiscV5.- NOTE: KNOWN ISSUE with --discovery-mode=BOTH (increased CPU) - this will be patched in the NEXT release #11027
- The genesis file
v5Bootnodeskey is removed; ENR bootnodes must now be listed in the unifiedbootnodesarray alongside enode URLs. Besu's bundled network genesis files were migrated automatically - this only affects custom/downstream genesis files that still use the oldv5Bootnodeskey, whose ENR entries will otherwise be silently dropped. - Removed the legacy
PANTHEON_environment variable prefix for configuration options, everyone should already use theBESU_prefix at this time.
Additions and Improvements
- Add
--checkpoint=<hash>:<number>:<totalDifficulty>CLI option to anchor sync to a trusted checkpoint, overriding any checkpoint configured in the genesis file. The option is only used by snap sync and is ignored (with a warning) in FULL sync-mode. - Add server-side cap on EVM steps captured per debug_trace*/trace_call request
- Extract the Plugin API core module: the plugin lifecycle, service lookup and shared block/transaction data views now live in a new
besu-plugin-api-coreartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. Also adds a minimalorg.hyperledger.besu.plugin.CoreConfigurationservice exposing the node data path. #10875 - Extract the Plugin API metrics module. The metrics contracts (
MetricsSystem, metric categories and instruments) now live in a newbesu-plugin-api-metricsartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #10903 - Extract the Plugin API permissioning module. The permissioning contracts (
PermissioningServiceand the node connection, node message and transaction permissioning providers) now live in a newbesu-plugin-api-permissioningartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #10919 - Extract the Plugin API security module. The security module contracts (
SecurityModuleService, theSecurityModulesigner SPI, itsPublicKeyandSignaturedata interfaces andSecurityModuleException) now live in a newbesu-plugin-api-securityartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #10941 - Add
--logging-formatCLI option to select structured JSON console logging (ECS,GCP,LOGSTASH,GELF) in addition to the defaultPLAINpattern output, without requiring a customLOG4J_CONFIGURATION_FILE. Each format is a bundled Log4j2 configuration file selected at startup. #9626 - Add a japicmp compatibility check (
:plugin-api:checkAPICompatibility) that fails the build if the Plugin API changes in any way that is not a pure addition against the last released version #10823 - Remove the Plugin API source-hash check (
:plugin-api:checkAPIChanges), which fired on any source edit without saying anything about actual compatibility. The japicmp check is now the compatibility gate for the Plugin API #10879 - Remove the unused
ethereum:verkletriemodule and theipa-multipointnative dependency it pulled in. Verkle trie support had already been fully removed from the storage/worldstate layers in earlier work; this removes the last remaining vestige (standalone Bandersnatch curve arithmetic with no callers). - Apply
rpc-max-logs-rangetoeth_getFilterLogsandeth_newFilter - Improve logging for malformed discv4 UDP packets
- DiscV4 now supports IPv6 dual-stack RLPx: a node running
--discovery-mode=V4with--p2p-interface-ipv6/--p2p-host-ipv6set now binds a second IPv6 RLPx TCP socket and advertises IPv6 ENR/enode fields, instead of those options being ignored with a warning. #10800 - Dual-stack discovery and RLPx now support binding the same port number for both
--p2p-portand--p2p-port-ipv6, using a single dual-stack socket instead of two independent per-family sockets - simplifying firewall rules for operators. Previously this configuration could fail to start with a port-conflict error. #10800 - Add discovery/RLPx observability metrics for the shared DiscV4/DiscV5 transport and outbound RLPx connections - see the PR description for the full list of new metrics. #10837
- Add
--p2p-tx-feecapCLI option, the P2P equivalent of--rpc-tx-feecap, capping the maximum transaction fees (in Wei) accepted for transactions received from peers. The default is no cap, leaving existing behaviour unchanged. #10819
Bug fixes
- Bound the DiscV4 inbound packet pipeline to 256 in-flight packets, dropping excess datagrams at ingress instead of queueing without limit, preventing discovery-port flood from exhausting memory. Drops are counted by
discovery_packets_dropped_total. - Cap the number of snap/1-2
GET_*requests concurrently scheduled for processing on a snap-serving node, both per-peer (--Xsnapsync-server-max-concurrent-requests-per-peer, default 8) and globally (--Xsnapsync-server-max-concurrent-requests, default 200, 0 for no limit), closing an unbounded native-thread fan-out path where a flood of inbound snap requests could exhaust theEthSchedulerservices pool. The global default is sized as--max-peers(default 25) times the per-peer default, so legitimate traffic from a fully-peered node is never globally throttled. Requests rejected by either cap get an empty response instead of being silently dropped, so the requesting peer doesn't time out waiting for a reply. - EIP-1459 DNS discovery now rejoins TXT records split across multiple
<character-string>s. Records longer than 255 bytes were truncated, so Besu silently discarded most of every tree, resolving 832 of 3000 nodes from the mainnet tree. #10985 - Queue backward-sync targets received before peer readiness and retry when a peer connects. #10843
- Return
BLOCK_NOT_FOUNDfor unknown block hashes andGENESIS_BLOCK_NOT_TRACEABLEfor genesis blocks fromdebug_traceBlockByHash. #10701 - Added a configurable range cap (
--graphql-max-blocks-range, default 5000) for GraphQL queries. - Bonsai world state rolling failures are now logged at
WARNinstead ofINFO, and a missing block header or trie log during a roll reports which block hash or trie log was missing. #10859 - Log malformed peer messages at DEBUG instead of ERROR in
ApiHandler, since they indicate peer misbehavior rather than a Besu fault. #10858 - Fix a deadlock where
FullSyncTargetManager's (and checkpoint sync's) retry loop could hang forever waiting for a new peer to connect, even though the already-connected peer just needed its outstanding-request budget to free back up. The same fix was applied to snap/fast sync's pivot block selection. #10864 - Peers disconnected for permanent incompatibilities (mismatched network ID, mismatched genesis hash, null/unexpected node ID, or self-connection) are now added to the denylist and will not be reconnected. Previously only
BREACH_OF_PROTOCOLandINCOMPATIBLE_P2P_PROTOCOL_VERSIONtriggered denylisting. #10827 - Fix
prestateTracer(includingdiffMode) failing with an internal error ondebug_traceTransaction, caused by the pre-transaction parent world state updater being unavailable on the single-transaction trace path. #10798 - Raise the default DiscV5 discovery round timeout (
--Xv5-discovery-timeout-seconds) from 30 to 60 seconds to avoid spurious round failures on networks with many unreachable candidates #10800 - Fix QBFT/IBFT mining continuing to seal blocks after the merge terminal total difficulty (TTD) is reached #10733
- Fix the IBFT2 mining coordinator restarting alongside QBFT after a node restart on IBFT2->QBFT migration networks, which produced competing blocks and endless
Failed to import blockerrors. Sync events no longer start the IBFT2 coordinator directly; lifecycle control stays with the migrating coordinator. #10680 - Fix
ibft_*andqbft_*JSON-RPC methods returningMethod not enabledon IBFT2->QBFT migration networks (genesis containing bothibft2andqbftsections). #10679 - Fix
admin_nodeInforeporting wrong RLPx/discovery ephemeral ports under--nat-method=DOCKER, due to a swapped NAT port mapping and a stale pre-bind snapshot. #10860 - Recover from restart during flatDB heal sync step #10883
- Cap pre-STATUS RLPx connections and close them on eviction.
- Fix txpool incorrectly evicting authority pending transactions when EIP-7702 delegation tuples are skipped during block execution
- Reject RLP-wrapped typed transactions during block-body decoding, so a block built from the wrapped encoding cannot hash identically to one built from the canonical encoding.
d19de7996560d522016927dbe232cbc68ab479f1ab064eecec2ee363c86a7c10 besu-26.8.0.zip
4f80f17b129ac970135263f3aa8a5c290366aec50c50bbcdadda0af127dd5540 besu-26.8.0.tar.gz