# Reth — EIP-7928 Block-Level Access Lists

**Result: no spec-conformance candidate found.** This is a public-page source review, not an execution run. I found no place where the pinned Reth path demonstrably produces a result different from the pinned EELS rule. EIP-7928 is not treated as live Ethereum mainnet code in this review: the public fork source describes Amsterdam as an unscheduled/upcoming fork and the test tracker describes Glamsterdam devnets.

## Pins and spec version

- Reth default branch (`main`), read 2026-10-27: `e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c`.
- Execution-specs default branch (`forks/bogota`), read 2026-10-27: `7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b`.
- EELS package/spec version at that execution-specs pin: **2.19.0** (`src/ethereum/__init__.py`). The Amsterdam fork manifest at this pin lists EIP-7928 among its changes. The reference file requested by the brief is therefore cited at the immutable `7f2f4c9...` revision below.
- EIP text: [EIP-7928](https://eips.ethereum.org/EIPS/eip-7928).

## Candidate sections

None. No candidate reached the threshold of a concrete output difference, so the six-part candidate template (spec quotation, Reth quotation, trigger condition, other-client comparison, confidence, severity) has no instance to report. In particular, I found no candidate for any of the requested boundary cases: destroyed/recreated storage, maximum nonce, zero-value or self transfers, scalar encoding, header hash, system calls/withdrawals, or the fork-transition block.

### Known-check for the negative result

**Not found** for a Reth consensus/spec bug in the requested rules. Queries run against public pages:

- Reth GitHub issues and PRs: `repo:paradigmxyz/reth EIP-7928`, `repo:paradigmxyz/reth BAL`, and `repo:paradigmxyz/reth block access list`; reviewed the returned open/closed issue and PR titles, including #18253, #26696, #27485, #27607, #27878, #28025, and #28028.
- Hive: opened the public [Hive Results dashboard](https://hive.ethpandaops.io/) and searched the visible Glamsterdam/BAL result surface; no attributable Reth/spec behavior was available from the page.
- Execution-specs test-release tracking: opened [glamsterdam-devnet@v6.0.1, #3001](https://github.com/ethereum/execution-specs/issues/3001) and searched its EIP/test references for `7928`, `BAL`, `Reth`, `nonce`, `withdrawal`, `system`, and `encoding`; this tracker says there were no new EIPs in that release and contains no matching Reth BAL defect. I also checked the [EIP-7928 implementation tracker, #1878](https://github.com/ethereum/execution-specs/issues/1878).

This negative check does not claim that unrelated Reth BAL storage, performance, RPC, or buffering issues do not exist; those are outside the requested spec-conformance conditions.

## Spec rules checked and found correctly implemented

The quotes below are the normative/defining text checked. Reth line links are all pinned to `e0378eb...`; EELS links are all pinned to `7f2f4c9...`.

1. **Deterministic account/slot/change ordering and deduplication.** EIP text: “Accounts: Lexicographic by address” and “storage_changes: Slots by storage key value (ascending); within each slot, changes by block access index (ascending)” ([EIP-7928 ordering](https://eips.ethereum.org/EIPS/eip-7928#ordering-uniqueness-and-determinism)). EELS implements the corresponding sorted build and uniqueness behavior at [block_access_lists.py#L625-L687](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py#L625-L687). Reth enables the builder and returns its canonical `BlockAccessList` through [executor.rs#L241-L248](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L241-L248), and uses the canonical builder output at [executor.rs#L391-L396](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L391-L396). The BAL builder/encoding type is the pinned `alloy-eip7928` dependency, not duplicated Reth logic.

2. **Storage read versus write, including a slot written back to its starting value.** EIP text: “Storage slots that are both read and written MUST appear only in `storage_changes`.” ([EIP-7928 recording semantics](https://eips.ethereum.org/EIPS/eip-7928#recording-semantics-by-change-type)). EELS explicitly drops a same-index write restored to the index-start value and adds accumulated reads at [block_access_lists.py#L516-L562](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py#L516-L562) and [#L813-L824](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py#L813-L824). Reth’s executor feeds the transaction and block state through the builder before finalizing at [executor.rs#L402-L446](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L402-L446). No Reth-specific destroyed/recreated-account exception was visible in the client layer that could override this state-tracker behavior.

3. **Index assignment.** EIP text: “BlockAccessIndex = uint32 # BlockAccessIndex (0 for pre-execution, 1..n for transactions, n+1 for post-execution)” ([EIP-7928 RLP structures](https://eips.ethereum.org/EIPS/eip-7928#rlp-data-structures)). EELS documents the same caller contract at [block_access_lists.py#L285-L292](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py#L285-L292). Reth computes transaction index as receipt count + 1 at [executor.rs#L190-L195](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L190-L195), resets the builder for a block at [executor.rs#L241-L244](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L241-L244), and sets the post-execution index before system/withdrawal processing at [executor.rs#L399-L420](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L399-L420).

4. **Balance and nonce changes are post-state values and are recorded only when changed.** EIP text: “BalanceChange = [block_access_index, post_balance]” and “NonceChange = [block_access_index, new_nonce]” ([EIP-7928 RLP structures](https://eips.ethereum.org/EIPS/eip-7928#rlp-data-structures)); the edge-case section also requires transaction sender/recipient inclusion for zero-value transfers ([EIP-7928 scope](https://eips.ethereum.org/EIPS/eip-7928#scope-and-inclusion)). EELS compares index-start and post-account values at [block_access_lists.py#L765-L799](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py#L765-L799). Reth’s transaction index is installed before both commit and detached-commit execution at [executor.rs#L306-L340](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L306-L340) and [executor.rs#L343-L384](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L343-L384). I found no Reth arithmetic or boundary conversion in this layer that changes max-`uint64` nonce or zero balances.

5. **RLP scalar shape and rejection path.** EIP text: “The BAL is RLP-encoded as a list of `AccountChanges`” and defines `Nonce = uint64`, `Balance = uint256`, `StorageKey = uint256` ([EIP-7928 RLP structures](https://eips.ethereum.org/EIPS/eip-7928#rlp-data-structures)). Reth converts an authenticated decoded BAL with a fallible conversion, propagating failure as block execution error at [executor.rs#L224-L228](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L224-L228). The wire wrapper rejects non-list and malformed nested BAL entries at [block_access_lists.rs#L54-L86](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/net/eth-wire-types/src/block_access_lists.rs#L54-L86), and its tests explicitly reject non-list entries at [#L209-L225](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/net/eth-wire-types/src/block_access_lists.rs#L209-L225). The scalar canonical/minimal checks reside in the pinned `alloy-eip7928`/`alloy-rlp` decoder invoked by this conversion; no contrary Reth acceptance path was found.

6. **Header hash and empty BAL.** EIP text: “`block_access_list_hash`, which contains the Keccak-256 hash of the RLP-encoded block access list” and an empty BAL encodes as `0xc0` ([EIP-7928 block structure](https://eips.ethereum.org/EIPS/eip-7928#block-structure-modification)). Reth initializes the Amsterdam-at-genesis header field to `EMPTY_BLOCK_ACCESS_LIST_HASH` at [spec.rs#L78-L82](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/chainspec/src/spec.rs#L78-L82), and the execution path returns the built BAL after post-execution at [executor.rs#L446-L463](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L446-L463). The authenticated execution path compares rebuilt and received BAL hashes in [bal/execute.rs#L193-L205](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/engine/tree/src/tree/payload_processor/bal/execute.rs#L193-L205). No hash mismatch candidate was found.

7. **System calls, withdrawals, and fork transition.** EIP text: “System contract addresses accessed during pre/post-execution” and “Withdrawal recipient addresses, regardless of whether the withdrawal amount is non-zero” ([EIP-7928 scope](https://eips.ethereum.org/EIPS/eip-7928#scope-and-inclusion)). Reth runs pre-execution changes after builder activation in [payload/src/lib.rs#L190-L239](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/payload/src/lib.rs#L190-L239), and its finalization runs post-execution system calls followed by withdrawals before taking the BAL at [executor.rs#L402-L446](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L402-L446). The builder is enabled only when the timestamp activates Amsterdam at [payload/src/lib.rs#L190-L222](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/payload/src/lib.rs#L190-L222). No transition-block off-by-one or omission was demonstrated.

## URLs read

- https://eips.ethereum.org/EIPS/eip-7928
- https://github.com/paradigmxyz/reth/tree/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c
- https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs
- https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/payload/src/lib.rs
- https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/chainspec/src/spec.rs
- https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/engine/tree/src/tree/payload_processor/bal/execute.rs
- https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/net/eth-wire-types/src/block_access_lists.rs
- https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/block_access_lists.py
- https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/__init__.py
- https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/__init__.py
- https://github.com/ethereum/execution-specs/issues/1878
- https://github.com/ethereum/execution-specs/issues/3001
- https://github.com/ethereum/execution-specs/releases
- https://hive.ethpandaops.io/
- https://github.com/paradigmxyz/reth/issues/18253
- https://github.com/paradigmxyz/reth/issues?q=is%3Aissue+EIP-7928
- https://github.com/paradigmxyz/reth/pulls?q=is%3Apr+EIP-7928
- https://api.github.com/repos/paradigmxyz/reth/commits/main
- https://api.github.com/repos/ethereum/execution-specs/commits/forks/bogota
