Skip to content

rust!: update reth to v2.5.2 with Engine handoff backport - #22495

Merged
sebastianst merged 19 commits into
developfrom
seb/reth-v2.5.0
Sep 24, 2026
Merged

sebastianst merged 19 commits into
developfrom
seb/reth-v2.5.0

Conversation

@sebastianst

@sebastianst sebastianst commented Aug 19, 2026 •

Copy link
Copy Markdown
Member

Stacked on #22946, which pins deposit-gas parity before this dependency update.

Updates OP's execution client without accepting the Engine API stall in an unpatched release. Once disk persistence completes while a payload worker still holds an overlay lease, the release-only pin can stop serving forkchoice and new-payload requests until that worker finishes.

The pin now uses ethereum-optimism/reth:optimism at 0fbe428: the selected release, upstream #26708, and one squashed CI maintenance commit. The old op-rs state-root-receiver patch is already upstream; the new handoff backport is not in the selected release. An upstream main-branch merge is not sufficient evidence to drop it.

Behavior and operator impact

The bump corrects finalize-on-error journal cleanup and destroyed-account storage-wipe handling while preserving deposit gas-cap exemptions and pre-Regolith refund semantics. debug_executePayload additionally returns ancestor headers. The SP1 guest retains accelerated SHA-256 coverage for both dependency lines.

BREAKING CHANGE: operators using --engine.sparse-trie-max-hot-slots, its --engine.sparse-trie-max-storage-tries alias, or --engine.sparse-trie-max-hot-accounts must remove those flags from launch configuration. The persistence threshold default rises from 2 to 7. --engine.memory-block-buffer-target no longer shows a CLI default: its effective value is min(persistence threshold, 5), so with the new default threshold it changes from 0 to 5 blocks kept in memory; pass --engine.memory-block-buffer-target 0 to keep the old behaviour. testing_buildBlockV1 no longer skips invalid transactions by default. To retain prior configurable defaults, set persistence/buffer options explicitly and pass --testing.skip-invalid-transactions.

The published CLI reference deliberately stays at its finalized manifest release, per the generator contract; it must not be regenerated from this unreleased branch. The checked-in CLI surface snapshot covers this branch's interface.

The fork and OP lockfiles also take the approved TLS security fixes rather than advisory exceptions. The fork's compact compatibility check uses the selected release commit (upstream tags are not mirrored), while PR and merge-queue comparisons retain their actual base. CI support remains one replayable commit.

Deliberate limitation

This is a temporary responsiveness fix, not a persistence-fairness or bounded-memory guarantee. Upstream #26710 still applies: endless overlapping builds or a hung worker can prevent the active-build tracker from draining, stopping persistence and allowing memory to grow. The regression exercises finite overlapping OP builds, cancellation and post-drain catch-up; it does not cover perpetual overlap, deadline expiry, reorg/backfill or crash/restart durability. Backfill actions that arrive while a payload job, persistence run or handoff is active are dropped until the next sync trigger, as in upstream v2.5.2 (reth#26559); reth#26911 replaces that with pending revalidation and arrives with the v2.6.0 bump that follows this PR.

Batched validator forwarding, SystemCallCommitEvm, and sender-recovery-cache integration remain outside this change.

Review fixes from the change-driven bump review

Five reviewers went over every reth, revm, alloy and alloy-evm change this bump pulls in (not just the tagged mirrors). Fixed here:

  • debug_executionWitness in the historical-proofs override now takes BlockId like upstream, so installing the ExEx no longer narrows the method to a number or tag. The proofs state factory rejects a hash that names a non-canonical block (the proofs storage is canonical-only and overlaid by number), and the witness selects its parent state by parent hash like upstream.
  • eth_getMultiProof (new upstream method, installed by default on the core and auth EthApi) is removed from every OP node's served surface rather than maintained in the historical proofs override: no OP user has asked for it, and a proofs-history node cannot answer it consistently from live state. It comes back when there is a user (op-reth: eth_getMultiProof is deliberately not served #22990). The override trait is tagged as a mirror of EthApi's proof methods.
  • OpReceiptEnvelope and OpReceipt deliberately do not adopt alloy 2.4's missing-type legacy fallback (fix(consensus): default missing receipt type to legacy alloy-rs/alloy#4107, for Geth-derived chains that omit the field; no OP client does): the derives stay, a receipt without type is rejected, and the mirror tags record the divergence.
  • UPSTREAM-MIRROR tags for the alloy-family copies (OpReceiptEnvelope, OpReceipt, OpExecutionPayload); the checker now narrows a crate resolved at several incompatible versions to the range rust/Cargo.toml asks for before reporting ambiguous-version.
  • Operator-fee refund uses saturating_sub for gas used, since revm 42 can credit remaining from the reservoir after the fact.
  • Destroyed-account storage zeroing in the proofs provider and the buffered overlay is pinned by focused tests on both stores (untouched persisted slot, buffer-only slot, destroy-and-recreate, create-and-destroy, cursor error propagation); the provider test module now also runs under --all-features.

