The historical ("fat") receipts cache is no longer enabled by default on non-archive nodes. Previously
--prune.include-receipts (formerly --persist.receipts, still accepted as an alias) defaulted on for every prune mode
except archive; it now defaults off everywhere. The consensus layer was the consumer that justified retaining these
receipts on pruned nodes, and it no longer needs them (#21617).
What changed:
--prune.mode |
Before | After |
|---|---|---|
archive |
off | off |
full |
on | off |
blocks |
on | off |
minimal |
on | off |
Receipts and logs stay available within a node's retention window regardless: without the cache they are re-executed on
demand from state history, so eth_getLogs and eth_getBlockReceipts keep working, at higher latency. For full and
minimal nodes the availability window is unchanged (receipts follow the state-history window either way). For blocks
nodes the cache previously made receipts and logs queryable back to genesis; without it they follow the state-history
window (last 262,144 blocks) — pass --prune.include-receipts if you rely on full-range eth_getLogs.
Migration: existing datadirs are unaffected — the receipts-cache setting is recorded at datadir creation and the
stored value wins, so a node already syncing with the cache keeps it. Such a node now logs a startup notice that
--prune.include-receipts differs from the value stored in the datadir; pass --prune.include-receipts explicitly to
silence it. Only newly-created full/minimal/blocks datadirs start without the cache; pass
--prune.include-receipts on a fresh datadir to opt back in.
(#22296) — by @yperbasis
The receipt cache and commitment history now share the --prune.* naming used by the rest of the pruning flags. All
former names keep working as aliases, and stored datadir settings are unaffected.
--persist.receipts→--prune.include-receipts(alias:--persist.receipts,--experiment.persist.receipts.v2).- New
--prune.receipts.distance(alias:--persist.receipts.distance) bounds how far back the receipt cache is kept: a block count,keep-all, or empty/0(default) to follow the state-history window. Requires--prune.include-receipts. Snapshots older than the window are skipped at download time. --prune.commitment-history.distancenow also acceptskeep-all(in addition to a block count); empty or0still keeps everything.
(#22349) — by @AskAlexSharov
Quoted decimal strings (e.g., "3") are no longer accepted as block-number
parameters; use the canonical hex form (e.g., "0x3") instead. Bare JSON
integers (3) and named tags ("latest", "earliest", "pending",
"safe", "finalized") are unchanged.
What changed:
| Input | Before | After |
|---|---|---|
"3" (quoted decimal) |
accepted | rejected with -32602 |
"0x3" (hex string) |
accepted | accepted |
3 (bare integer) |
accepted | accepted |
Migration: replace any quoted decimal block number with its 0x
equivalent — e.g., "3" → "0x3", "1000000" → "0xf4240".
Aligns Erigon with the eth_simulateV1 error code specification (NethermindEth/nethermind#11412).
What changed:
| Aspect | Before | After |
|---|---|---|
ErrFeeCapTooLow error code |
-32602 (generic "Invalid params") |
-38012 (spec-mandated "baseFeePerGas is too low") |
Migration:
- If your tooling matches on error code
-32602to detect base-fee-too-low conditions ineth_simulateV1responses, update it to match-38012instead.
Filters created with eth_newFilter, eth_newBlockFilter, and eth_newPendingTransactionFilter are now evicted when not polled for 5 minutes, matching geth's stale-filter deadline. Previously they lived — and kept buffering data — until eth_uninstallFilter or a restart.
What changed:
| Aspect | Before | After |
|---|---|---|
| Idle polling filter | kept until uninstalled or restart | evicted after 5 minutes without a poll |
eth_getFilterChanges / eth_getFilterLogs on an evicted id |
— | filter not found |
Migration: poll more often than the timeout, or recreate the filter when filter not found is returned (as with geth). Tune with --rpc.subscription.filters.timeout; set it to 0 to restore the previous keep-forever behavior. (#22261 by @onelapahead)
--prune.distance.blocksnow accepts readable policy names —keep-post-mergeandkeep-all— instead of the rawMaxUint64-based magic numbers (18446744073709551615/18446744073709551614);--prune.distancelikewise acceptskeep-all. Numeric values still work (#22119) — by @yperbasis--rpc.subscription.filters.timeout— deadline for evicting idle RPC polling filters (default 5m; 0 disables). Newsubscriptions_activegauge andsubscriptions_created_total/subscriptions_unsubscribed_total/subscriptions_reaped_totalcounters track the filter lifecycle (#22261) — by @onelapahead
v3.5.2 is a bugfix release recommended for all users, and especially for anyone running 3.5.1 — it fixes a sync-halting trie-root regression introduced there (#22399). It is a drop-in upgrade from 3.5.1 — no re-sync required.
Bugfixes
- db/state: clear the StateCache on
SharedDomainsunwind below the reorg window (#22402) by @Sahil-4555 — after the v3.5.1 changeset-isolation backport, a block that failed execution within the reorg window did a disk-noop overlay unwind that left dirty, uncommitted writes in the state cache; on the next run execution read those stale values instead of the database, producing a deterministic trie-root mismatch that halted sync. Closes #22399. - rpc, node: fix the nil-pointer panic in the gzip batch flush race (#22383) by @lupin012 — a gzipped JSON-RPC batch with two or more streamable methods invoked the shared gzip-streaming flush hook concurrently from per-call goroutines;
gzipResponseWriter.Flushis not concurrency-safe, so the calls raced on the underlying gzip writer and could dereference a nil flate compressor, crashing the node. Closes #22334.
Full Changelog: https://github.com/erigontech/erigon/compare/v3.5.1...v3.5.2
v3.5.1 is a bugfix release recommended for all users. It is a drop-in upgrade from 3.5.0 — no re-sync required.
Bugfixes
- execution/stagedsync: fix parallel-execution commitment consistency at step boundaries (#22111, #22135, #22147, #22094) by @awskii, @sudeepdino008 — a block straddling a step boundary left that step's commitment inconsistent with the account/storage/code domains, so published snapshots could mis-serve state-read RPCs (
eth_getProof,debug_executionWitness) and, on a later run, wedge the Execution stage in a zero-progress loop with nothing logged. Closes #21992, #22101. - execution/stagedsync: fix log index reset and missing WebSocket notifications in parallel execution (#22155) by @Sahil-4555 — restores
logs/newHeadssubscription notifications and correct log indexing when executing in parallel. - execution/stagedsync: fix pruning in
stage_custom_trace(#22052) by @sudeepdino008 — regenerated domains were never pruned and accumulated unbounded in the DB. Closes #22013. - cl/persistence: fix caplin historical state reconstruction loop at the Bellatrix transition (#22370) by @Sahil-4555 — a Caplin node could stop advancing at the Merge (Bellatrix) slot; pre-Merge blocks carry an all-zero execution payload header, and reconstruction now detects the zero block hash and skips the EL transaction lookup. Closes #22337.
- cl/phase1/forkchoice: replace latestMessagesStore interning with a flat per-validator slice (#22355) by @lystopad — the prune scan walked the whole message map on every update and stalled
GetHeadpast the attestation deadline. Closes #22351. - cl/antiquary: commit reconstructed state in bounded batches (#22348) by @awskii — committing up to 30 minutes of replayed beacon state in a single MDBX transaction could overflow libmdbx and crash on large (100+ GB) archive databases.
- cl: bound caplin archive blob-column backfill so it can't wedge on Fulu (#22318) by @awskii — prevents an archive node from getting stuck while backfilling blob (data-column) sidecars.
- cl, db/snapshotsync: caplin snapshot correctness — don't freeze empty block/state roots (#22323) and remove overlapping state snapshots on retire (#22317) by @awskii.
- cl: allow boundary attestations while head state lags (#22251) by @domiwei — fixes attestation validation at epoch boundaries when the wall-clock slot has advanced but the head state briefly lags behind.
- rpc/jsonrpc: gate
debug_executionWitnessonkeys[]completeness and keep preimages for in-block-deleted accounts (#22320) by @awskii — avoids returning an incomplete witness. - rpc: remove the state-history check from block-data-only endpoints (#22073) by @Sahil-4555 — endpoints that only need block data no longer error on nodes pruned below the requested block's state history.
- cmd/utils: allow snapshot reset on upgraded datadirs by restricting the table config (#22291) by @Sahil-4555 — snapshot reset failed to resolve the chain name on upgraded datadirs. Closes #22275.
Improvements
- execution: disable gzip compression for the Engine API (#22369) by @taratorio — removes compression overhead on
engine_*responses, loweringengine_getPayload/getBlobslatency. - p2p: re-resolve the STUN external IP at runtime (#22188) by @lystopad — with
--nat=stun, a node whose public IP changes while running now re-resolves and re-advertises it instead of keeping the stale startup value. - db/version: relax the minor-version check in
Supports(#22205) by @sudeepdino008 — a newer, backward-readable minor version within a supported major is now accepted, so the binary won't refuse newer minor-versioned files.
Full Changelog: https://github.com/erigontech/erigon/compare/v3.5.0...v3.5.1
Erigon 3.5.0 is a major release headlined by parallel block execution becoming the default and initial support for Ethereum's upcoming Glamsterdam hardfork. It is a drop-in upgrade for 3.4.x users — no re-sync required; existing datadirs upgrade their prune configuration automatically (see Breaking Changes).
- Parallel block execution, on by default. Erigon now executes EVM transactions across multiple cores by default, using the Block-STM (software transactional memory) design pioneered by Aptos: transactions run optimistically in parallel and are re-validated against a multi-version state, re-executing only on conflict (#21591 by @mh0lt, closes #17630). Revert to serial with
EXEC3_PARALLEL=falseor--exec.serial. - Glamsterdam devnet support. Initial implementation of Ethereum's next hardfork: Block-Level Access Lists (EIP-7928), enshrined Proposer-Builder Separation / "Gloas" (EIP-7732) in Caplin, gas repricings (EIP-8037, EIP-7976, EIP-7981), larger contracts (EIP-7954), transfer logs (EIP-7708), and the
eth/71Block Access List wire protocol (EIP-8159). Devnet/testing only — not scheduled on mainnet or any public testnet. debug_executionWitness. Stateless execution-witness generation (EIP-7928/8025) with reth-compatible output, for zkEVM and stateless clients (#20205 by @antonis19, #21629 by @awskii).- More aggressive history pruning by default.
--prune.mode=fullnow follows the EIP-8252 reorg-retention window (~36 days / 262,144 blocks) — see Breaking Changes. - GraphQL API revival. Broad resolver coverage restored — queries, logs,
call,sendRawTransaction,estimateGas,gasPrice, storage, and EIP-4844 fields.
Full mode now retains state and block data for the last 262,144 blocks (~36.4 days), matching EIP-8252's REORG_RETENTION_WINDOW (#21342). Previously full mode pruned only pre-merge block data (EIP-4444 history-expiry) and kept the last 100,000 blocks of state history.
What changed:
| Before | After | |
|---|---|---|
| State history retention | last 100,000 blocks | last 262,144 blocks |
| Block data retention | pre-merge pruned, all post-merge kept (EIP-4444) | last 262,144 blocks |
Migration: existing datadirs upgrade automatically and silently. To keep the old "retain all post-merge block data" behavior, set --prune.distance.blocks=18446744073709551615.
Note: physical deletion of frozen snapshot files is not implemented yet (see #21306), so existing on-disk historical blocks persist for now, though the new cutoff is already recorded at the config level.
In practice, this means only freshly synced full nodes will have a reduced disk footprint.
--prune.mode=blocks keeps the same shape as before (all block data retained), but its state history retention also bumps from 100,000 to 262,144 blocks. --prune.mode=minimal is unchanged — both block and state history retain the 100,000-block window, deliberately sub-EIP-8252 for disk-constrained operators. See #21342 for details.
Erigon now opens a single TCP listener on --port (default 30303) carrying every configured eth protocol version, instead of one listener per protocol on 30303/30304/30305. This fixes a discovery-DHT race that left inbound peers stuck at a fraction of --maxpeers for multi-protocol deployments: per-protocol ENRs collided under one Node ID, so only one survived in the DHT and peers dialed the wrong listener (#21335).
What changed:
| Aspect | Before | After |
|---|---|---|
| Inbound peer ports | 30303, 30304, 30305, … (one per eth version) |
30303 only |
--p2p.allowed-ports flag |
Picked one port per protocol from this list | Removed — passing it now errors |
--maxpeers semantics |
Per-protocol cap; actual ceiling ≈ N × maxpeers | Honest total cap |
Default --maxpeers |
32 |
64 (compensates for the now-honest cap) |
| Enode database directory | <datadir>/nodes/eth68, <datadir>/nodes/eth69, … |
<datadir>/nodes/eth |
Migration:
- Remove
--p2p.allowed-ports=...from CLI args / config files; it is no longer recognised. - Firewall, Kubernetes Service, and monitoring rules that explicitly opened 30304/30305 can drop those entries — only
--portis bound now. - If you previously lowered
--maxpeersbecause you knew the per-protocol multiplication inflated the real ceiling, raise it back to the target total (the cap is now what the flag says). - First run after upgrade loses the warm peer cache in
nodes/eth{68,69,…}— nothing on disk is deleted, the directories are simply no longer read; discovery rebuilds the peer set from bootnodes within a few minutes.
Standalone sentry binary (cmd/sentry) and --sentry.api.addr (remote sentry over gRPC) are unaffected — neither had the bug.
Aligns Erigon with the execution-apis specification (ethereum/execution-apis#762) and Geth behavior.
What changed:
| Field | Before (Erigon) | After (Erigon / Geth / Spec) |
|---|---|---|
| Memory in trace | disableMemory (default: included) |
enableMemory (default: excluded) |
| Return data in trace | disableReturnData (default: included) |
enableReturnData (default: excluded) |
Both the key and its default changed: disable* → enable*, and memory and return data are now excluded unless explicitly enabled — matching the spec and Geth.
Migration: memory and return data are now excluded by default. To include them, add the new opt-in key (omit it to keep the default):
- Memory:
{ "enableMemory": true } - Return data:
{ "enableReturnData": true }
Affected RPC methods: debug_traceTransaction, debug_traceBlockByHash, debug_traceBlockByNumber, debug_traceCall.
The legacy Clique proof-of-authority engine has been removed (#20532 by @yperbasis). --chain=dev now runs on an embedded proof-of-stake consensus instead of Clique (#20451 by @mh0lt), matching how all live networks operate post-Merge. Networks or tooling that still depended on Clique are no longer supported.
The optional Silkworm C++ execution-backend integration and its --silkworm.* flags have been removed (#19662 by @canepat). Erigon uses its native Go execution engine exclusively.
3.5.0 adds an initial implementation of Ethereum's next hardfork — Glamsterdam (consensus-layer "Gloas" + execution-layer "Amsterdam") — for devnet testing and validation. It is not scheduled on mainnet or any public testnet, and these code paths are inert on production networks until an activation time is configured.
- EIP-7928 — Block-Level Access Lists (BAL): records every account and storage slot a block touches, enabling deterministic parallel validation. Full builder, validator, and strict-validation support (#19627, #19656, #20602, #20776), plus the
eth_getBlockAccessListRPC method (#19929) — by @mh0lt, @yperbasis, @Sahil-4555 - EIP-7732 — Enshrined Proposer-Builder Separation (ePBS / "Gloas"): implemented in Caplin — execution-payload envelope, PTC, and builder payments (#18956) — with follow-up audit and fork-choice fixes (#21248, #21228) — by @domiwei
- Gas repricings: EIP-8037 State Creation Gas Cost Increase (#19596), EIP-7976 calldata floor cost (#20613), EIP-7981 access-list cost (#20671) — by @taratorio
- EIP-7954 — Increase Maximum Contract Size (#19624) — by @yperbasis
- EIP-7843 — slot-number opcode (
SLOTNUM), wired into Caplin block production andengine_forkchoiceUpdatedV4(#20175) — by @yperbasis - Networking:
eth/71Block Access List exchange (EIP-8159, #20793, #20794, #20795) — by @mh0lt
debug_executionWitness: generate stateless execution witnesses (EIP-7928/8025), withlegacyandcanonicaloutput modes — thelegacyformat is reth-compatible — for zkEVM and stateless clients (#20205, #21371, #21518, #21629) — by @antonis19, @lupin012, @awskiieth_capabilities: report the set of supported RPC methods (#20951) — by @lupin012debug_setHead: rewind the chain head (#19577) — by @canepat- GraphQL substantially revived — transaction, logs,
call,sendRawTransaction,estimateGas,gasPrice, and storage resolvers, plus EIP-4844 fields (#20389, #20916, #21219, #21379, #21060) — by @lupin012 testing_namespace exposed via--http.apifor engine/spec test harnesses (#20482) — by @lupin012eth_simulateV1: per-call gas and result limits (#20232) — by @Sahil-4555
--exec.no-prune(disable all DB pruning),--exec.serial(force single-threaded execution), and--exec.*executor-tuning flags (#20915, #20853, #20797) — by @mh0ltseg du(snapshot disk-usage analysis, #20104) andseg rm-blocks(remove latest block snapshots, #20554) — by @awskii, @sudeepdino008
- WebSocket transport rewritten on
coder/websocket, with overload protection, clean close frames, and bounded write timeouts (#20097, #20446, #20788, #20923) — by @lystopad, @lupin012, @Sahil-4555 - Admission control: uniform
503responses under load (#20303); optional response compression via libdeflate (#20665) — by @lupin012 - Geth compatibility:
debug_traceTransactionindex format (#20210),trace_rawTransaction(#20448),debug_accountRange(#20057), nullv,r,sfor unsigned transactions (#21321) — by @lupin012 - Performance: faster
eth_getLogs(#20561),trace_block(#20182),eth_gasPrice(#19678), canonical-hash cache (#19173);engine_getPayload~2.4× andgetBlobs~10× faster (#21615, #21606) — by @lupin012, @taratorio trace_*returns an explicit error when an unsupported custom tracer is supplied (#21544) — by @lupin012
- New
eth/70wire protocol: partial block receipt lists (EIP-7975, #19755) — by @yperbasis - All eth protocol versions now multiplex on a single TCP listener (see Breaking Changes, #21335) — by @lystopad
- Peer hygiene / DoS hardening: cap and rate-limit inbound
NewBlockHashes(#21557), enforce the 4096-hash limit onNewPooledTransactionHashes(#20577), drop peers failing blob KZG verification (#21421), and bound fan-out stream buffers (#20783) — by @yperbasis - Skip chain-specific bootnodes on genesis-hash mismatch (#19807); honour an explicitly empty
--bootnodes(#20630) — by @yperbasis
- Proactive dormancy-based eviction of stale queued transactions (#19862) — by @lystopad
- Transaction parsing migrated onto the shared
execution/typestransaction types (#19757); malformed EIP-7702 authorization tuples are now tolerated rather than rejected wholesale (#20809) — by @yperbasis
- Unified Engine API client for standalone mode (#20035) — by @mh0lt
- Fork-choice and ENR-stability fixes — recovery from a post-Gloas fork-choice stall and a persistent node key for stable ENR across restarts (#21228, #21276) — by @domiwei
- Block production: give the EL builder a build window before stopping it, fixing near-empty proposed blocks (~0–2% gas) on otherwise-healthy validators (#21990) — by @lystopad
- Off-heap Elias-Fano index building (#20640) and parallel commitment computation (#20805) — by @AskAlexSharov, @mh0lt
- Transient-storage zero-write fast path (#20568) and opcode-scoped intern cache to eliminate duplicate
unique.Make()(#20552) — by @Sahil-4555, @AskAlexSharov
- Clique PoA engine (#20532 by @yperbasis) and Silkworm integration (#19662 by @canepat) — see Breaking Changes.
- Unused
hack(#20412),state(#20420), anddiag(#21351) helper binaries — by @awskii, @AskAlexSharov
--ethstatscredentials are redacted from the startup command log (#20890) — by @MysticRyuujin- DoS-resistance limits on inbound P2P message volume (#20577, #21557) and bounded RPC/stream buffers (#20446, #20783) — by @yperbasis, @lupin012
Full Changelog: https://github.com/erigontech/erigon/compare/v3.4.4...v3.5.0
v3.4.4 is a bugfix release recommended for all users.
Bugfixes
- execution/stagedsync: prune in-RAM overlay when execution unwind is a no-op (#21824, #21847) by @JkLondon — third fix for the post-reorg
gas used mismatch. - caplin: serialize uint64 beacon API fields as JSON strings (#21805) by @BitWonka - Per the beacon-APIs spec, Uint64/Gwei fields must be serialized as JSON strings. Several Caplin response types were emitting them as JSON numbers, breaking spec-compliant clients. Fixes #20562.
Full Changelog: https://github.com/erigontech/erigon/compare/v3.4.3...v3.4.4
v3.4.3 is a bugfix release recommended for all users.
Bugfixes
- db/state: prune
TemporalMemBatchoverlay entries past the unwind point (#21538) by @JkLondon — second fix for the post-reorggas used mismatch/ state-leak some users still hit on v3.4.2. After a tip reorg a stale read in the in-memory overlay could return a write made inside the unwoundtxNumrange, flipping anSSTOREfrom cold to warm gas pricing. Complements the #21157 diffset fix shipped in v3.4.2. - rpc: match Geth semantics in
debug_getModifiedAccountsByHash/debug_getModifiedAccountsByNumber(#21507) by @lupin012 — corrects the block-range convention (exclusive start), now also reports contracts whose storage changed without an account change, and excludes touched-but-unchanged precompiles and self-destructed accounts. - node/cli: register
--rpc.logs.maxresultsinDefaultFlagsso it takes effect via the CLI (#21389) by @lupin012 — the limit was documented in 3.4.0 but never wired into the flag set, so setting it on the command line had no effect; it now applies.
Improvements
- execution/p2p, execution/engineapi: fail-fast
engine_newPayloadbackward download when the gap exceeds the reorg limit (#21502) by @yperbasis — when a payload's parent is more thanMaxReorgDepthblocks from the local head, the download short-circuits instead of fetching a header batch every slot, and logs the expected gap at INFO instead of WARN. The gap is still closed by the following fork-choice update.
Full Changelog: https://github.com/erigontech/erigon/compare/v3.4.2...v3.4.3
v3.4.2 is a bugfix release recommended for all users.
Bugfixes
- execution/stagedsync: find diffset by actually-executed hash on unwind (#21157) by @JkLondon — fixes a
state-leak bug in
unwindExec3that surfaces asgas used mismatch/Cannot update chain headafter a tip reorg whose unwound block deployed a contract viaCREATE/CREATE2to a counterfactual address (safe-wallets, EIP-1167 clone factories, ERC-4337 accounts, deterministic deployers). The unwind now walks every header at the height to find the diffset of the block actually executed, instead of assuming the (already-flipped) canonical hash matches. - rawdb: ignore invalid receipt cache transaction indexes (#21262) by @Sahil-4555
Improvements
- db/state, ethconfig: bound domain merge; add
--erigondb.domain.steps-in-frozen-file(#21148) by @wmitsuda
Full Changelog: https://github.com/erigontech/erigon/compare/v3.4.1...v3.4.2
Bugfixes
- commitment: segfault fix - caused by branch slice returned by TrieContext.Branch (#21044) by @awskii
Full Changelog: https://github.com/erigontech/erigon/compare/v3.4.0...v3.4.1
Erigon 3.4.0 is a major update for node operators and validators, focused on stability, performance, and efficiency at ChainTip. It is a drop-in upgrade for 3.3.x users — no data migration or re-sync required.
- Fast restart on ChainTip: no more blocking indexing or pruning at startup; Caplin doesn't lose its download progress.
- 4x smaller Chaindata (~20 GB): improves ChainTip speed. Available via re-sync, or by running
./build/bin/erigon seg step-rebase --datadir=<your_path> --new-step-size=390625(takes ~10 seconds). - Historical
eth_getProof: is no longer experimental. Recommended: 32 GB+ RAM. Re-sync with--prune.include-commitment-historyto apply the latest data fixes. - New RPC endpoints:
trace_rawTransaction,eth_getStorageValues,admin_addTrustedPeer,admin_removeTrustedPeer, flat tracers,engine_getBlobsV3. - Reduced impact on ChainTip performance: from RPC, background file merging, pruning, and optional
heavy flags (
--persist.receipts,--prune.include-commitment-history).
- Minimum Go version: 1.25
--rpc.blockrange.limit=1_000new limit. Maximum block range (end - begin) allowed for range queries over RPC. 0 - means unlimited. Default: 1_000--rpc.logs.maxresults=20_000new limit. Maximum number of logs returned by eth_getLogs, erigon_getLogs, erigon_getLatestLogs. 0 - means unlimited. Default: 20_000--rpc.max.concurrency=0new limit. Maximum number of concurrent HTTP RPC requests (HTTP admission control). 0 = use db.read.concurrency, -1 = unlimited (no admission control). Default: 0- p2p: switched to
discv5.discv4disabled by default.
trace_rawTransaction: execute and trace a raw signed transaction without broadcasting it (#19524)eth_getStorageValues: batch fetch of multiple storage slots in a single call (#19442)admin_addTrustedPeer/admin_removeTrustedPeer: manage trusted peers at runtime (#19413)- Call flat tracers (
trace_callfamily): flat trace output format support (#18556) engine_getBlobsV3: Engine API blob retrieval v3 (#18512)trace_call:StateOverridesprecompile support (#18401, #18492)
- Fusaka scheduled for Chiado (Gnosis Chain testnet) at slot 21 651 456, epoch 1 353 216, timestamp 1 773 653 580 (Mon 16 Mar 2026 09:33:00 UTC) (#19682)
- Chiado bootstrap nodes updated to match the Lighthouse built-in Chiado network config (#19693)
- Balancer hard fork for Gnosis Chain mainnet (#18122)
- Amsterdam signer support and BAL non-determinism fix (#19434)
- BAL selfdestruct net-zero fix (#19528)
- Parallel execution fixes for block-access-list (BAL) workloads (#17319)
- execution/vm: EIP-8024 (
SWAPN,DUPN,EXCHANGE) opcodes implemented (#18670) - Pectra requests-hash validation: fix partial block receipt reconstruction when execution resumes from
a snapshot boundary mid-block — resolves
invalid requests root hash in headeron mainnet re-sync at block 24966723 (#20452)
- Persistent historical download — Caplin now persists and resumes historical beacon block downloads across restarts (#18320)
- Discovery v5 enabled by default —
discv5is now the default peer discovery protocol (#18578) - cl/p2p, cl/sentinel: fix DISCV5 ENR missing IP when the discovery address is unspecified (#19585)
- Fix missing attestations by using GossipSub for subnet peer coverage (#19523)
- cl/gossip: fix conditions forwarding, ENR lifecycle, and epoch-mismatch — prevents false peer banning, reduces log flooding from redundant ENR updates, and guards against stale RANDAO committee computation (#20777)
- cl/beacon: add
single_attestationevent topic support (#18142) - cl/beacon: set
Eth-Consensus-Versionheader when versioned (#18377)
eth_getBlockReceipts: limit over-concurrency — prevents latency growth and out-of-memory (OOM) at high request rates (#19725)debug_traceCallMany: fix globalBlockOverridesandStateOverridesnot being applied (#19547)debug_traceCall: fix state and block overrides interaction (#18480)eth_blobBaseFee: fix incorrect value returned (#18506)eth_getBalanceand others: fix block-not-found error for certain historical queries (#18457)- Block-hash canonicality check added to APIs that accept a block hash and state (#19356)
- rpc: fix batch limit exceeded error to comply with the JSON-RPC spec (#18260)
trace_replayTransaction(): add stack info forTLOADopcode (#19550)eth_feeHistory: performance optimisation and pending block support (#19526, #19455)debug_trace*: zero-alloc memory word encoding inJsonStreamLogger— eliminates per-word heap allocations and prevents OOM on large block traces (#20754)- prestateTracer: fix diff mode missing deleted accounts to match geth behaviour (#20775)
- rpc/mcp: fix
tools/callhanging indefinitely under DB load by switching the SSE context to non-blocking read-tx acquire (#20778)
- Zombie queued transactions: transactions exceeding
MaxNonceGapare now evicted (#19449) - txnprovider/shutter: fix premature encrypted txn pool cleanup and peer drops (#18351)
- txpool: cache
pendingBaseFeefor queue comparisons to reduce recomputation (#18341)
- p2p/sentry: fix wrong OR in case statement for
witprotocol messages (#19580) - p2p: better handling of RLP errors in
wit(#19569) - discv4 disabled by default on mainnet (discv5 preferred) (#18640)
- merge: prioritize Domain merge over History — 2x less disk space required, and less impact to ChainTip from history-merge (#19441)
- merge: fix O(n²) InvertedIndex re-merge — eliminates quadratic time complexity during re-merge (#19680)
SequenceBuilder: avoids an intermediate Elias-Fano representation during sequence building and merge (#19552, #19567)- Faster startup: state-file index building deferred to reduce restart latency (#19583, #19407)
- Graceful restart in history download:
SpawnStageHistoryDownloadnow honours the stage context, so Ctrl+C during history download exits promptly instead of waiting for the download to finish (#20766) - DB integrity checks: time budget added so checks no longer run unbounded (#20714)
- Commitment-history integrity: skip the integrity check when commitment history is disabled (#20835)
seg ls: report dictionary size and memory usage in the output (#20790)- anacrolix/torrent: fix peerconn panic on bad reads while serving peer requests (#20748)
- github.com/buger/jsonparser: bump 1.1.1 → 1.1.2 to address CVE-2026-32285 (HIGH, CVSS 7.5 — out-of-bounds read) (#20018)
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.10...v3.4.0
This release schedules Fusaka on Gnosis Chain mainnet at Tue 14 April 2026, 12:06:20 UTC and thus is mandatory for all Gnosis users. It is also recommended for all users in general.
Changes
- Schedule Gnosis Fusaka (#20090) by @domiwei
- txpool: fully discard pre-Osaka blob txns in best() (#20120) by @yperbasis
- rpc: auto-convert legacy blob sidecar to v1 cell proofs after Osaka (#20087) by @domiwei
- rpc: add blockRangeLimit param for API works on blocks range (#19614) by @lupin012
- cl: fall back to local head state when remote checkpoint sync fails (#20003) by @domiwei
- cl: fix fork choice block validation and error propagation (#19927) by @domiwei
- cl: re-enable voluntary_exit gossip topic subscription (#19764) by @Giulio2002
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.9...v3.3.10
This release schedules Fusaka on Chiado on Mon 16 March 2026, 09:33:00 UTC and thus is mandatory for all Chiado users.
Changes
- fix(txpool): evict zombie queued txns exceeding MaxNonceGap (cherry-pick #19449 → release/3.3) (#19591) by @Giulio2002
- cl/sentinel: fix DISCV5 ENR missing IP when discovery address is unspecified (#19647) by @lystopad
- rpc: accept only canonical hash for block receipts (#19649) by @canepat
- Schedule Fusaka for Chiado (#19681) by @yperbasis
- cl: amend Chiado bootstrap nodes (#19692) by @yperbasis
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.8...v3.3.9
Changes
- New Chiado boot nodes (cherry-pick #18867) (#19241) by @sudeepdino008
- eth_getLogs: receipts availability check to be aware about
--persist.receiptsand--prune.mode=minimal(#19226) by @AskAlexSharov - txnprovider/shutter: fix decryption keys processing when keys do not follow txnIndex order (#18951) (#18959) by @taratorio
- execution: fix Chiado re-exec from genesis (#18887) by @yperbasis
Bugfixes
- execution/tests: minor fix chainmaker add withdrawals in shanghai (#18886) by @taratorio
- Reduce impact of background merge/compress to ChainTip (#18995) by @AskAlexSharov
- fix(caplin): Fixes for DataColumnSidecar (#18268) (#19003) by @taratorio
- rpc: bound checks in receipts cache V2 and generator (#19046) by @canepat
- execution/execmodule: fix unwinding logic when side forks go back in height (#18993) (#19063) by @taratorio
- p2p: fix nil pointer crash with --nodiscover (#19056) by @sudeepdino008
- rpc: add check on latest executed block (#19133) by @canepat
- protect History from events duplication (#19230) by @AskAlexSharov
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.7...v3.3.8
P2P stability. Prune performance.
Changes
- prune: remove early-exit based on DirtySpace() (#18787) by @AskAlexSharov
- execution: fix commitment state key txNum when last block tx is at step boundary (#18858) by @taratorio
- p2p deadlock fix (#18862) by @Copilot
- Forward compatibility: Fixed index building for v0 snapshot format (#18824) by @eastorski
- Backward compatibility: Add --v5disc alias (#18785) by @anacrolix
- Show the default P2P discovery bools in --help (#18819) by @anacrolix
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.4...v3.3.7
v3.3.4 is a bugfix release recommended for all users.
Changes
- Fix for missing rcache at stepBoundary (#18698) by @sudeepdino008
- execution/stagedsync: port --experimental.always-generate-changesets flag for gas repricing benchmarks (#18733) by @taratorio
- execution: add --fcu.timeout and --fcu.background.prune flags (#18723) by @taratorio
- Not needed collector erased in prune domains (#18665) by @JkLondon
- Forward compatible snapshots format (#18746) by @eastorski
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.3...v3.3.4
v3.3.3 is a bugfix release recommended for all users.
Fixes
- CL: Fix incorrect committee count in process_attestation (#18316) by @domiwei
- CL: Fix for periodic retry of not-ready response (#18376) by @taratorio
- Shutter: fix premature encrypted txn pool cleanup bug and peer drops (#18264) by @taratorio
- Half block exec fix in receipts (#18426, #18505) by @sudeepdino008
- p2p: resolve security vulnerability (#18650) by @yperbasis
Improvements
- p2p: Turn on discovery v5 by default (#18639) by @anacrolix
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.2...v3.3.3
Gnosis hardfork support.
Changes
- rpc: fix panic on
GetEthV1BeaconBlobs(#17992) (#18232) by @domiwei - rpc: fix invalid key error code in
eth_getStorageAt(#18238) by @canepat - cl/beacon: add single_attestation event topic support (#18142) (#18277) by @domiwei
- Gnosis Balancer (#18282) by @mh0lt
- bittorrent: torrent excessive wantPeers event fix (#18256) by @anacrolix
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.1...v3.3.2
- We have new Docs and HelpCenter: https://docs.erigon.tech/
- Support of historical
eth_getProof(#12984). It requires--prune.include-commitment-historyflag.
RPC
- rpc: fix txpool_content crash: unknown (#18120) by @canepat
CL
- Caplin: Simplified peer refreshing (#18123) (#18152) by @domiwei
TxPool
- txpool: remove double PopWorst() in pending pool overflow (#18159) by @AskAlexSharov
Sync
- Torrent client fixes (#18179) by @anacrolix
Full Changelog: https://github.com/erigontech/erigon/compare/v3.3.0...v3.3.1
- Support of historical
eth_getProof(#12984). It requires--prune.experimental.include-commitment-historyflag. - Look our new Docs and HelpCenter: https://docs.erigon.tech/
eth_simulateV1: Complete implementation of Ethereum simulation API with support for state overrides, blob transactions, block overrides, and historical state roots (#15771)eth_createAccessList: StateOverrides parameter support (#17653)- Support for
eth_callwith blockOverrides (#17261) trace_filter: Block tags support (#17238)debug_traceTransaction: Self-destruct operation validation (EIP 6780) (#17728)
- EIP-7928: BlockAccessList type support (#17544)
- EIP-7934: EstimateGas capped by MaxTxnGasLimit in Osaka (#17251)
- EIP-7702 transaction support in
(r *Receipt) decodeTyped(#17412) - Rewrite bytecode support for post-Merge blocks (#17770)
- Get blobs support (Fusaka compatibility) (#17829)
eth_getTransactionReceipt: Pre-Byzantium transaction handling (#17479, #17509)eth_estimateGas: Improved handling with StateOverrides (#17914, #17295)debug_traceCall: System contract execution support (#17339)- Blob transaction and blob base fee override support (#17313)
- Experimental Parallel Exec (#16922)
- MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP for Gnosis (#17501)
- Reduce goroutines amount produced by BitTorrent library (#17765)
- Up base image to
Go 1.25-trixie(#17837)
- PoW mining was removed in #17813. The
--chain=devmode now uses an embedded PoS consensus layer (Caplin) with deterministic validators instead of Clique. Seedocs/DEV_CHAIN.mdfor usage. - Holesky network support removed (#17685)
- eth/67 protocol support removed (#17318)
- SkipAnalysis VM optimization removed (#17217)
Full Changelog: https://github.com/erigontech/erigon/compare/v3.2.2...v3.3.0
Changes
- Caplin: add getBlobs support (fusaka) (#17840) by @Giulio2002
Full Changelog: https://github.com/erigontech/erigon/compare/v3.2.2...v3.2.3
v3.2.2 schedules Fusaka on Ethereum mainnet on December 3, 2025 at 09:49:11pm UTC. Thus it is a mandatory update for all Ethereum mainnet users.
New features
- Schedule Fusaka on Ethereum mainnet in #17736 by @yperbasis
- Tool to fetch and recover blobs from a remote beacon API in #17611 by @Giulio2002
Full Changelog: https://github.com/erigontech/erigon/compare/v3.2.1...v3.2.2
v3.2.1 is a bugfix release recommended for all users, especially validators.
Fixes
- Fix validators producing bad blocks on Hoodi in #17487 by @mh0lt
- RPC: fix "insufficient funds for gas * price + value" error in traces retrieval for a specific block (Issues #16909, #17232) in #17523 by @antonis19
- RPC: fix no changes and filter not found in eth_getFilter* (Issue #17246) in #17350 by @canepat
- RPC: debug_traceCall fix avoid to trace sysContract (Issue #17220) in #17360 by @lupin012
- CL: fix initial previous_version in fork_schedule (Issue #17262) in #17331 by @domiwei
Improvements
- Ethereum mainnet default block gas limit is raised to 60M in #17321 by @yperbasis
- CL: Allow blob requests after Fusaka in #17500 by @domiwei
Full Changelog: https://github.com/erigontech/erigon/compare/v3.2.0...v3.2.1
Erigon 3.2.0 has a complete implementation of Fusaka and schedules it on the test nets (#17197):
- Holesky on Wednesday, 1 October 2025 08:48:00 UTC
- Sepolia on Tuesday, 14 October 2025 07:36:00 UTC
- Hoodi on Tuesday, 28 October 2025 18:53:12 UTC
Fixes
- Re-org/unwind fixes (#17105, #17165) by @taratorio
- RPC: Fixes to eth_getProof (#16220, #16251, #16564, #16606, #16687) by @awskii
- tracer: fix prestates for EIP7702 transactions (#16497) by @nebojsa94
Improvements
- New EL block downloader (#16270, #16673) by @taratorio
- Caplin p2p improvements (#16719, #16995) by @Giulio2002
- EVM: MODEXP precompile performance improvements (#16579, #16583, #16396, #17151) by @chfast & @yperbasis
- execution: more accurate bad block responses (#16994) by @taratorio
- Block builder: improve txpool polling (#16412) by @taratorio
- execution/stagedsync: handle sync loop block limit exhaustion (#16268) by @taratorio
- RPC: Apply batch limit to WebSocket/IPC connections (#16255) by @grandchildrice
- RPC: Estimate gas align to geth (#16397) by @lupin012
- snapshotsync: add support for
--snap.download.to.block(#16938) by @taratorio
New features
- Complete Fusaka implementation (#16183, #16185, #16186, #16187, #16184, #16391, #16401, #16207, #16420, #16428, #16494, #16457, #16644, #16928, #16945, #17060, #16989, #17076, #17169) by @taratorio, @yperbasis, @Giulio2002 and @domiwei
- Implement eth/69 (#15279, #17186, #17171) by @shohamc1
- RPC: implement new eth_config spec (#16218, #16410) by @taratorio
- RPC: impl admin_RemovePeer (#16292) by @lupin012
Full Changelog: https://github.com/erigontech/erigon/compare/v3.1.0...v3.2.0