Block Access List (BAL) Size Analysis

Analysis done with the BAL version https://github.com/ethereum/EIPs/blob/5cff3c4c11d2e06a269ade5b9ca005bb674f6b5f/EIPS/eip-7928.md

Executive Summary

This report presents an empirical analysis of Block Access List (BAL) sizes across 100 historical Ethereum blocks. The analysis examines BAL encoding efficiency using SSZ format and compares configurations with and without storage read tracking.

Methodology

Key Findings

1. Overall BAL Sizes

Configuration: With Storage Reads

Configuration: Without Storage Reads

Impact of Storage Reads

2. Component Breakdown

Average compressed sizes by component type (with storage reads):

3. Block Activity Metrics

Average per block:

4. Size Distribution

Compressed BAL size percentiles (with reads):

5. Correlation Analysis

Technical Details

BAL Structure

The Block Access List uses an account-centric design with hierarchical organization:

BlockAccessList
└── AccountChanges[]
    ├── address: Address (20 bytes)
    ├── storage_changes: SlotChanges[]
    │   ├── slot: StorageKey (32 bytes)
    │   └── changes: StorageChange[]
    │       ├── tx_index: uint16
    │       └── new_value: StorageValue (32 bytes)
    ├── storage_reads: SlotRead[]
    │   └── slot: StorageKey (32 bytes)
    ├── balance_changes: BalanceChange[]
    │   ├── tx_index: uint16
    │   └── post_balance: Balance (12 bytes)
    ├── nonce_changes: NonceChange[]
    │   ├── tx_index: uint16
    │   └── new_nonce: uint64
    └── code_changes: CodeChange[]
        ├── tx_index: uint16
        └── new_code: CodeData (variable)

Encoding Efficiency Features

  1. Address Deduplication: Each address appears only once, regardless of how many changes it has
  2. Slot Deduplication: Each storage slot appears only once per account
  3. Transaction Indexing: Uses uint16 (2 bytes) instead of full transaction hashes
  4. Optimized Field Sizes:
    • Balance: 12 bytes (sufficient for total ETH supply)
    • Transaction index: 2 bytes (supports up to 65,535 transactions)
    • Address: 20 bytes (standard Ethereum address)

Key Insights

  1. Storage Operations Dominate: Storage changes and reads account for 85.3% of the total BAL size, making storage optimization critical.

  2. Read Tracking Cost: Including storage reads adds approximately 13.4 KB per block on average, a 45.6% increase.

  3. Scalability: The median block (178 transactions) produces a 42.6 KB compressed BAL, while the 95th percentile block (286 transactions) produces 73.7 KB.

  4. Network Impact: At current block production rates (12 seconds), BALs would add approximately 300.2 MB/day to node bandwidth requirements.

Conclusions

The SSZ-encoded Block Access List provides an efficient method for recording state access patterns: