eth/72 changes execution-layer blob-pool relay from complete blob wrappers to
cell-aware transfer. This page owns the wire messages, provider and sampler
roles, and local block-builder behavior. The pinned devp2p specification
contains the wire messages, while EIP-8070 remains Draft. This page therefore
describes specified work under development. It does not claim deployment.
Announcements
NewPooledTransactionHashes adds one 16-byte cell_mask:
[types,
[size_0, size_1, ...],
[hash_0, hash_1, ...],
cell_mask]
Bit i means the sender has cell index i for every blob in every type-3
transaction in that announcement. The sender uses RLP nil when the
announcement has no type-3 transactions. One message cannot advertise a
different mask for each transaction, so a sender must group announcements when
its available sets differ.
GetPooledTransactions still fetches the signed transaction and its blob
network wrapper. For type-3 transactions, the PooledTransactions response
sets the wrapper's blob-data position to RLP nil. It keeps the commitments
and cell proofs. The cells move to the new request pair.
Cell request and response
GetCells:
[request_id,
[transaction_hash, ...],
requested_cells: B_16]
Each set bit asks for that cell index from every blob in each listed transaction. A requester should send no more than 64 hashes in one request.
Cells:
[request_id,
[transaction_hash, ...],
[[cell, ...], ...],
returned_cells: B_16]
The transaction hashes identify the returned transaction groups. Within one group, cells are ordered first by ascending set-bit index and then by blob order inside the transaction.
The response mask must be a subset of the request mask. A constrained server may omit whole transactions, clear requested bits, truncate to a service or size limit, or return an empty transaction list. For every returned transaction and every bit it leaves set, it returns the cell for every blob. The recommended response soft limit is 2 MiB.
A client may rate-limit requests. Response truncation alone is not a protocol fault. A peer that returns an unrequested cell, a mask that is not a subset, or a cell list inconsistent with its mask violates the protocol and should be disconnected.
Provider and sampler roles
The pinned devp2p specification and Draft EIP-8070 describe related but
distinct provider and sampler contracts.
Pinned devp2p profile
For each unknown type-3 transaction, an ordinary node chooses:
| Role | Probability | Required fetch |
|---|---|---|
| Provider | at least 0.15 |
complete transaction and enough cells to recover the full blobs |
| Sampler | remaining probability | transaction plus custody cells |
The provider probability is a local parameter p with a minimum recommended
value of 0.15. A provider requests the full blobs with GetCells, setting
more than half of the cell indices in the request mask to 1. The pinned
devp2p text does not state an all-ones request mask or an all-ones
reannouncement.
A sampler first gets and validates the signed transaction. It should observe at least two distinct full-availability announcements before it samples. It then requests its custody cells from peers with an overlapping mask.
The pinned devp2p constants are:
| Parameter | Value |
|---|---|
Minimum provider probability (MIN_P) |
0.15 |
Availability observations before sampling (AVAILABILITY_THRESHOLD) |
2 |
Draft EIP-8070 behavior
Draft EIP-8070 requires a provider to act only when the announcing peer
signaled full availability. It requests the transaction and full blob data
with an all-ones cell mask, then reannounces the transaction with an all-ones
mask after validation. Its sampler adds C_extra random columns when it asks a
provider, which helps hide the exact custody set. The all-ones and extra-column
rules are proposal behavior, not rules in the pinned devp2p profile.
The draft lists these additional profile parameters:
| Parameter | Value |
|---|---|
| Provider probability | 0.15 |
| Full-availability observations before sampling | 2 |
| Extra random columns in a provider request | 1 |
| Minimum sampled columns per slot | 8 |
| Reconstruction threshold | 64 cells |
| Suggested default peer-set size | 50 |
A supernode fetches all blob data. It load-balances requests across samplers and providers, keeps a larger peer set, and should reconstruct from 64 verified cells instead of loading one peer with an all-cell response.
A node may repeat samples to check continued availability. It may remove a pending transaction that never reaches its local saturation threshold. These timers and fairness thresholds are local policy.
Block-builder behavior
Draft EIP-8070 says a local block builder should use eager mode for each type-3 transaction it plans to include. In eager mode it acts as a provider with probability 1 and holds enough verified cells to reconstruct every blob before construction.
The draft permits a builder to start with the normal 0.15 probability and
switch to eager mode two or three slots before building, but does not recommend
that pattern. The late burst exposes builder activity and gives an attacker a
clear denial-of-service target.
Engine API boundary
The local Engine API carries the consensus custody set and selected-cell
requests across the execution boundary. Fork choice and payloads
owns engine_forkchoiceUpdatedV4, including its custody-set update flow, and
Engine blob access owns
engine_getBlobsV4 and its cell response contract. This page keeps the
eth/72 relay and sampling behavior that those calls drive.
Validation and failure handling
A receiver does not count a cell as available until it has:
- matched the transaction hash and returned mask to its request;
- matched commitments and proofs from the transaction wrapper;
- checked the cell and proof under the EIP-7594 KZG rules; and
- placed the cell at the mask index and blob position the response implies.
The node rejects a mask with bits outside the 128-cell range. It does not treat a partial announcement as proof that the peer can serve a full wrapper. It reconstructs a blob only after it has 64 distinct valid cells.
Peers may use local fairness rules that compare a neighbor's provider fetches with its sampling load. A peer can lose service priority or be disconnected for repeated invalid cells, false availability, or abusive request volume. Availability failure and invalid data remain separate outcomes.
Status boundary
The devp2p file calls eth/72 its current specification version, but the
standards-track EIP is Draft and the pinned corpus contains no mainnet
activation or client deployment evidence. This subject remains in progress.
The earlier complete-wrapper behavior stays the active contract until the
network adopts eth/72.