Follow-ups filed instead of widening this PR: #22969 (eth_simulateV1 ignores the EIP-7825 cap on OP chains), #22970 (seal the in-flight payload on getPayload), #22971 (deposit gas-cap exemption in OpHandler::tx_gas), #22972 (OP engine defaults, deployment flag audit, sender-recovery cache), #22973 (evidence gaps: arkworks 0.6 vectors, c-kzg transmute, hasher ordering, kona V2 payload test, receipt-strictness tests, trace-by-index, witness rollout ordering).

Verification

Check Result
Workspace type-check (--workspace --tests --locked) and op-reth binary build Pass
Workspace Clippy (--all-features --all-targets, warnings denied) Pass
Workspace runtime tests, excluding proposer and online-filtered tests 2,909 passed; 11 skipped
Proposer runtime tests, all features, serial execution 232 passed
Real OP deferred-handoff regression Unpatched release fails with the expected FCU stall; final patched node passes, including finite overlap/cancellation and persistence catch-up
Production-profile bounded-stack beacon blob parser Pass
Doctests, strict rustdoc, no_std, formatting and mirror checks Pass
SP1 guest precompile-patch, lock, lint-configuration and formatting checks Pass
Complete all-features cargo-deny checks Pass in both the fork and OP workspaces

The local all-features runtime tests use the author-approved TRACY_NO_INVARIANT_CHECK=1 workaround because this VM does not advertise invariant TSC support. No repository or production default changes; these runs are not profiling evidence. Actual CLI smoke checks confirm removed flags are rejected and supported explicit persistence/buffer/testing options still parse.

Not run locally: Go acceptance/devnet suites or SP1 guest ELF build/execution/lint. The guest checks above cover metadata and formatting, not guest execution.

Accepted inherited CI failure: the fork's ef-tests::valid_blocks exceeds its unchanged 60-second timeout on all three attempts. Current job 993 matches pre-reset job 770 at the original fork tip. The EF/execution/storage code is unchanged by this backport. The author approved documenting this separately rather than skipping cases or increasing the test budget: 28 fork checks pass, one times out, and the aggregate reth-act check remains failed.

Closes #22890

🤖 Co-created with Claude Opus 5 and Claude Fable 5.1

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8

@opgitgovernance

Copy link
Copy Markdown
Contributor

This pr has been automatically marked as stale and will be closed in 5 days if no updates

@opgitgovernance opgitgovernance added S-stale Status: Will be closed unless there is activity and removed S-stale Status: Will be closed unless there is activity labels Sep 2, 2026
@wiz-0f98cca50a

wiz-0f98cca50a Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Wiz Scan Summary

Scanner Findings
Vulnerability Finding Vulnerabilities -
Data Finding Sensitive Data -
Secret Finding Secrets -
IaC Misconfiguration IaC Misconfigurations -
SAST Finding SAST Findings -
Software Management Finding Software Management Findings -
Total -

View scan details in Wiz

To detect these findings earlier in the dev lifecycle, try the Wiz Code extension for VS Code, JetBrains, or Visual Studio.

