-
Notifications
You must be signed in to change notification settings - Fork 6k
Add EIP: eth/71 - Block Access List Exchange #11307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 8 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
9217ad8
Add EIP: eth/71
nerolation ae868e0
Update EIPS/eip-8519.md
nerolation 8fc2531
rename eip file
nerolation f83bf70
delete old file
nerolation 2dcb3db
add correct ethmag url
nerolation 8b97ccf
fix linter errors
nerolation e553f5b
fix header fild, remove reference to WSP
nerolation ea0d2b1
clarify BAL item ordering
nerolation 62ad72b
Update EIPS/eip-8159.md
nerolation File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,148 @@ | ||
| --- | ||
| eip: 8159 | ||
| title: eth/71 - Block Access List Exchange | ||
| description: Adds peer-to-peer exchange of block-level access lists to the eth protocol | ||
| author: Toni Wahrstätter (@nerolation) | ||
| discussions-to: https://ethereum-magicians.org/t/eip-8159-eth-71-block-access-list-exchange/27725 | ||
| status: Draft | ||
| type: Standards Track | ||
| category: Networking | ||
| created: 2026-02-12 | ||
| requires: 7928 | ||
|
nerolation marked this conversation as resolved.
Outdated
|
||
| --- | ||
|
|
||
| ## Abstract | ||
|
|
||
| This EIP modifies the 'eth' p2p protocol to support Block-level Access Lists (BALs). It adds two new messages, `GetBlockAccessLists` (0x12) and `BlockAccessLists` (0x13), enabling peers to request and serve BALs for synchronization and parallel execution. | ||
|
|
||
| ## Motivation | ||
|
|
||
| [EIP-7928](./eip-7928.md) introduces block-level access lists that record all state locations accessed during block execution. These lists enable parallel disk reads, parallel transaction execution, and executionless state updates. | ||
|
|
||
| For syncing clients to leverage these capabilities, BALs must be obtainable from peers. The Engine API provides BALs from the consensus layer during normal operation, but historical BALs and peer-based sync require wire protocol support. | ||
|
|
||
| ## Specification | ||
|
|
||
| ### Block Header Extension | ||
|
|
||
| The block header is extended with a new field after `requests-hash`: | ||
|
|
||
| ``` | ||
| block-header = [ | ||
| ... | ||
| requests-hash: B_32, | ||
| block-access-list-hash: B_32, | ||
| ] | ||
| ``` | ||
|
|
||
| The `block-access-list-hash` field contains `keccak256(rlp.encode(block-access-list))` as defined in [EIP-7928](./eip-7928.md). This field MUST be present in headers after the Amsterdam fork and absent for earlier blocks. | ||
|
|
||
| ### Block Access List Encoding | ||
|
|
||
| BALs are RLP-encoded as a list of account changes, sorted lexicographically by address: | ||
|
|
||
| ``` | ||
| block-access-list = [account-changes₁, account-changes₂, ...] | ||
|
|
||
| account-changes = [ | ||
| address: B_20, | ||
| storage-changes, | ||
| storage-reads, | ||
| balance-changes, | ||
| nonce-changes, | ||
| code-changes, | ||
| ] | ||
|
|
||
| storage-changes = [slot-changes₁, slot-changes₂, ...] | ||
| slot-changes = [slot: B_32, [storage-change₁, storage-change₂, ...]] | ||
| storage-change = [block-access-index: P, value: B_32] | ||
|
|
||
| storage-reads = [slot₁: B_32, slot₂: B_32, ...] | ||
|
|
||
| balance-changes = [balance-change₁, balance-change₂, ...] | ||
| balance-change = [block-access-index: P, balance: P] | ||
|
|
||
| nonce-changes = [nonce-change₁, nonce-change₂, ...] | ||
| nonce-change = [block-access-index: P, nonce: P] | ||
|
|
||
| code-changes = [code-change₁, code-change₂, ...] | ||
| code-change = [block-access-index: P, code: B] | ||
| ``` | ||
|
|
||
| `storage-changes` MUST be sorted lexicographically by slot. Changes within each slot MUST be sorted by `block-access-index` ascending. `storage-reads` MUST be sorted lexicographically by slot. | ||
|
|
||
| Where `block-access-index` indicates when the change occurred: | ||
|
|
||
| - `0` for pre-execution system contract calls | ||
| - `1...n` for transactions (in block order) | ||
| - `n+1` for post-execution system contract calls and withdrawals | ||
|
|
||
| See [EIP-7928](./eip-7928.md) for complete BAL generation rules and inclusion semantics. | ||
|
|
||
| ### New Protocol Messages | ||
|
|
||
| #### GetBlockAccessLists (0x12) | ||
|
|
||
| ``` | ||
| [request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...]] | ||
| ``` | ||
|
|
||
| Request BALs for the given block hashes. The number of BALs that can be requested in a single message is subject to implementation-defined limits. | ||
|
|
||
| BALs are only available for blocks after [EIP-7928](./eip-7928.md) activation and within the retention period defined therein. Requests for unavailable BALs return empty entries. | ||
|
|
||
| #### BlockAccessLists (0x13) | ||
|
|
||
| ``` | ||
| [request-id: P, [block-access-list₁, block-access-list₂, ...]] | ||
| ``` | ||
|
|
||
| Response to `GetBlockAccessLists`. Each element corresponds to a block hash from the request, in order. Empty BALs (RLP-encoded empty list `0xc0`) are returned for blocks where the BAL is unavailable. | ||
|
|
||
| The recommended soft limit for `BlockAccessLists` responses is 10 MiB. | ||
|
|
||
| ### Validation | ||
|
|
||
| When a BAL is received, clients MUST validate it by computing `keccak256(rlp.encode(bal))` and comparing against the `block-access-list-hash` in the corresponding block header. | ||
|
|
||
| ## Rationale | ||
|
|
||
| ### Separate Messages vs. Block Body Extension | ||
|
|
||
| BALs are transmitted via dedicated messages rather than extending block bodies because: | ||
|
|
||
| 1. **Size**: BALs average ~70 KiB, significantly increasing block propagation overhead if bundled. | ||
| 2. **Optional retrieval**: Not all sync strategies require BALs. Snap sync can reconstruct state without them. | ||
| 3. **Retention policy**: BALs may be pruned per [EIP-7928](./eip-7928.md), while block bodies are retained longer. | ||
|
|
||
| ### Message IDs | ||
|
|
||
| Message IDs 0x12 and 0x13 follow sequentially from the existing eth/69 messages (BlockRangeUpdate is 0x11). | ||
|
|
||
| ### Response Size Limit | ||
|
|
||
| The 10 MiB soft limit aligns with existing protocol conventions and accommodates multiple BALs per response while remaining within typical message size constraints. | ||
|
|
||
| ## Backwards Compatibility | ||
|
|
||
| This EIP changes the eth protocol and requires rolling out a new version, eth/71. Supporting multiple protocol versions is standard practice. Rolling out eth/71 does not break older clients, as they can continue using eth/69 or eth/70. | ||
|
|
||
| This EIP requires the Amsterdam hard fork for the header field extension. The new messages are only meaningful for post-Amsterdam blocks. | ||
|
|
||
| ## Security Considerations | ||
|
|
||
| ### Validation Cost | ||
|
|
||
| BAL validation requires computing a keccak256 hash of the RLP-encoded list. For typical BALs (~70 KiB), this is negligible. For worst-case BALs at high gas limits, validation remains bounded by the block gas limit. | ||
|
|
||
| ### Amplification | ||
|
|
||
| A `GetBlockAccessLists` request can trigger responses larger than the request. Implementations SHOULD apply rate limiting and respect the soft response size limit to prevent amplification attacks. | ||
|
|
||
| ### Unavailable Data | ||
|
|
||
| Clients MUST handle empty responses gracefully. A peer returning empty entries for available blocks may be misbehaving but could also have pruned the data legitimately. | ||
|
|
||
| ## Copyright | ||
|
|
||
| Copyright and related rights waived via [CC0](../LICENSE.md). | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.