Skip to content
Draft
Changes from 22 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e0bfa16
add: add eth70 spec
healthykim Aug 14, 2025
5ba0075
fix: omit proof messaging
healthykim Aug 15, 2025
556cc66
add: add a link to peerDAS
healthykim Aug 15, 2025
4f29887
fix: restore Transactions msg spec
healthykim Aug 15, 2025
75753f0
fix: rename ids to index
healthykim Aug 15, 2025
e558fa1
fix: specify the length of cells
healthykim Aug 15, 2025
ce56fc7
fix: integrate bitmap to hash announcement
healthykim Aug 19, 2025
1d36625
fix: change cells message
healthykim Aug 20, 2025
efe662b
chore: fix typo
healthykim Aug 20, 2025
9a8ff92
add: add explanation about bitmap granularity
healthykim Aug 20, 2025
0896be2
add: add constraint in Cells message
healthykim Aug 20, 2025
6caf1bc
add: modify intro
healthykim Aug 20, 2025
bb37e52
add: add behaviour
healthykim Aug 26, 2025
6021b98
add detailed explanation of the Cells message
healthykim Aug 26, 2025
a902ea9
clarify meaning of cells field
healthykim Aug 26, 2025
c2a1f03
clarify meaning of cells field
healthykim Aug 26, 2025
744324f
fix typo
healthykim Aug 26, 2025
eab5207
fix typo
healthykim Aug 26, 2025
9e049e7
polish intro
healthykim Aug 26, 2025
bda330c
add more information about custody set
healthykim Aug 26, 2025
cafd6d3
edit intro
healthykim Aug 26, 2025
24be46e
modify intro
healthykim Aug 29, 2025
7d162ef
clarify cell index vs. tx better
cskiraly Aug 31, 2025
390d9bc
fix typo
cskiraly Aug 31, 2025
5e476bb
improve explanation
cskiraly Aug 31, 2025
4161bd1
edit the number of cell indices set under pull behavior
healthykim Aug 31, 2025
46fffe3
clarify scope of cells field
healthykim Aug 31, 2025
c064077
fix the incorrect restriction on the number of cells that can be requ…
healthykim Aug 31, 2025
4cc7746
add parameter table and references to parameters
healthykim Sep 1, 2025
6d926b1
clarify load balancing requirements
healthykim Sep 1, 2025
2b12215
clarify the difference between p and MIN_P
healthykim Sep 1, 2025
bd2207a
fix typo
healthykim Sep 1, 2025
edb32f5
move peer disconnection to getcells from cells
healthykim Sep 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 103 additions & 2 deletions caps/eth.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,55 @@ of it (either because it was previously sent or because it was informed from thi
originally). This is usually achieved by remembering a set of transaction hashes recently
relayed by the peer.

### Blob Transaction and Cell Exchange

This section describes additional constraints and node behaviours that apply only to blob
transactions, in addition to the ordinary transaction exchange.

Blob transactions contain one or more 128 KiB fixed-size objects called blobs. Blobs can be
split into cells using the erasure code defined in [EIP-7594]. The size of a cell is

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

while here we can have example numbers, I think later it would be better to parametrize these similar to EIP-7594.
number of cells, related bitmap size, and cell size should all be parametrized I think.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a parameter table regarding this. I am not entirely sure this is what you meant, but I think its pretty nice since it shows which configurations we need to keep an eye on

currently defined as 2 KiB and each blob consists of 128 cells encoded with a 1/2
code rate. A cell is identified within the erasure-coded blob by its index.

Blob transactions also include metadata such as proofs and commitments required to verify
whether a cell belongs to the blob data.

- Commitment: A cryptographic value bound to a blob, used in inclusion verification to
ensure that any given cell is part of the original blob.

- Proof: A cell-specific data used during inclusion verification of the corresponding cell.

Blob transaction exchange must be initiated only through the
[NewPooledTransactionHashes] message. The peer must also announce the availability of its
cells using the `cells` field in the message. If a bit in the field is set, it indicates that
the peer holds the corresponding cell for all blobs included in the announced transactions.

Responses to [GetPooledTransactions] for blob transactions include the traditional transaction
payload and blob metadata. However, the blob data itself can only be obtained
as cells via [GetCells]. Since a transaction can carry multiple blobs, cell exchange is
handled at the transaction level, meaning that all cells within the same transaction must
be delivered together.

Upon receiving the [NewPooledTransactionHashes] message with new blob transaction hashes,
the node begins fetching cells in parallel with transaction fetching. The node first makes
a probabilistic decision. If it decides to fetch full blobs with probability $p$, it
requests them using the [GetCells] message, setting more than 50% of the total cell indices

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why "more than 50%"? Do we even want to allow setting more than 50%? That would be more adequate for some lossy transport, but we don't (yet) have that here.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was my error. Thanks for pointing it out I’ve fixed it.

to 1 in the cells field. The recommended probability $p$ is 0.15.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of recommending 0.15 here, I think it is better to have a parameters section that we can update all in one.


If it decides not to fetch full blobs, it must instead request its custody cells from peers
that announced overlapping availability, using the [GetCells] message, but only after
observing N (TBD) distinct full-availability announcements. Custody cells are the cells
whose indices belong to the custody index set of the associated consensus node ID. In practice,
this information can be delievered using engine API from consensus layer. The node
must also request an excess of N random indices in addition to its custody set to mitigate
targeted and selective data attacks. A node must announce availability only after obtaining
all of its custody cells.

A client that wants to store every blobs should distribute its requests as evenly as possible.
To avoid being banned by its peer, it must also respect a probability parameter $p$.
With probability $p$, it can request 50% of the data from a single peer, but with probability
$1 – p$, it should request those cells collectively from multiple peers.

### Transaction Encoding and Validity

Transaction objects exchanged by peers have one of two encodings. In definitions across
Expand Down Expand Up @@ -418,11 +467,11 @@ block.

### NewPooledTransactionHashes (0x08)

`[txtypes: B, [txsize₁: P, txsize₂: P, ...], [txhash₁: B_32, txhash₂: B_32, ...]]`
`[txtypes: B, [txsize₁: P, txsize₂: P, ...], [txhash₁: B_32, txhash₂: B_32, ...], cells: B_16]`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should decide whether there is one cells bitmap for the whole message, or one cells bitmap per transaction - in the pool. In the first case, the bitmap should refer to all transactions (or all type 3 transactions) in the pool.

  • in the second case, we could have a separate bitmap for each tx. Eventually we could compress a bit by skipping bitmaps for non type3 transactions.


This message announces one or more transactions that have appeared in the network and
which have not yet been included in a block. The message payload describes a list of of
transactions, but note that it is encoded as three separate elements.
transactions, but note that it is encoded as four separate elements.

The `txtypes` element is a byte array containing the announced [transaction types]. The
other two payload elements refer to the sizes and hashes of the announced transactions.
Expand All @@ -432,6 +481,13 @@ All three payload elements must contain an equal number of items.
the byte size of `tx-type || tx-data` for typed transactions, and the size of the
RLP-encoded `legacy-tx` for non-typed legacy transactions.

The `cells` element is a bitmap marking which cell indices can be fetched from the sending
peer. For each bit set to one, the peer stores the cell at that index in all blobs of the
transaction. A bit must be set only if the peer has the cell at that index in all blobs of

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here you say "in all blobs of THE TRANSACTION". But the message can refer to more transactions, so the bits should also refer to all transactions (which means all blobs of all included transactions), or we need multiple bitmaps (in that case each bitmap would refer to all blobs or the respective transaction).

the transaction. This field is only relevant for those entries that refer to blob
transactions. Blob transactions with the same `cells` field may be announced together in a

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, the the intended notion is that the bitmap refers to all blobs of all transactions. Otherwise one would need separate NewPooledTransactionHashes messages for each transaction.

batch within this message.

The recommended soft limit for this message is 4096 items (~150 KiB).

To be maximally helpful, nodes should inform peers of all transactions that they may not
Expand Down Expand Up @@ -509,8 +565,50 @@ received updates.
At the same time, client implementations must take care to not disconnect all syncing
peers purely on the basis of their BlockRangeUpdate.