@sebastianst
sebastianst changed the base branch from develop to seb/upstream-mirror-tags September 14, 2026 12:15
@sebastianst
sebastianst added this pull request to stack #22889 September 14, 2026 12:15
@sebastianst sebastianst changed the title rust: update reth to v2.5.0 and drop the op-rs fork rust: update reth to v2.5.2 and drop the op-rs fork Sep 14, 2026
@sebastianst sebastianst changed the title rust: update reth to v2.5.2 and drop the op-rs fork rust!: update reth to v2.5.2 with Engine handoff backport Sep 15, 2026
Comment thread rust/op-reth/crates/cli/tests/snapshots/cli.snap
Comment thread rust/op-reth/crates/cli/tests/snapshots/cli.snap
sebastianst and others added 19 commits September 24, 2026 10:45
Move the reth pin from the OP fork `op-rs/reth@aef8d3ef` back to upstream
`paradigmxyz/reth`, `tag = "v2.5.0"`. The fork's only cherry-pick
(`aef8d3ef92 feat(trie): expose payload state root receiver`) is byte-identical
to upstream `92cf59e2be`, which v2.5.0 contains, so the fork carries nothing
unique any more.

Shared crates.io versions synced to what v2.5.0 pins: revm 41.0.0 -> 42.0.1
(subcrates 42.0.0), revm-inspectors 0.41 -> 0.42, alloy-evm 0.37.0 -> 0.38.0,
alloy core 1.6.0 -> 1.6.1, the alloy main family 2.1.1 -> 2.3.0, and the
published reth-core crates 0.5.0 -> 0.6.0. All four lockfiles refreshed.

Upstream API adaptations:

- revm 42 reworks the `Handler` gas pipeline around `GasTracker` and the
  EIP-2780 runtime gas phase. `OpHandler::last_frame_result` is re-derived
  against the new default: the frame is settled with upstream's
  `handle_reservoir_remaining_gas`, and the pre-Regolith deposit rules are
  applied on top of the settled result. `refund` now returns `Result` and
  reads the refund quotient from `GasParams`.
