Upcoming Breaking Changes
- Plugin API
PluginTransactionSelectorFactory.create(final SelectorsStateManager selectorsStateManager)is deprecated for removalPoaQueryServiceandBftQueryServiceare deprecated and will be removed in a future release, with no replacement. They have no known usageMiningServiceis deprecated for removal and will be removed in a future release, with no replacement. It has no known usagePluginVersionsProvider,plugin.data.Request,plugin.data.Restriction,plugin.data.UnsignedPrivateMarkerTransactionandplugin.data.Signatureare deprecated for removal, with no replacement. None is reachable through any plugin service or data contract: the three privacy types were orphaned when private transaction support was removed,Requestis implemented internally but never exposed, andPluginVersionsProvideris internal--versionplumbing
--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
- JSON-RPC
eth_newFilterandeth_subscribe(logs) now cap the number of addresses per filter at 1000 by default. Requests exceeding the limit are rejected with a-32005error. Configure via--rpc-max-log-filter-addresses(set to0for no limit). --network=devis no longer supported; useephemeryor Kurtosis for local devnets. #10836- Plugin API:
HealthCheckProvidernow returnsHealthCheckResult(status + details map) instead ofboolean#10687 - The experimental
--Xmax-tracked-seen-txs-per-peeralias is removed (deprecated since 26.4.0). Use--Xmax-tracked-seen-txsinstead. #11018 - Plugin API
StateRootCommitterAPI redesign: removed theSYNCHRONOUSfield andcomputeRoot(...)method;compute(MutableWorldState, BlockHeader, WorldUpdater)is now the abstract method for state root computation. #10804MutableWorldState.persist(BlockHeader)is now abstract; implementations must provide it (previously it defaulted topersist(blockHeader, StateRootCommitter.SYNCHRONOUS)). #10804
- Removed
--min-block-occupancy-ratiooption. The flag has been a silent no-op since 26.4.0. #11017 - Removed BFT genesis config key
xemptyblockperiodseconds(deprecated since 26.5.0). Useemptyblockperiodsecondsinstead. - Vert.x 5's
PoolMetricsSPI drops therejectedcallback, so thevertx_worker_pool_rejected_totalmetric no longer reports any value; remove any dashboard or alert that depends on it. #11015 - Vert.x 5's DNS client now filters resolved records by comparing an answer's owner name against the queried name case-sensitively, silently dropping non-matching records instead of returning them as Vert.x 4.x did. EIP-1459 DNS discovery could miss subtree/node TXT records from a server whose response doesn't echo the query name byte-for-byte (e.g. differing case). #11015
- Removed the custom
engine_preparePayload_debugRPC methods, use the standardtesting_buildBlockV1instead. #11011 - RPC changes to enhance compatibility with other ELs
eth_estimateGasnow returns the exact minimal gas limit for plain value transfers instead of a value up to--estimate-gas-tolerance-ratioabove it, e.g. 15000 instead of 15159 for a zero-value transfer under EIP-2780 (Amsterdam), matching other ELs. #11178
- Transactions whose encoded size (excluding blobs) exceeds 128 KiB, are rejected at transaction pool admission, matching the limit enforced by other ELS. The limit is configurable via the new
--tx-pool-max-tx-bytesoption.
Additions and Improvements
- Add JMH
GasProfilerthat emitsmgas_per_sas a secondary metric on each benchmark iteration using Besu's ownGasCalculator. Enable with-PgasProfiler=true; override the EVM fork with-PgasProfilerFork=<fork>(defaults to Osaka). #10807 - Align Kotlin runtime dependencies to 2.4.0 to support plugins compiled against the Kotlin 2.4 API. #10983
- Upgrade log4j to 2.25.5 #11075
- Upgrade netty dependency to 4.2.17.Final #11078
- Upgrade to vertx 5.1.6, along with the tuweni (2.7.2 → 2.8.0) and
io.consensys.protocols:discovery(26.6.0 → 26.8.0) dependencies it required, and the JUnit BOM (5.13.4 → 5.14.4). #11015 - Extract the Plugin API storage module. The key-value storage contracts (
StorageService, theKeyValueStorageFactorySPI with its store, transaction and snapshot interfaces,SegmentIdentifier, the data storage configuration views andStorageException) now live in a newbesu-plugin-api-storageartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. Also adds anorg.hyperledger.besu.plugin.storage.StorageConfigurationservice exposing the storage path and data storage configuration. #10984 - Extract the Plugin API p2p module. The peer-to-peer networking contracts (
P2PServiceand thePeer,PeerConnection,PeerInfo,CapabilityandMessagedata views) now live in a newbesu-plugin-api-p2partifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #10995 - Extract the Plugin API txpool module. The transaction pool contracts (
TransactionPoolService,TransactionPoolValidatorServiceand thePluginTransactionPoolValidator/PluginTransactionPoolValidatorFactoryvalidation SPI) now live in a newbesu-plugin-api-txpoolartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11007 - Extract the Plugin API sync module. The synchronization contracts (
SynchronizationServiceand theSyncStatusdata view) now live in a newbesu-plugin-api-syncartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11052 - Extract the Plugin API rpc module. The RPC endpoint and health check contracts (
RpcEndpointService,HealthCheckService, thePluginRpcRequest/PluginRpcResponse/RpcResponse/RpcResponseTyperequest and response types,RpcMethodErrorandPluginRpcEndpointException) now live in a newbesu-plugin-api-rpcartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. Also adds anorg.hyperledger.besu.plugin.rpc.RpcConfigurationservice exposing the configured RPC HTTP host, port and timeout. #11070 - Extract the Plugin API chain module. The blockchain query, RLP conversion and block-view contracts (
BlockchainService,RlpConverterServiceand theBlockContext,AddedBlockContext,PropagatedBlockContext,BadBlockCauseandLogWithMetadatadata interfaces) now live in a newbesu-plugin-api-chainartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11110 - Extract the Plugin API worldstate module. The world state observation contracts (
WorldStateService,TrieLogServiceand theTrieLog,TrieLogAccumulator,TrieLogEvent,TrieLogFactoryandTrieLogProvidertrie-log contracts) now live in a newbesu-plugin-api-worldstateartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11117 - Extract the Plugin API worldstate-backend module. The world state backend contracts (
MutableWorldState,StateRootCommitter,StateRootComputation,WorldStateKeyValueStorageandWorldStatePreimageStorage) now live in a newbesu-plugin-api-worldstate-backendartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11118 - Extract the Plugin API execution module. The simulation and tracing contracts (
TransactionSimulationService,BlockSimulationService,TraceService, theBlockImportTracerProvider/BlockAwareOperationTracertracer SPI and theBlockOverrides,PluginBlockSimulationResult,TransactionSimulationResult,BlockTraceResultandTransactionTraceResultdata types) now live in a newbesu-plugin-api-executionartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11172 - Extract the Plugin API blockproduction module. The transaction selection and mining control contracts (
TransactionSelectionService,MiningService, thePluginTransactionSelector/PluginTransactionSelectorFactory/TransactionSelector/AbstractStatefulPluginTransactionSelectorselection SPI,BlockTransactionSelectionService,SelectorsStateManager, and theTransactionEvaluationContextandTransactionSelectionResultdata types) now live in a newbesu-plugin-api-blockproductionartifact, re-exported bybesu-plugin-apiso existing consumers are unaffected. #11182 - Add
--p2p-discovery-portand--p2p-discovery-port-ipv6flags to configure a separate UDP port for devp2p peer discovery, independent of the TCP p2p port. Specify0to request an ephemeral port from the OS. #10718 - Pending peer request iteration:
streamAvailablePeers()scan replaced with an allocation-free capacity check. Reduces lock contention and GC pressure under a backlog of pending peer requests. #10900 - Engine API methods now execute concurrently, with only
engine_forkchoiceUpdatedandengine_newPayloadcalls processed serially in arrival order as the Engine API spec mandates. Previously all engine calls were serialized on a single thread, so light requests likeengine_getBlobsV2could queue behind a block import and exceed the consensus client's timeout. #11053 - Add a server-side cap on EVM steps captured per debug_traceCallMany to prevent unbounded execution #11142
- Add EIP-8070 Engine API surface:
engine_getBlobsV4and custodyColumns #11141
Bug fixes
- Reject non-empty withdrawals in BFT blocks (GHSA-p4h2-gvh4-pv6j)
- Use unsigned comparison for EIP-7825 transaction gas limit cap (GHSA-hmg2-5mmq-gv7c)
- Reject HMAC algorithm when public key file is supplied (GHSA-jxwx-rxf9-pg2g)
- Fail closed when ephemeral Engine API JWT key cannot be persisted (GHSA-f429-4669-7rpx)
- Cap logs block range (GHSA-g499-x5x3-8gjj)
engine_newPayloadV5now returns{status: INVALID}instead of a-32602JSON-RPC error when a presentblockAccessListcannot be decoded; a missingblockAccessListstill returns-32602. #11177debug_getRawReceiptsnow accepts a block hash as well as a block number or tag. #11156- Support dynamic reorg tracking for transaction receipt logs in
eth_getTransactionReceiptandeth_getBlockReceiptsby populating theremovedfield. #11076 testing_buildBlockV1now uses the genesis gas limit as the effective target when notargetGasLimitis specified, so the gas limit calculator applies a one-step decrement rather than holding the parent value. #11166- Keep
evmtool state-test --jsonstdout valid JSONL by omitting the human-readable final summary in that mode. #11127 admin_generateLogBloomCachenow clamps both block bounds to the chain head. #11135- The insufficient-peers permissioning provider no longer loses track of how many non-bootnode peers are connected. Its tally could drift in both directions — a connection rejected before its connect event was dispatched still decremented it, and a connection whose endpoint resolved differently on disconnect failed to — leaving the bootstrap permissioning exception either permanently armed or permanently disarmed. Connections are now tracked by identity, so a negative count is unrepresentable. #11138
eth_getTransactionByBlockHashAndIndexreported a malformed block hash at parameter 0 asInvalid transaction hash params; it now reportsInvalid block hash params. #11119- Fix
debug_getRawTransactionreturning bare RLP payload (missing EIP-2718 type-byte prefix) for typed transactions, causingkeccak256(raw) != txHash. Fixdebug_getRawReceiptsdouble-wrapping typed receipts in an outer RLP byte-string instead of returning the rawtype || rlp(payload)wire encoding. #11083 - Port clash detection during Besu start now treats TCP and UDP ports separately. #10904
- BFT (QBFT/IBFT) networks configured with Paris or a later execution fork no longer use the PoS transaction selection timeout. The protocol spec inherited
isPoS=truefrom the mainnet fork definitions, so--poa-block-txs-selection-max-timewas ignored and transaction selection ran for the full--block-txs-selection-max-time(5000 ms by default), inflating block times on short block-period networks. #11005 - Fix
NullPointerExceptionin the JSON-RPC HTTP timeout handler for batch (array) requests. 11023 - Fix
--discovery-mode=BOTH/V5re-proposing its entire known-peer table for outbound connection on every discovery tick, driving excess CPU/GC from wasted RLPx handshakes. #11027 - Restore structured
{peers, sync}detail in plugin-based/readinessresponses viaHealthCheckProvider#10687 - Fixed
debug_traceTransaction/debug_traceCall/debug_traceBlockreturning an invalid empty-stringreturnValueand a phantomSTOPentry instructLogsfor legacy EOA-to-EOA transfers that execute no EVM code. Now returnsreturnValue:"0x"and emptystructLogs, matching the execution-apis opcode-tracer schema. #10972 - Honor
callTracer'sonlyTopCalltracer config indebug_traceTransaction/debug_traceCall/debug_traceBlock; the option was previously accepted but ignored, so responses always included the nestedcallsarray. #10967 - EIP-1459 DNS discovery now verifies that each subtree record hashes to the subdomain it was served from, as the client protocol requires. #10988
- Fix wrong Bonsai storage root for same-block selfdestruct+recreate with unchanged slot values. #10979
eth_simulateV1no longer applies EIP-7825's transaction gas limit cap to simulation gas, fixing incorrect block/transaction hashes on Osaka #10885- Move to a new BFT round and select a new proposer for a block if transactions arrive at a non-proposing node after blockperiodseconds but before emptyblockperiodseconds #11031
- Complete QBFT votes in a reasonable time when
empyblockperiodsecondsis set by treating QBFT votes as "non empty blocks" #11111 engine_newPayloadno longer briefly answersSYNCINGafter startup on a peerless node:PostMergeContext.isSyncing()now treats an undetermined terminal-difficulty flag as "reached", matchingSyncState.isInSync(). #11168- Engine API timestamps above
2^63-1are no longer treated as negative:engine_newPayloadrejected such a payload's withdrawals as pre-Shanghai,engine_forkchoiceUpdatedfailed to parse the payload attributes timestamp at all, and post-merge header validation saw the block as older than its parent.
1357fb3587247b6debcee9998dd145f61f9c82b66f4fbb88c2c892bf9edfb464 besu-26.8.1.zip
0e0ed9cc0d8fa9091081b6c5d4646f15bbf7e33a6eb1e9f7bfb2ef831fe9aaf4 besu-26.8.1.tar.gz