Erigon v3.8.0 — Watery Whiskers
Erigon 3.8.0 is Glamsterdam-ready, with Glamsterdam on Hoodi, faster commitment and execution,
and further RPC performance improvements. It also improves Caplin block production, recovery after restarts,
and resilience under heavy RPC and peer traffic.
Highlights
- Glamsterdam-ready. Erigon and Caplin support Amsterdam and Gloas, including block access lists
(EIP-7928) and enshrined proposer-builder separation (EIP-7732). Caplin followsconsensus-specs
v1.7.0-beta.4 for the Hoodi upgrade (#24831) — by @domiwei, @taratorio, @yperbasis - Glamsterdam on Hoodi. Upgrade Hoodi nodes before 26 October 2026, 17:42:48 UTC. Amsterdam in
the execution layer and Gloas in Caplin activate at epoch132352, with a default gas-limit target of
200 million (#24847) — by @yperbasis - Faster commitment and execution. Parallel commitment spreads deferred writes across workers and
prepares trie updates alongside execution. Trie prefetching now also benefits blocks without block
access lists. EVM improvements reduce computation and repeated storage-read costs
(#23979, #24252, #24479, #24517, #22993) — by @awskii, @AskAlexSharov - Faster RPC with less memory overhead. Lower
eth_getBalancetail latency under load, cheaper
transaction-by-index queries, streamed trace output, and restored state caching for embedded RPC at
the chain tip (#24795, #24409, #24239, #24347, #24497) — by @AskAlexSharov
Breaking Changes
- Batched database syncing is now the default. This reduces disk-flush pauses. A power loss can
roll back recent unflushed commits; set--db.safe.nosync=falsefor
per-commit durability (#24249, #24953) — by @AskAlexSharov, @awskii - Caplin QUIC port changes. The default moves from UDP
4001in v3.7.1 to UDP4002. Update firewall
and container port mappings, or set--caplin.discovery.quicportexplicitly (--sentinel.quic.port
for standalone Caplin). New--caplin.quic.disableand--sentinel.quic.disableflags disable QUIC
while keeping TCP; discovery still needs its UDP port (#24443) — by @lystopad - Upgrade standalone rpcdaemon together with Erigon. The private ETHBACKEND API is now version 4.2
(#23777) — by @yperbasis - No cleartext HTTP/2 on the RPC port. The plain HTTP RPC endpoint serves HTTP/1.1; HTTP/2 requires
TLS (--https.enabled). Clients and proxies using HTTP/2 with prior knowledge or an h2c upstream
must switch to HTTP/1.1 or HTTPS (#24111) — by @AskAlexSharov - Nonstandard Engine API methods removed. The authenticated endpoint no longer exposes
engine_start,engine_setConsuming,engine_setBeaconChainConfig,engine_handleNewPayload,
engine_handleForkChoice, orengine_sSZRESTHandler. These methods now return-32601; integrations
must use supported Engine API methods (#24163) — by @lupin012 - RPC access controls apply more widely.
--rpc.accessListnow covers WebSocket, IPC, and
subscriptions; allow lists must name the required subscribe methods. WebSocket and IPC batches obey
--rpc.batch.concurrency. Browser WebSocket origins now follow--http.corsdomain, and GraphQL
follows the HTTP host, CORS, request-size, and concurrency limits. Add your browser origins and
GraphQL hostname to--http.corsdomainand--http.vhosts, respectively. Cross-site GET RPC checks
depend on browser metadata and do not replace network access controls (#24190, #24485, #24487, #24744) — by
@AskAlexSharov, @Bruce039, @kriss39, @lupin012 - RPC resource limits. The default caps are 10,000 live filters and subscriptions across clients,
and 1,024 subscriptions per WebSocket or IPC connection. Requests above these caps return-32005;
configure--rpc.subscription.filters.maxsubscriptionsand--rpc.subscription.limit, or set either
to0to disable that cap. A shared request-memory budget can also reject large concurrent requests
with HTTP503or close their WebSocket connection (#24734, #24735, #24737) — by @yperbasis - Receipt subscriptions group receipts by block.
eth_subscribe("transactionReceipts")now batches
matching receipts from one block into the notification'sresultarray. Consumers must process
every array element instead of assuming one receipt per notification (#24179) — by @AskAlexSharov - Pending transaction gas prices. For pool transactions of types 2, 3, and 4,
gasPricenow equals
maxFeePerGas.eth_getTransactionByHash,txpool_content, andtxpool_contentFrompreviously
reported a projected effective price; fullnewPendingTransactionsnotifications omitted the field
(#24099) — by @lupin012 trace_filterdefaults and selection. Omitted block bounds now meanlatest; specify
fromBlock: "earliest"for a query starting at genesis. When both address lists are set, the default
is intersection; usemode: "union"for the previous behavior. Block bounds accept numbers or tags;
use the newblockHashfield to select one canonical block by hash. Invalid modes, unknown fields,
reversed ranges, and bounds beyond the head are rejected
(#24255, #24334, #24341, #24357, #24435, #24706) — by @banteg, @lupin012- Tracing uses transaction-like fees and validation.
trace_callandtrace_callManynow follow
eth_callfee handling and the block's gas limit: priced calls charge the sender, while unpriced
calls run free.trace_rawTransactioncharges gas and validates the transaction against the latest
state, including its nonce and balance. A gas limit above--rpc.gascapis rejected with-38026;
a cap of0disables this limit. Usetrace_replayTransactionfor already-mined transactions.
Failed trace frames use Parity-style error labels, and reverted contract creation returns
{gasUsed, output}instead of an address and code
(#24330, #24343, #24328, #24329, #24352, #24356, #24355, #24564) — by @lupin012, @banteg - Tracing error codes.
trace_blockandtrace_replayBlockTransactionsreturn-32001for
unknown blocks instead of-32000. Tracing methods that rejectpendingnow return-32602
instead of-32000. Unknown trace types and malformedtrace_rawTransactioninput also return
-32602instead of-32000. Clients that match these error codes must update
(#24598, #24345, #24872, #24768) — by @lupin012, @banteg - Stricter call inputs. Call, simulation, and tracing APIs reject differing
dataandinput
fields and EIP-1559 fee fields before London. Call and trace methods also reject achainIdthat
differs from the node's chain (#24336, #24536, #24414, #24351) — by @banteg, @lupin012 - Caplin peer limits. Connections are capped per IPv4 and IPv6 network range to limit peer
concentration. Operators with many peers in one range can configure
--caplin.ip-block-limits.trusted-cidrsor--caplin.ip-block-limits.disable
(#24815, #24922) — by @lystopad - Beacon health checks.
/eth/v1/node/healthand/return HTTP206while syncing. Health checks
that require200should accept206or use?syncing_status=200(#24719) — by @Bruce039 - RPC connectivity checks.
net_listeningnow returnstrueeven when sentries are unreachable.
Do not use it alone to check peer connectivity (#24773) — by @lupin012
Added and Changed
RPC
- After Amsterdam,
eth_calland other read-only call simulations can use their full RPC gas
allowance instead of being capped at2^24execution gas.eth_estimateGas,eth_createAccessList,
and validatedeth_simulateV1enforce transaction gas rules instead of producing unusable results
(#24520) — by @Sahil-4555 eth_fillTransactionbuilds blob sidecars, computes missing KZG commitments and proofs, and
validates supplied ones.txpool_inspectadds a readable summary of pending and queued non-blob
transactions (#24335, #24738) — by @lupin012- The Engine API adds
engine_getInclusionListV1and its REST-SSZ equivalent to build FOCIL inclusion
lists from the public mempool (#24693) — by @SoarinSkySagar eth_simulateV1returnsblockAccessListHashafter Amsterdam and accounts for execution gas and
state gas separately. Fixes address lost code and ignored empty-storage overrides between simulated
blocks, and historical state-root replay follows the simulated chain instead of later canonical blocks.
Simulated blocks advanceslotNumber, applyblockOverrides.withdrawals, and avoid duplicate
EIP-7708 transfer logs (#24740, #24276, #24749, #24748, #24402) — by @MysticRyuujin, @Sahil-4555- Tracers report EIP-8037 execution and state gas, including negative state-gas costs when storage is
cleared (#24240, #24370) — by @taratorio vmTracereports only operations that executed, removing syntheticSTOPinstructions and
operations rejected before execution. Operations that halt exceptionally reportex: null
(#24344) — by @bantegtrace_callManyapplies state overrides across the bundle, including full storage replacements and
moved precompiles.eth_createAccessListandeth_callManyalso honor precompile overrides
(#24567, #24739) — by @lupin012, @pucedotetheth_sendRawTransactionSyncfinds receipts even when a transaction is mined before its subscription
becomes active or during a receipt-stream reconnect, avoiding unnecessary timeouts
(#24134, #24337) — by @lupin012eth_getRawTransactionByHashreturns pending transactions from the pool instead ofnull
(#24463) — by @0xShadowX- Log filters with only wildcard topics now receive matching logs instead of silently receiving
nothing (#24459) — by @FlashWayne - Requests using
pending, such aseth_getBalance,eth_estimateGas, andeth_callBundle, now
use the latest executed block while a node builds a payload, avoidingblock N+1 is not executed
errors. RPCs reading committed data also resolvelatestagainst the same view, avoiding missing
results while a newer block awaits commit (#24090) — by @Sahil-4555 ots_hasCodereports code at the end of the requested block, so contracts are visible in their
deployment block, matchingeth_getCode(#24223) — by @Sahil-4555- Block transaction counts remain available when transaction payloads are pruned. Witness and
Otterscan replay methods check the history they need before attempting execution (#23777) — by @yperbasis
Consensus layer and execution
- Caplin fixes Gloas block and payload publication, restores the served head and payload status after
restarts, and avoids restart stalls caused by incorrect finality handling
(#24545, #24548, #24628) — by @domiwei - Caplin validates gossip blocks faster, reducing the delay before new blocks can become the head
(#24523) — by @lystopad - Caplin avoids a deadlock when publishing its own block and reduces payload-build delays from a busy
execution layer or late payload preparation (#25019, #25005, #25043) — by @domiwei, @lystopad - Validator nodes verify and relay aggregates outside their proposal epochs. Attestation and Payload
Timeliness Committee (PTC) gossip budgets accommodate expected traffic and vote bursts, preventing
valid votes from being dropped. Gossip attestations and aggregates received before their block are
kept in bounded queues for about one slot and retried when the block arrives
(#25042, #25000, #24981, #24949) — by @lystopad, @domiwei - Caplin selects the sync committee using the message or contribution slot, preventing valid messages
from being rejected and peers from being banned at period boundaries (#25067) — by @lystopad - Caplin fixes gossip timing checks that discarded valid late blocks and sync committee messages near
slot boundaries. Signature checks for sync committee messages from before a fork use the correct domain
after the head crosses the fork, avoiding incorrect peer bans (#24489) — by @lystopad - Caplin accepts SSZ submissions at
POST /eth/v2/validator/aggregate_and_proofs, restoring aggregate
publication for Prysm validator clients (#24927) — by @domiwei - Proposed blocks include locally aggregated attestations and select additional votes by proposer
reward, with lower memory use. The aggregation pool counts each committee member's vote once
(#24813, #24566, #24955, #24798) — by @lystopad - On Gnosis and Chiado, Caplin uses a 1,666 ms pre-Gloas block-timeliness cutoff to determine proposer
boost, replacing the effective 2,000 ms cutoff (#24875) — by @domiwei - Standalone Caplin reconstructs pre-Gloas beacon blocks with the matching execution body, preventing
incorrect block responses and peer bans when serving blocks from competing forks (#25021) — by @domiwei - Fulu column sidecars use the correct inclusion proof layout, including older columns served from
disk, avoiding peer rejections and bans. Fulu gossip blocks wait for custody columns before entering
fork choice (#24512, #24546) — by @domiwei - Caplin subscribes to persistent attestation subnets and preserves advertised subnet membership
across fork transitions, improving attestation gossip reliability (#25052) — by @domiwei - Transient handshake failures no longer ban incoming peers, Status and Goodbye limits recover more
quickly, and fork advertisements use the correct version at BPO upgrades
(#24627, #24406) — by @domiwei, @MysticRyuujin - Gloas block production honors the fee recipient in signed proposer preferences. Caplin refuses
validator duties on a stale served head and checks selected attestations against the proposal state,
preventing invalid proposals after reorgs that change committee assignments (#24937, #24829, #24959) — by
@yperbasis, @lystopad - Duty responses use the correct dependent root after empty slots, preventing false duty-reorg
notifications and rejected proposer preferences (#24995) — by @domiwei - Caplin accepts valid proposer slashings and checks pre-Gloas payload withdrawals before importing
or signing blocks. Fork choice uses the target checkpoint's committees for attestations in imported
blocks (#24846, #24803, #24807) — by @domiwei, @yperbasis - Missing custody columns are fetched within the slot instead of waiting over a minute. Parallel blob
recovery reduces delays before blocks reach fork choice and execution. Peers returning no columns
are briefly skipped to avoid repeated empty requests (#24830, #24861, #24996) — by @lystopad, @domiwei - Parallel execution fixes balance, nonce, and storage handling after account destruction, recreation,
and reverted calls, preventing wrong state roots and rejection of valid blocks. Amsterdam account
existence checks remain consistent during parallel execution
(#24705, #24653, #24654, #24742, #24866, #24701, #25057) — by @chfast, @yperbasis - On chains with a configured burnt-fee recipient, parallel execution credits both the tip and burnt
fee when that recipient is also the block beneficiary, preventing wrong state roots (#24879) — by @chfast - Execution fixes stale commitment reads after reorgs and recovery from invalid blocks. Nodes using
external consensus clients resume sync after restarts when invalid-header removal left a gap.
Fork-choice updates preserve safe and finalized hashes even when the head does not move
(#24731, #24836, #24865, #24032) — by @Sahil-4555, @AskAlexSharov, @awskii, @yperbasis - Fixes deadlocks and pruning stalls that could stop block execution
(#24591) — by @taratorio - A rejected transaction replacement no longer removes the original transaction from the pool,
including during reorg recovery (#24534) — by @Bruce039
Operations
- Caplin validator nodes subscribed to many attestation subnets may use more CPU because they now
verify attestations previously dropped by the gossip limit. Allow CPU headroom for this additional
work, especially with--caplin.subscribe-all-topics(#25000) — by @domiwei - The default RPC block cache limit grows to 512 MiB, from 160 MiB for embedded RPC and remote
rpcdaemon, or 32 MiB for rpcdaemon with--datadir. SetRPC_BLOCK_CACHEto adjust the memory budget
(#24120) — by @AskAlexSharov - Memory sizing honors cgroup v1 limits in hybrid cgroup setups instead of sizing caches from host RAM
(#24885) — by @AskAlexSharov - An empty
seg rm-state-snapshots --step=N+range no longer selects every state snapshot for deletion,
including whenNis the latest available step (#24796) — by @joxerx - Gnosis and Chiado retain and serve data columns for 16,384 epochs, about 15 days, instead of 4,096
epochs. Operators should allow for roughly four times the column storage. Leave
--caplin.columns-keep-slotsat0to follow this window; an explicit value overrides pruning
retention and may delete columns the node still needs to serve (#24720) — by @Bruce039
Security
- Network decoders allocate buffers as data arrives and reject impossible compressed sizes. Tighter
bounds on peer queues, transaction packets, and Caplin gossip control messages reduce memory
exhaustion risks from hostile traffic (#24374, #24649, #24648, #24392, #24508, #24616) — by
@yperbasis, @AskAlexSharov - RPC rejects oversized transactions before decoding. Caplin bounds SSZ committee vectors and
rejects invalid validator and slashing indices, preventing excessive allocations and panics.
Invalid block access list indices are rejected before execution. The Engine API rejects null
withdrawal entries before hashing or building blocks
(#24315, #24614, #24615, #24771, #24908, #24650) — by @yperbasis, @domiwei - Caplin verifies signatures before forwarding attestations, aggregates, voluntary exits, and
BLS-to-execution changes. Attestations and aggregates use the correct fork's signing domain and
gossip topic, preventing invalid relays and rejection of valid messages near upgrades
(#24629, #24544) — by @domiwei - A peer sending a blob transaction with a bad KZG proof no longer causes valid transactions from
other peers in the same batch to be dropped
(#24535) — by @FlashWayne, @yperbasis
Full Changelog: v3.7.1...v3.8.0