- op-revm's `ExecuteEvm::replay` copy picked up upstream's new error path,
  which finalizes the journal so a failed transaction does not leak into the
  next one. This is the same class as the SDM warm-set leak (#21723).
- reth no longer derives `HashedStorage::wiped` from the account status in
  `from_bundle_state`; `HashedPostStateProvider::hashed_post_state` owns the
  destroyed-account handling and now returns `ProviderResult`. The Isthmus
  withdrawals-root path builds its `HashedStorage` directly, so it keeps
  propagating `wiped` explicitly; `OpProofsStateProviderRef` materializes the
  zeroed slots against the proofs storage at the parent block.
- `ExecutionWitnessRecord` became a borrow of `State<DB>` whose only public
  exit is `into_execution_witness`, which also fills in ancestor headers. Both
  op-reth witness paths use it; the payload-builder witness therefore gained a
  headers provider and now returns headers as `debug_executionWitness` already
  did.
- `ReceiptConverter` gained `RpcLog`/`convert_log` and the log-matching helpers
  now convert through it, so the flashblock log stream passes the converter and
  a header carrying the payload's number, hash and timestamp.
- Smaller: `reth_trie_db::from_reverts_auto` -> `HashedPostStateSorted::from_reverts`,
  `ChangesetCache` -> `reth_storage_overlay::OverlayManager`,
  `BuiltPayloadExecutedBlock::changed_paths` and
  `BuildNewPayload::{cache,state_root_handle}` removed,
  `validate_block_post_execution_with_hashed_state` gained a parent header,
  `calculate_initial_tx_gas` gained an EIP-2780 argument, and
  `alloy_genesis::ChainConfig` gained `bogota_time`.

kona-proof declares `ark-bls12-381`'s `scalar_field` feature explicitly: it
used to arrive by feature unification with revm-precompile, which moved to
ark-bls12-381 0.6.

All 24 `UPSTREAM-MIRROR` tags re-verified against v2.5.0 / revm 42 / alloy-evm
0.38; `just mirrors --check` is clean with none stale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ver the deposit gas-cap exemption

Two follow-ups from the `reth-update-reviewer` pass over the v2.5.0 bump.

`MemoryOverlayOpProofsStateProviderRef::hashed_post_state` only forwarded to the
inner provider, which zeroes a destroyed account's storage against the
*persisted* proofs storage. Slots written by blocks still in the in-memory
buffer live in the overlay, so a selfdestructed account stayed partially wiped
and the state root came out wrong. reth hit the same gap when it stopped
deriving `HashedStorage::wiped` from account status and extended
`MemoryOverlayStateProviderRef::hashed_post_state` to zero the unpersisted
slots too; this mirrors that. The path feeds `state_root_with_updates` in the
proofs engine, so the failure mode is a spurious state-root mismatch.

`alloy-op-evm` had no positive test for the EIP-7825 deposit gas-cap
exemption — only the negative case asserting non-deposits stay capped. The
exemption is not observable as an error, because deposits skip `validate_env`
where `TxGasLimitGreaterThanCap` is raised; it is only observable in how much
gas the first frame receives, via `initial_gas_and_reservoir`, which OP does
not override. The new tests measure that: a deposit above the cap runs a
payload costing more than the capped budget and must still complete, and the
saved cap round-trips through every resting state including `None`.

Both tests were checked red against deliberately broken variants — the first
against a disabled exemption, the second against a restore path that collapses
the inner `Option`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…efund

`last_frame_result` settles the frame, then applies the Bedrock deposit rule
(gas used equals the limit, no refund), then applies upstream's EIP-2780
refundable-state-gas refill. A refill after the deposit rule would hand
regular gas back to a pre-Regolith deposit. It cannot fire today, because
the refill needs a `charged_*` flag that only EIP-2780 (Amsterdam) sets and
Bedrock maps to `SpecId::MERGE`, so no test can fail on the baseline; the
reorder makes the rule unconditional so that no upstream credit, present or
future, can undo it.

Also advances the two remaining `revm-handler@41.0.0` tags in this file,
re-verified against 42.0.1 with the rest of the handler overrides.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…oy-evm 0.38

Advances every remaining `UPSTREAM-MIRROR` tag to the versions the workspace
now resolves, each after diffing the named upstream symbol between the
recorded version and the new pin. No mirrored body needed a change: the only
upstream moves were the sender-recovery cache in `tx_iterator_for_payload`
(behaviour-equivalent, recorded in prose), the `block` argument threaded
through `transaction_receipt` (already adapted by the bump) and the journal
finalize-on-error paths in `ExecuteEvm::replay` (already adapted).

Prose corrections found on the way: `transaction_by_hash` does not
reproduce upstream's RPC-cache lookup, `build_pending_env` keeps the parent's
real beacon root where upstream zeroes it, `EthEvm` also carries the deposit
gas-cap exemption, and `withdrawals_root` says what upstream does instead of
`wiped`. The review guide's deposit `validate_env` list is re-verified at
revm 42.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…yer rejects

alloy 2.4's `Signed::fallback_decode` rejects a typed body without its type
byte before `decode_2718_canonical` runs, so the boundary tests can no longer
expect the "non-canonical" message. The property they pin is that the input
is rejected; the helper's own tests still cover its semantics.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Upstream changes visible on the op-reth command line: the engine
persistence threshold default moves from 2 to 7 and the memory block buffer
target loses its default of 0; `--testing.skip-invalid-transactions` now
defaults to false; `--engine.sparse-trie-max-hot-slots` and
`--engine.sparse-trie-max-hot-accounts` are gone; `--dev.finality-depth`,
`--engine.txpool-prewarming` and `--engine.sender-recovery-cache` are new;
peer flags accept ENRs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
revm-precompile 42 resolves sha2 0.11 next to the 0.10 line the guest
already patches, and a patch only covers the version it names, so the
SHA-256 precompile and the KZG versioned-hash check would run unaccelerated
in the zkVM. sp1-patches now publishes patch-sha2-0.11.0-sp1-6.2.0; with it,
every sha2 in the guest resolves from sp1-patches again and
check-sp1-guest-precompile-patches passes unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Moves the 71 reth crate pins in `rust/Cargo.toml` from tag `v2.5.0` to
`v2.5.2`. v2.5.0 is an ancestor of v2.5.2, so the old pin carried nothing
that the new one drops.

Shared pins are unchanged: the only difference in reth's workspace
`Cargo.toml` between the two tags is its own `version` line, so revm
42.0.1, the alloy families and the published reth-core crates stay where
they are. No shared-dependency sync was needed.

The lockfile delta is exactly the 106 reth git-source packages moving from
`tag=v2.5.0` to `tag=v2.5.2`; no other package identity changes. The SP1
guest lock re-unifies `alloy-rpc-types-eth`'s `itertools` (requirement
`>=0.13, <=0.14`) onto the 0.13.0 already present in that lock. That
workspace does not depend on reth.

