Skip to content

engine_getBlobsV4#774

Open
kamilsa wants to merge 10 commits intoethereum:mainfrom
kamilsa:update/engine-getBlobsV4-spec
Open

engine_getBlobsV4#774
kamilsa wants to merge 10 commits intoethereum:mainfrom
kamilsa:update/engine-getBlobsV4-spec

Conversation

@kamilsa
Copy link
Copy Markdown

@kamilsa kamilsa commented Mar 21, 2026

Companion PR to ethereum/EIPs#11444 . The current PR is expected to be merged first.

To support EIP-8070 (sparse blobpools) :

  1. engine_getBlobsV4: provides the mechanism for the CL to request partial blobs data from the the EL's blobpool
  2. engine_forkchoiceupdatedv4: updated with the column custody field to update EL about CL's custody column set

kamilsa and others added 5 commits March 21, 2026 19:04
- Expand V4 spec from 1 line to 7 detailed specification points mirroring V3 style
- Add support for multiple blob versioned hashes in example (3 blobs)
- Clarify missing blob handling (return null at corresponding positions)
- Add support for partial blobs with null cells and null proofs
- Update response schema to allow null entries (oneOf pattern)
- Include example with: present blob, partial blob with null cell, missing blob

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kamilsa kamilsa changed the title Update engine_getBlobsV4 specification and examples engine_getBlobsV4 and engine_blobCustodyUpdatedV1 Apr 10, 2026
@kamilsa kamilsa marked this pull request as ready for review April 10, 2026 10:22
Copilot AI review requested due to automatic review settings April 10, 2026 10:22
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds new Engine API capabilities needed for EIP-8070 “sparse blobpools”, enabling the CL to (1) communicate its blob column custody set to the EL and (2) request partial blob cell data (with proofs) from the EL blobpool.

Changes:

  • Introduces engine_blobCustodyUpdatedV1 for CL→EL custody-set updates via a 16-byte bitarray.
  • Introduces engine_getBlobsV4 for fetching requested blob cells + KZG proofs (including partial/missing data semantics).
  • Adds shared schema types (bytes16, BlobCellsAndProofsV1) and updates fork documentation/spellcheck wordlist accordingly.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
wordlist.txt Adds the new versioned schema/method-related token for spellchecking.
src/schemas/base-types.yaml Adds a reusable bytes16 primitive used by the new methods’ bitarray params.
src/engine/openrpc/schemas/blob.yaml Defines BlobCellsAndProofsV1 response object for partial cell/proof returns.
src/engine/openrpc/methods/blob.yaml Adds OpenRPC method entries for engine_blobCustodyUpdatedV1 and engine_getBlobsV4 (with examples).
src/engine/amsterdam.md Documents the new structure and method specs in the Amsterdam fork markdown (including ToC updates).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/engine/openrpc/methods/blob.yaml Outdated
Comment thread src/engine/amsterdam.md Outdated
kamilsa and others added 2 commits April 14, 2026 14:40
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@kamilsa kamilsa changed the title engine_getBlobsV4 and engine_blobCustodyUpdatedV1 engine_getBlobsV4 Apr 14, 2026
@dapplion
Copy link
Copy Markdown
Member

we will ship this !!

