EIP-7928

Block-Level Access Lists

Unlock parallel transaction execution on Ethereum

From Sequential to Parallel

See how EIP-7928 transforms transaction processing

Transaction Execution Today

Tx 1
Tx 2
Tx 3
Tx 4
0s
1s
2s
3s
4s
Execution Time
Tx 1
Tx 2
Tx 3
Tx 4

Key Features

Parallel Execution

Execute multiple transactions simultaneously by knowing state dependencies upfront

🔍

State Diffs

Track state changes (incl. ETH balances) without executing transactions

🚀

Faster Sync

Reconstruct state without executing transactions using post-execution values

🛡️

Enforced at Block Level

Mandatory access lists ensure complete and accurate state dependency information

Client Implementation Progress

Track the implementation status across Ethereum clients

Geth

Implementation in progress

Nethermind

Implementation in progress

Erigon

Implementation in progress

Besu

Implementation in progress

Reth

Implementation in progress

How It Works

Block Access Lists (BALs)

Every block includes a complete record of all state interactions:

  • Addresses: Every account touched during execution
  • Storage: All slots read or written, with final values
  • Balances: Post-transaction balances for all transfers
  • Nonces: Updated nonces for EOAs and contracts
  • Code: Deployed contract bytecode

Key benefits for validators:

  • Pre-load all required state data in parallel
  • Execute independent transactions on different CPU cores
  • Update state without re-executing transactions
  • Validate blocks faster with known dependencies
  • Calculate post-state root in parallel

Cheatsheets for Validators:

  • Builders keep track of touched accounts and storage slots during execution
  • Builders create BALs and put them into blocks
  • Validators can use BALs to validate blocks faster
  • While the effort to generate BALs is low, the benefits for validators are high

Simple Example: Alice sends ETH to Bob

BlockAccessList(
  account_changes=[
    # Alice's account after sending 1 ETH
    AccountChanges(
      address=0xaaaa...,
      balance_changes=[
        BalanceChange(tx_index=0, post_balance=50 ETH)
      ],
      nonce_changes=[
        NonceChange(tx_index=0, new_nonce=10)
      ]
    ),
    # Bob's account after receiving 1 ETH
    AccountChanges(
      address=0xbbbb...,
      balance_changes=[
        BalanceChange(tx_index=0, post_balance=11 ETH)
      ]
    ),
    # Coinbase gets transaction fees
    AccountChanges(
      address=0xeeee...,
      balance_changes=[
        BalanceChange(tx_index=0, post_balance=100.01 ETH)
      ]
    )
  ]
)

Impact & Performance

~40 KiB
Average BAL size (compressed)
60-80%
Transactions with no conflicts
8x
Potential speedup with 8 cores
SSZ
Efficient encoding format

Research & Updates

Latest insights on Block-Level Access Lists

Toni Wahrstätter Glamsterdam Proposal

EIP-7928 for Glamsterdam

This post represent the official proposal of EIP-7928: Block-level Access Lists for the Glamsterdam hardfork.

Read More →
Toni Wahrstätter Research Post

Block-Level Access Lists (BALs)

Exploring how BALs enable parallel transaction execution by providing comprehensive state access information at the block level.

Read More →
Maria Silva Technical Note

BAL sizes

Analyzing worst-case BAL sizes and how to generate them. This includes a detailed analysis of the worst-case BAL size for different scenarios, bloating different parts of the BAL.

Read More →
Toni Wahrstätter Research Post

Execution Dependencies

Deep dive into transaction dependencies and how understanding them unlocks efficient parallel processing capabilities.

Read More →
Rahul Technical Note

Design Exploration

Analyzing a different, more lightweight BAL design that achieves perfect parallelization for most average blocks, but not for worst-cases.

Read More →
Rahul Progress Tracker

Detailed Client Progress

Dive deeper into "where we are today?". The pages provide a tracker to follow progress on the EIP, from specs to production-ready implementation..

Read More →

Resources

Authors

Toni Wahrstätter @nerolation
Dankrad Feist @dankrad
Francesco D'Amato @fradamt
Jochem Brouwer @jochem-brouwer
Ignacio Hagopian @jsign