### GetCells (0x12)

`[request-id: P, [txhash₁: B_32, txhash₂: B_32, ...], cells : B_16]`

This message requests the peer to return cell data of the given transaction hashes.
The cells element is a bitmap specifying which cell indices are requested. For each bit
set, the requester asks for the cell at that index from all blobs of the corresponding
transaction.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, if we speak of "the corresponding transaction", we need [cells_1 :B_16, cells_2: B_16, ...]
Otherwise we should rephrase this so that the bitmap refers to all blobs of all included transactions.


A node should either set 4 bits (with probability $1–p$) or 64 bits (with probability $p$)
in the cells field. This mechanism prevents a greedy peer from abusing bandwidth and
encourages collective fetch.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure we want to have these numbers directly in the message format specification.

These numbers will change when we change the number of columns. Second, what is a valid use (number of bits) and how it should be used (probability) depends on how we define the protocol logic. To me that would be better in another section about protocol dynamics.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the first concern can be solved by parameterization which you previously suggested.

For the second concern, since this section describes how each message should be processed and used, it does not seem possible to avoid mentioning it here. So my idea is to briefly state only the limit here first and later provide more protocol related background like why such a limit was chosen (including any future experiments or analyses that may be needed) either in the introduction or in a separate section. What do you think about this approach?



### Cells (0x13)

`[request-id: P, [[txhash₁: B_32, [index₁: P, cell₁: B_2048, cell₂: B_2048, ...], [index₂: P, cell₁: B_2048, cell₂: B_2048, ...]], [txhash₂: B_32, [index₁: P, cell₁: B_2048, cell₂: B_2048, ...], [index₂: P, cell₁: B_2048, cell₂: B_2048, ...]], ...]]`

This is the response to [GetCells].

Each transaction hash is followed by one or more pairs consisting of an index and the
corresponding cells. The index specifies the position of a cell within a blob.
Blob transaction can contain multiple blobs, and the same index is applied to all of
them. If an index is included in the response, one cell must be returned from each
blob of the transaction at that index. The cells are listed in the order in which the
blobs appear in the transaction.

A peer may omit entire transactions or entire indices if they are unavailable or
constrained. However, if an index is included for a transaction, cells for all blobs
of that transaction at that index must be returned.

A peer may respond with an empty list if none of the requested cells are available.

To manage uplink bandwidth usage, a node may disconnect peers that send excessive requests.
This can be enforced by monitoring metrics such as the number of requested cells over a given
period.
## Change Log

### eth/ ()

Version 70 changed the [NewPooledTransactionHashes] message to include custody information
which represents cell indicies sending peer has stored. New message types,
[GetCells] and [Cells] were introduced to support cell-level messaging.

### eth/69 ([EIP-7642], April 2025)

Version 69 changed the [Status] message to include information about the available block
Expand Down Expand Up @@ -624,6 +722,8 @@ Version numbers below 60 were used during the Ethereum PoC development phase.
[GetReceipts]: #getreceipts-0x0f
[Receipts]: #receipts-0x10
[BlockRangeUpdate]: #blockrangeupdate-0x11
[GetCells]: #getcells-0x12
[Cells]: #cells-0x13
[RLPx]: ../rlpx.md
[EIP-155]: https://eips.ethereum.org/EIPS/eip-155
[EIP-1559]: https://eips.ethereum.org/EIPS/eip-1559
Expand All @@ -639,6 +739,7 @@ Version numbers below 60 were used during the Ethereum PoC development phase.
[EIP-4844]: https://eips.ethereum.org/EIPS/eip-4844
[EIP-4938]: https://eips.ethereum.org/EIPS/eip-4938
[EIP-5793]: https://eips.ethereum.org/EIPS/eip-5793
[EIP-7594]: https://eips.ethereum.org/EIPS/eip-7594
[EIP-7642]: https://eips.ethereum.org/EIPS/eip-7642
[EIP-7685]: https://eips.ethereum.org/EIPS/eip-7685
[The Merge]: https://eips.ethereum.org/EIPS/eip-3675
Expand Down