Comment thread src/engine/amsterdam.md
* params:
1. `forkchoiceState`: [`ForkchoiceStateV1`](./paris.md#ForkchoiceStateV1).
2. `payloadAttributes`: `Object|null` - Instance of [`PayloadAttributesV4`](#payloadattributesv4) or `null`.
3. `custodyColumns`: `DATA|null`, 16 Bytes - Interpreted as a bitarray of length `CELLS_PER_EXT_BLOB` indicating which column indices form the CL's custody set, or `null` if the CL does not provide custody services.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Are we certain that no network in the future will use CELLS_PER_EXT_BLOB > 128?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Yes, for the midterm, and we can adjust this length later, right ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could extend this field to Bytes32 with the high part zeroed out, doesn’t seem to be a big overhead. If we stick with Bytes16 for now and this number will be increased in the future we will have to introduce a new version of fcU. I don’t have a strong opinion on that, and would lean on whatever you think is reasonable

Comment thread src/engine/amsterdam.md

2. If the custody set has contracted, the Execution client **MAY** prune dropped cells from local storage, but **ONLY AFTER** it has broadcast an updated `NewPooledTransactionHashes` announcement with the reduced available set to avoid peers perceiving an availability fault.

4. The Execution client **MUST** treat a request to update the custody set to the current value as a no-op and return Ok.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does “no-op and return OK" mean the forkchoiceUpdate processing MUST NOT be affected by the custodyColumns?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Yes

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I would phrase it something like the following then:

  1. The Execution client MUST run custody set update independently to the fork choice update, i.e. execution time and errors occurred during custody set update MUST NOT affect the main processing flow of this method.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I think this may be added as additional rule. So we keep 4. and introduce 5. as how you described it

Comment thread src/engine/amsterdam.md

1. If the custody set has expanded, the Execution client **SHOULD** issue new sampling requests for the delta. It **MAY** broadcast an updated `NewPooledTransactionHashes` announcement with the newly available set.

2. If the custody set has contracted, the Execution client **MAY** prune dropped cells from local storage, but **ONLY AFTER** it has broadcast an updated `NewPooledTransactionHashes` announcement with the reduced available set to avoid peers perceiving an availability fault.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What would a reasonable minimal delay between broadcasting updated NewPooledTransactionHashes and pruning? It would be helpful to specify it here to set expectations, like the minimal delay could be a slot duration or something like that.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

We were considering 2 slots, but this number is (IIRC) quite arbitrary and needs to be tested on devnet. We will discuss this and update the PR. Thank you

Comment thread src/engine/amsterdam.md Outdated
schema:
$ref: '#/components/schemas/PayloadAttributesV4'
- name: Custody columns
required: false
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think it should be true as it either bytes or null, there is no case when custodyColumns param is completely missing

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

it was set to false for consistency with the previous field (payloadAttributes) which also could be null but is not required.

But no big deal making Custody columns required if needed

Comment thread src/engine/openrpc/schemas/blob.yaml Outdated
Comment thread src/engine/openrpc/schemas/blob.yaml Outdated
Copy link
Copy Markdown
Member

@raulk raulk left a comment

Choose a reason for hiding this comment

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

Re: optionality of the custody column filter. We have been designing solutions for in-transit reconstruction at the CL. There is a scenario in which we'd want the EL to serve all cells it has buffered, regardless of the CL's custody set. That would include "excess" cells when acting as a sampler, and all cells when acting as a provider.

@healthykim
Copy link
Copy Markdown

Re: optionality of the custody column filter. We have been designing solutions for in-transit reconstruction at the CL. There is a scenario in which we'd want the EL to serve all cells it has buffered, regardless of the CL's custody set. That would include "excess" cells when acting as a sampler, and all cells when acting as a provider.

What filter are you referring to ? This is possible with setting the bitmap array in getBlobsV4 request to all 1, right ?

Comment thread src/engine/amsterdam.md
* method: `engine_getBlobsV4`
* params:
1. `versioned_blob_hashes`: `Array of DATA`, 32 Bytes - an array of blob versioned hashes.
2. `indices_bitarray`: `DATA`, 16 Bytes - a bitarray denoting the indices of the cells to retrieve.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is already doable with the proposed API.

CL can set indices_bitarray to all ones. That way CL requests EL to provide all cells it has for the requested versioned blob hashes. For the missing cells (e.g. for cells that EL was acting as a sampler) request will contain nulls in the blob_cells field

kamilsa and others added 3 commits April 29, 2026 18:29
Co-authored-by: Mikhail Kalinin <noblesse.knight@gmail.com>
Co-authored-by: Mikhail Kalinin <noblesse.knight@gmail.com>
Co-authored-by: Mikhail Kalinin <noblesse.knight@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.