Skip to content

Commit 0dfc043

Browse files
authored
caps/eth.md: eth/71 - block-level access list (BAL) (#264)
Add eth/71 protocol definition for EIP-7928 Block-Level Access Lists (BALs).
1 parent e2e8900 commit 0dfc043

1 file changed

Lines changed: 77 additions & 1 deletion

File tree

caps/eth.md

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Ethereum Wire Protocol (ETH)
22

33
'eth' is a protocol on the [RLPx] transport that facilitates exchange of Ethereum
4-
blockchain information between peers. The current protocol version is **eth/70**. See end
4+
blockchain information between peers. The current protocol version is **eth/71**. See end
55
of document for a list of changes in past protocol versions.
66

77
### Basic Operation
@@ -210,6 +210,7 @@ Ethereum block headers are encoded as follows:
210210
excess-blob-gas: P,
211211
parent-beacon-root: B_32,
212212
requests-hash: B_32,
213+
block-access-list-hash: B_32,
213214
]
214215

215216
In certain protocol messages, the transaction and ommer lists are relayed together as a
@@ -246,6 +247,9 @@ headers are processed in sequence during chain synchronization, the following ru
246247
added by [EIP-4844] and [EIP-4788].
247248
- `requests-hash` must be present in headers after the Prague fork, and absent for
248249
earlier blocks. This rule was added by [EIP-7685].
250+
- `block-access-list-hash` must be present in headers after the [Amsterdam fork], and
251+
absent for earlier blocks. This rule was added by [EIP-7928]. The hash is computed as
252+
`keccak256(rlp.encode(block_access_list))`.
249253

250254
For complete blocks, we distinguish between the validity of the block's EVM state
251255
transition, and the (weaker) 'data validity' of the block. The definition of state
@@ -304,6 +308,39 @@ and their bloom filters have to be recomputed.
304308
Since the valid list of receipts is determined by the EVM state transition, it is not
305309
necessary to define any further validity rules for receipts in this specification.
306310

311+
### Block Access List Encoding
312+
313+
Block Access Lists (BALs) record all accounts and storage locations accessed during block
314+
execution, along with their post-execution values. BALs are not included in the block body
315+
but can be requested separately via the [GetBlockAccessLists] message.
316+
317+
The BAL is RLP-encoded as a list of account changes, sorted lexicographically by address:
318+
319+
block-access-list = [account-changes₁, account-changes₂, ...]
320+
321+
account-changes = [
322+
address: B_20,
323+
storage-changes: [[slot: B_32, [[block-access-index: P, value: B_32], ...]], ...],
324+
storage-reads: [slot₁: B_32, slot₂: B_32, ...],
325+
balance-changes: [[block-access-index: P, balance: P], ...],
326+
nonce-changes: [[block-access-index: P, nonce: P], ...],
327+
code-changes: [[block-access-index: P, code: B], ...],
328+
]
329+
330+
`storage-changes` must be sorted lexicographically by slot. Changes within each slot must
331+
be sorted by `block-access-index` ascending. `storage-reads` must be sorted
332+
lexicographically by slot.
333+
334+
Where `block-access-index` indicates when the change occurred:
335+
336+
- `0` for pre-execution system contract calls
337+
- `1...n` for transactions (in block order)
338+
- `n+1` for post-execution system contract calls and withdrawals
339+
340+
When a BAL is received, it must be validated by computing `keccak256(rlp.encode(bal))` and
341+
comparing against the `block-access-list-hash` in the corresponding block header. For
342+
complete BAL generation rules, see [EIP-7928].
343+
307344
## Protocol Messages
308345

309346
In most messages, the first element of the message data list is the `request-id`. For
@@ -524,8 +561,41 @@ received updates.
524561
At the same time, client implementations must take care to not disconnect all syncing
525562
peers purely on the basis of their BlockRangeUpdate.
526563

564+
### GetBlockAccessLists (0x12)
565+
566+
`[request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]`
567+
568+
Require peer to return a BlockAccessLists message containing the block access lists of the
569+
given block hashes. The number of BALs that can be requested in a single message may be
570+
subject to implementation-defined limits.
571+
572+
BALs are only available for blocks after [EIP-7928] activation and within the retention
573+
period defined therein.
574+
575+
### BlockAccessLists (0x13)
576+
577+
`[request-id: P, [block-access-list₁, block-access-list₂, ...]]`
578+
579+
This is the response to GetBlockAccessLists, providing the requested BALs. Each element
580+
in the response list corresponds to a block hash from the GetBlockAccessLists request.
581+
The RLP empty string (`0x80`) is returned for blocks where the BAL is unavailable.
582+
583+
The BAL must be validated by computing `keccak256(rlp.encode(bal))` and comparing against
584+
the `block-access-list-hash` in the corresponding block header. See [Block Access List
585+
Encoding] for the structure of block access lists.
586+
587+
The recommended soft limit for BlockAccessLists responses is 2 MiB.
588+
527589
## Change Log
528590

591+
### eth/71 ([EIP-8159], February 2026)
592+
593+
Version 71 added block-level access lists (BALs) support for the [Amsterdam fork]. The
594+
block header now includes a `block-access-list-hash` field containing the keccak256 hash
595+
of the RLP-encoded access list. Two new messages [GetBlockAccessLists] and
596+
[BlockAccessLists] were added to enable peer-to-peer exchange of BALs for optimized
597+
synchronization and parallel execution.
598+
529599
### eth/70 ([EIP-7975], June 2025)
530600

531601
In version 70, the [GetReceipts] and [Receipts] messages were modified to allow requesting
@@ -645,6 +715,9 @@ Version numbers below 60 were used during the Ethereum PoC development phase.
645715
[GetReceipts]: #getreceipts-0x0f
646716
[Receipts]: #receipts-0x10
647717
[BlockRangeUpdate]: #blockrangeupdate-0x11
718+
[GetBlockAccessLists]: #getblockaccesslists-0x12
719+
[BlockAccessLists]: #blockaccesslists-0x13
720+
[Block Access List Encoding]: #block-access-list-encoding
648721
[RLPx]: ../rlpx.md
649722
[EIP-155]: https://eips.ethereum.org/EIPS/eip-155
650723
[EIP-1559]: https://eips.ethereum.org/EIPS/eip-1559
@@ -662,9 +735,12 @@ Version numbers below 60 were used during the Ethereum PoC development phase.
662735
[EIP-5793]: https://eips.ethereum.org/EIPS/eip-5793
663736
[EIP-7642]: https://eips.ethereum.org/EIPS/eip-7642
664737
[EIP-7685]: https://eips.ethereum.org/EIPS/eip-7685
738+
[EIP-7928]: https://eips.ethereum.org/EIPS/eip-7928
665739
[EIP-7975]: https://eips.ethereum.org/EIPS/eip-7975
740+
[EIP-8159]: https://eips.ethereum.org/EIPS/eip-8159
666741
[The Merge]: https://eips.ethereum.org/EIPS/eip-3675
667742
[London hard fork]: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md
668743
[Shanghai fork]: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md
669744
[Cancun fork]: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md
745+
[Amsterdam fork]: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/amsterdam.md
670746
[Yellow Paper]: https://ethereum.github.io/yellowpaper/paper.pdf

0 commit comments

Comments
 (0)