All 18 reth mirror tags were re-verified before being advanced: every
upstream crate hosting a mirrored symbol — consensus/common,
ethereum/{consensus,evm,hardforks,engine-primitives,payload},
rpc/{rpc-eth-api,rpc-engine-api,rpc-api}, storage/db and transaction-pool —
is byte-identical between v2.5.0 and v2.5.2. The six frozen `port` tags are
left at their recorded versions.

No adaptation was required, and the op-reth CLI surface snapshot is
unchanged. The two upstream changes closest to op- code are consumed as-is:
`reth-provider`'s storage-wipe fix for batched persistence (op-reth's trie
store writes per block and never merges `TrieUpdatesSorted` across blocks,
so the bug class has no analogue here), and `CancelOnDrop` gaining a
cooperative finalization state (op-reth's payload builder reads only
`is_cancelled()`, whose meaning is unchanged).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Keep v2.5.2 as the release base while retaining upstream #26708 on the
ethereum-optimism/reth maintenance branch. Preserve overlay leases while
serving queued Engine requests during a deferred persistence handoff.

Exercise the actual OP node with overlapping payload workers, normal
getPayload resolution, cancellation, and persistence catch-up. Include the
remaining FPVM precompile caller in the mirror inventory and document the
release/backport and release-pinned CLI documentation boundaries.

Take the approved rustls security update and required backend patches,
without unrelated lockfile dependency-edge changes or advisory exceptions.

BREAKING CHANGE: the reth upgrade removes
--engine.sparse-trie-max-hot-slots, its
--engine.sparse-trie-max-storage-tries alias, and
--engine.sparse-trie-max-hot-accounts. Operators must remove these flags
from launch configuration. Set supported persistence/buffer options
explicitly and pass --testing.skip-invalid-transactions when retaining
their previous configurable defaults.
`revm_context_interface::Transaction` is byte-identical between 41.0.0 and
42.0.0, and `EthBuiltPayload::into_execution_data` is unchanged between
`aef8d3e` and `0fbe428`, so both tags advance without a body change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Keep the withdrawals-root calculation aligned with the MessagePasser invariant that its storage is never wiped. Record the upstream provenance of the proofs providers and the OP converter's infallible log conversion.
The historical-proofs ExEx replaces debug_executionWitness with an override
that decoded only a block number or tag, so a by-hash call that a stock node
answers failed with "Invalid params" as soon as the ExEx was installed.
Upstream's DebugApi takes a BlockId; take the same one here so the method has
a single shape either way.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
reth v2.5.2 added eth_getMultiProof to the core EthApi and to the auth
server's EngineEthApi, so every OP node started serving it by default. No OP
user has asked for the method, and a proofs-history node cannot answer it
consistently — the stock handler reads live state, which a pruned node does not
have for the blocks the override exists to cover. Rather than maintain a second
proof method with no consumer, drop it from the served surface: the add-ons
modules hook removes it from http/ws/ipc and from the auth module, for all OP
nodes including the SDM fixture, which shares these add-ons. Add it back when
there is a user.

This reverts the historical-proofs override that served it, along with its
metrics and the reth-trie-common dependency. The override's UPSTREAM-MIRROR
tag stays: it still enumerates upstream's proof methods by hand, and the next
one added upstream has to be either declared there or removed here, so that a
proofs-history node never answers a proof method from live state.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
A crate can appear in rust/Cargo.lock at several incompatible versions when an
unrelated dependency pulls an older line — alloy-consensus resolves to both
1.8.3 and 2.4.2 today. The checker reported any tag naming such a crate as
ambiguous-version, which made it impossible to tag a mirror of one at all.

Take the version from the range rust/Cargo.toml asks for, which is what our own
crates build against, and keep ambiguous-version for the cases where that still
leaves a choice.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
OpReceiptEnvelope, OpReceipt and OpExecutionPayload each reproduce an upstream
alloy type — its variant set, its 2718/RLP dispatch, its serde shape — with OP
variants added. None of that is visible as a diff when alloy moves, so record
the upstream symbol and the verified version in an UPSTREAM-MIRROR tag.

OpReceipt is tagged against ReceiptEnvelope rather than Receipt: it mirrors the
envelope's per-transaction-type payload split, holding a bare Receipt instead
of a ReceiptWithBloom, which upstream has no counterpart for.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
remaining + reservoir + refunded can exceed the gas limit — revm 42 credits
remaining from the reservoir after the fact — and the plain subtraction then
wrapped to a huge used-gas figure, which zeroed the operator fee refund (or
panicked with overflow checks on).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…tate

The proofs storage only holds canonical blocks and is overlaid by block number,
so a hash-addressed request for a block off the canonical chain got the
canonical state for that height under the live state of the fork block. The
proofs state factory now rejects a hash whose block is not the canonical one at
its number, which covers every `eth_` proof method and the witness override in
one place.

`debug_executionWitness` selects the parent state by parent hash rather than by
parent number, as upstream does, so a fork block whose parent is canonical gets
its actual parent state and a fork parent is rejected by the factory.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
… and overlay

Unit tests for `hashed_post_state` on `OpProofsStateProviderRef` (in-memory
and MDBX v2 backends) and `MemoryOverlayOpProofsStateProviderRef` cover:
untouched persisted slots of a destroyed account come back as explicit zeros,
including across several destroyed accounts sharing one cursor; slots only in
the buffered overlay come back as zeros; destroy-and-recreate keeps the
bundle's value and zeroes the other old slots; create-and-destroy does no
parent scan and zeroes nothing; a storage cursor failing to open or to seek
surfaces as an error from both providers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
@sebastianst
sebastianst added this pull request to the merge queue Sep 24, 2026
Merged via the queue into develop with commit 1cbf91a Sep 24, 2026
114 checks passed
@sebastianst
sebastianst deleted the seb/reth-v2.5.0 branch September 24, 2026 10:34
davidtaikocha added a commit to taikoxyz/alethia-reth that referenced this pull request Sep 27, 2026
Follow OP's pending reth v2.5.2 bump (ethereum-optimism/optimism#22495,
still a draft): reth-optimism-trie resolves reth inside the OP workspace,
so the reth pin must match OP's source exactly.

- reth: paradigmxyz/reth@f2eecc6 -> ethereum-optimism/reth@0fbe428
  (v2.5.2 + paradigmxyz/reth#26708 engine handoff backport)
- reth-optimism-trie: OP 4f21ce6 -> 9e26d38 (#22495 head)
- alloy 2.1 -> 2.3 (locks 2.4.2, same as OP's lock), alloy-evm 0.38,
  revm 42, reth-codecs / reth-primitives-traits 0.6
- check_reth_pin.sh: require a single reth git source (URL and rev),
  so a URL-only split (paradigmxyz vs fork) is caught too

API adaptations:
- engine validator: build_tree_validator takes an OverlayManager;
  delegate to BasicEngineValidatorBuilder so txpool prewarming (private
  to reth-node-builder) is wired like upstream
- debug witness: ExecutionWitnessRecord borrows the post-execution State
- proof-history live collector: hashed_post_state is now fallible

Behavior fix: reth v2.5's HashedPostState::from_bundle_state no longer
marks destroyed accounts' storage as wiped. execute_derived_block feeds
raiko2's stateless trie, which clears storage only on `wiped`, and
pre-Unzen forks run SHANGHAI SELFDESTRUCT semantics, so restore the flag
explicitly and cover it with a regression test.

Draft: re-pin reth-optimism-trie to OP's merge commit once #22495 lands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
davidtaikocha added a commit to taikoxyz/alethia-reth that referenced this pull request Sep 27, 2026
ethereum-optimism/optimism#22495 merged into develop on 2026-09-24 as
1cbf91ab. Move reth-optimism-trie off the unmerged PR head 9e26d38a and
onto that merge commit.

OP's reth source is the same on both sides of the merge
(ethereum-optimism/reth@0fbe428), so no reth line changes and Cargo.lock
only updates the trie package's source. Between the two revs, the
crate's non-test code differs only in comments; the rest is new tests.
develop HEAD fe0f7999 (2026-09-26) has not touched the crate,
rust/Cargo.toml, or rust/Cargo.lock since the merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

kona-sp1: revm-precompile 42 pulls sha2 0.11, which has no SP1 patch

3 participants