From c4176d7f19b5176facf3ef9d85d600e8fef3b747 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Mon, 12 Jun 2023 15:25:20 +0600 Subject: [PATCH 1/8] Define cancun with blob-extension spec --- src/engine/cancun.md | 106 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/engine/cancun.md diff --git a/src/engine/cancun.md b/src/engine/cancun.md new file mode 100644 index 000000000..86f6ab866 --- /dev/null +++ b/src/engine/cancun.md @@ -0,0 +1,106 @@ +# Engine API -- Cancun + +Engine API changes introduced in Cancun. + +This specificaiton is based on and extends [Engine API - Shanghai](./shanghai.md) specification. + +## Table of contents + + + + + + +### ExecutionPayloadV3 + +This structure has the syntax of `ExecutionPayloadV2` and append two new fields: `dataGasUsed` and `excessDataGas`. + +- `parentHash`: `DATA`, 32 Bytes +- `feeRecipient`: `DATA`, 20 Bytes +- `stateRoot`: `DATA`, 32 Bytes +- `receiptsRoot`: `DATA`, 32 Bytes +- `logsBloom`: `DATA`, 256 Bytes +- `prevRandao`: `DATA`, 32 Bytes +- `blockNumber`: `QUANTITY`, 64 Bits +- `gasLimit`: `QUANTITY`, 64 Bits +- `gasUsed`: `QUANTITY`, 64 Bits +- `timestamp`: `QUANTITY`, 64 Bits +- `extraData`: `DATA`, 0 to 32 Bytes +- `baseFeePerGas`: `QUANTITY`, 256 Bits +- `blockHash`: `DATA`, 32 Bytes +- `transactions`: `Array of DATA` - Array of transaction objects, each object is a byte list (`DATA`) representing `TransactionType || TransactionPayload` or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) +- `withdrawals`: `Array of WithdrawalV1` - Array of withdrawals, each object is an `OBJECT` containing the fields of a `WithdrawalV1` structure. +- `dataGasUsed`: `QUANTITY`, 64 bits +- `excessDataGas`: `QUANTITY`, 64 Bits + +### BlobsBundleV1 + +The fields are encoded as follows: + +- `commitments`: `Array of DATA` - Array of `KZGCommitment` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), 48 bytes each (`DATA`). +- `proofs`: `Array of DATA` - Array of `KZGProof` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), 48 bytes each (`DATA`). +- `blobs`: `Array of DATA` - Array of blobs, each blob is `FIELD_ELEMENTS_PER_BLOB * BYTES_PER_FIELD_ELEMENT = 4096 * 32 = 131072` bytes (`DATA`) representing a SSZ-encoded `Blob` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) + +All of the above three arrays **MUST** be of same length. + +## Methods + +### engine_newPayloadV3 + +#### Request + +* method: `engine_newPayloadV3` +* params: + 1. [`ExecutionPayloadV3`](#ExecutionPayloadV3). + 2. `Array of DATA`, 32 Bytes - Array of blob versioned hashes to validate. + +Client software **MUST** return `-32602: Invalid params` error unless all parameters and their fields are provided with non-`null` values. + +#### Response + +Refer to the response for [`engine_newPayloadV2`](./shanghai.md#engine_newpayloadv2). + +#### Specification + +This method follows the same specification as [`engine_newPayloadV2`](./shanghai.md#engine_newpayloadv2) with the addition of the following: + +1. Given the expected array of blob versioned hashes client software **MUST** run its validation by taking the following steps: + 1. Obtain an actual array by concatenating blob versioned hashes lists (`tx.blob_versioned_hashes`) of each [blob transaction](https://eips.ethereum.org/EIPS/eip-4844#new-transaction-type) included in the payload, respecting the order of inclusion. If the payload has no blob transactions the expected array **MUST** be `[]`. + 2. Return `{status: INVALID, latestValidHash: null, validationError: errorMessage | null}` if the expected and the actual arrays don't match. + + This validation **MUST** be instantly run in all cases even during active sync process. + +2. Client software **MUST** return `-38005: Unsupported fork` error if the `timestamp` of the payload is less than the Cancun activation timestamp. + +### engine_getPayloadV3 + +The response of this method is extended with [`BlobsBundleV1`](#blobsbundlev1) containing the blobs, their respective KZG commitments +and proofs corresponding to the `versioned_hashes` included in the blob transactions of the execution payload. + +#### Request + +* method: `engine_getPayloadV3` +* params: + 1. `payloadId`: `DATA`, 8 Bytes - Identifier of the payload build process +* timeout: 1s + +#### Response + +* result: `object` + - `executionPayload`: [`ExecutionPayloadV3`](#ExecutionPayloadV3) + - `blockValue` : `QUANTITY`, 256 Bits - The expected value to be received by the `feeRecipient` in wei + - `blobsBundle`: [`BlobsBundleV1`](#BlobsBundleV1) - Bundle with data corresponding to blob transactions included into `executionPayload` +* error: code and message set in case an exception happens while getting the payload. + +#### Specification + +Refer to the specification for [`engine_getPayloadV2`](./shanghai.md#engine_getpayloadv2) with addition of the following: + +1. The call **MUST** return empty `blobs`, `commitments` and `proofs` if the payload doesn't contain any blob transactions. + +2. The call **MUST** return `commitments` matching the versioned hashes of the transactions list of the execution payload, in the same order, + i.e. `assert verify_kzg_commitments_against_transactions(payload.transactions, blobsBundle.commitments)` (see EIP-4844 consensus-specs). + +3. The call **MUST** return `blobs` and `proofs` that match the `commitments` list, i.e. `assert len(blobsBundle.commitments) == len(blobsBundle.blobs) == len(blobsBundle.proofs)` and `assert verify_blob_kzg_proof_batch(blobsBundle.blobs, blobsBundle.commitments, blobsBundle.proofs)`. + +4. Client software **MUST** return `-38005: Unsupported fork` error if the `timestamp` of the built payload is less than the Cancun activation timestamp. From d8f299c7aaa192dd0c29d0f3646bd1bd0df3de7c Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Mon, 12 Jun 2023 15:35:59 +0600 Subject: [PATCH 2/8] Cosmetic fixes --- src/engine/cancun.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/cancun.md b/src/engine/cancun.md index 86f6ab866..0b756cc87 100644 --- a/src/engine/cancun.md +++ b/src/engine/cancun.md @@ -13,7 +13,7 @@ This specificaiton is based on and extends [Engine API - Shanghai](./shanghai.md ### ExecutionPayloadV3 -This structure has the syntax of `ExecutionPayloadV2` and append two new fields: `dataGasUsed` and `excessDataGas`. +This structure has the syntax of [`ExecutionPayloadV2`](./shanghai.md#executionpayloadv2) and append two new fields: `dataGasUsed` and `excessDataGas`. - `parentHash`: `DATA`, 32 Bytes - `feeRecipient`: `DATA`, 20 Bytes @@ -96,7 +96,7 @@ and proofs corresponding to the `versioned_hashes` included in the blob transact Refer to the specification for [`engine_getPayloadV2`](./shanghai.md#engine_getpayloadv2) with addition of the following: -1. The call **MUST** return empty `blobs`, `commitments` and `proofs` if the payload doesn't contain any blob transactions. +1. The call **MUST** return `blobsBundle` with empty `blobs`, `commitments` and `proofs` if the payload doesn't contain any blob transactions. 2. The call **MUST** return `commitments` matching the versioned hashes of the transactions list of the execution payload, in the same order, i.e. `assert verify_kzg_commitments_against_transactions(payload.transactions, blobsBundle.commitments)` (see EIP-4844 consensus-specs). From 1af068169a22fcde07b316af1e4f4bea20920d09 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Mon, 12 Jun 2023 19:56:04 +0600 Subject: [PATCH 3/8] Add toc --- src/engine/cancun.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/engine/cancun.md b/src/engine/cancun.md index 0b756cc87..5e19c9b77 100644 --- a/src/engine/cancun.md +++ b/src/engine/cancun.md @@ -9,8 +9,23 @@ This specificaiton is based on and extends [Engine API - Shanghai](./shanghai.md +- [Structures](#structures) + - [ExecutionPayloadV3](#executionpayloadv3) + - [BlobsBundleV1](#blobsbundlev1) +- [Methods](#methods) + - [engine_newPayloadV3](#engine_newpayloadv3) + - [Request](#request) + - [Response](#response) + - [Specification](#specification) + - [engine_getPayloadV3](#engine_getpayloadv3) + - [Request](#request-1) + - [Response](#response-1) + - [Specification](#specification-1) + +## Structures + ### ExecutionPayloadV3 This structure has the syntax of [`ExecutionPayloadV2`](./shanghai.md#executionpayloadv2) and append two new fields: `dataGasUsed` and `excessDataGas`. From ff3a3b39250b175ae3eacd7234dcbb1c43f9abc8 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Tue, 13 Jun 2023 12:08:42 +0600 Subject: [PATCH 4/8] Deprecate engine_exchangeTransitionConfigurationV1 --- src/engine/cancun.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/engine/cancun.md b/src/engine/cancun.md index 5e19c9b77..f92e8f7e3 100644 --- a/src/engine/cancun.md +++ b/src/engine/cancun.md @@ -21,6 +21,7 @@ This specificaiton is based on and extends [Engine API - Shanghai](./shanghai.md - [Request](#request-1) - [Response](#response-1) - [Specification](#specification-1) + - [Deprecate `engine_exchangeTransitionConfigurationV1`](#deprecate-engine_exchangetransitionconfigurationv1) @@ -119,3 +120,13 @@ Refer to the specification for [`engine_getPayloadV2`](./shanghai.md#engine_getp 3. The call **MUST** return `blobs` and `proofs` that match the `commitments` list, i.e. `assert len(blobsBundle.commitments) == len(blobsBundle.blobs) == len(blobsBundle.proofs)` and `assert verify_blob_kzg_proof_batch(blobsBundle.blobs, blobsBundle.commitments, blobsBundle.proofs)`. 4. Client software **MUST** return `-38005: Unsupported fork` error if the `timestamp` of the built payload is less than the Cancun activation timestamp. + +### Deprecate `engine_exchangeTransitionConfigurationV1` + +This document introduces deprecation of [`engine_exchangeTransitionConfigurationV1`](./paris.md#engine_exchangetransitionconfigurationv1). The deprecation is specified as follows: + +1. Consensus layer clients **MUST NOT** call this method. + +2. Execution layer clients **MUST NOT** surface an error message to the user if this method is not called. + +3. Consensus and execution layer clients **MAY** remove support of this method after Cancun. If no longer supported, this method **MUST** be removed from the [`engine_exchangeCapabilities`](./common.md#engine_exchangecapabilities) request or response list depending on whether it is consensus or execution layer client. From c96c8c5710d9c21a517877507e20b973467c21a9 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Wed, 14 Jun 2023 14:43:53 +0600 Subject: [PATCH 5/8] Define engine api openrpc schema for cancun --- src/engine/openrpc/methods/payload.yaml | 58 ++++++++++++++++++ src/engine/openrpc/schemas/payload.yaml | 81 +++++++++++++++++++++++++ src/schemas/base-types.yaml | 4 ++ 3 files changed, 143 insertions(+) diff --git a/src/engine/openrpc/methods/payload.yaml b/src/engine/openrpc/methods/payload.yaml index 1cd3f50c2..e8403dd66 100644 --- a/src/engine/openrpc/methods/payload.yaml +++ b/src/engine/openrpc/methods/payload.yaml @@ -31,6 +31,31 @@ errors: - code: -32602 message: Invalid params +- name: engine_newPayloadV3 + summary: Runs execution payload validation + externalDocs: + description: Method specification + url: https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_newpayloadv3 + params: + - name: Execution payload + required: true + schema: + $ref: '#/components/schemas/ExecutionPayloadV3' + - name: Blob versioned hashes + required: true + schema: + type: array + items: + $ref: '#/components/schemas/hash32' + result: + name: Payload status + schema: + $ref: '#/components/schemas/PayloadStatusNoInvalidBlockHash' + errors: + - code: -32602 + message: Invalid params + - code: -38005 + message: Unsupported fork - name: engine_getPayloadV1 summary: Obtains execution payload from payload build process externalDocs: @@ -77,6 +102,39 @@ errors: - code: -38001 message: Unknown payload +- name: engine_getPayloadV3 + summary: Obtains execution payload from payload build process + externalDocs: + description: Method specification + url: https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_getpayloadv3 + params: + - name: Payload id + required: true + schema: + $ref: '#/components/schemas/bytes8' + result: + name: Response object + schema: + type: object + required: + - executionPayload + - blockValue + - blobsBundle + properties: + executionPayload: + title: Execution payload + $ref: '#/components/schemas/ExecutionPayloadV3' + blockValue: + title: Expected fee value + $ref: '#/components/schemas/uint256' + blobsBundle: + title: Blobs bundle + $ref: '#/components/schemas/BlobsBundleV1' + errors: + - code: -38001 + message: Unknown payload + - code: -38005 + message: Unsupported fork - name: engine_getPayloadBodiesByHashV1 summary: Given block hashes returns bodies of the corresponding execution payloads externalDocs: diff --git a/src/engine/openrpc/schemas/payload.yaml b/src/engine/openrpc/schemas/payload.yaml index f4333fb45..4681408d0 100644 --- a/src/engine/openrpc/schemas/payload.yaml +++ b/src/engine/openrpc/schemas/payload.yaml @@ -185,6 +185,64 @@ ExecutionPayloadV2: type: array items: $ref: '#/components/schemas/WithdrawalV1' +ExecutionPayloadV3: + title: Execution payload object V3 + type: object + required: + - parentHash + - feeRecipient + - stateRoot + - receiptsRoot + - logsBloom + - prevRandao + - blockNumber + - gasLimit + - gasUsed + - timestamp + - extraData + - baseFeePerGas + - blockHash + - transactions + - withdrawals + - dataGasUsed + - excessDataGas + properties: + parentHash: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/parentHash' + feeRecipient: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/feeRecipient' + stateRoot: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/stateRoot' + receiptsRoot: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/receiptsRoot' + logsBloom: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/logsBloom' + prevRandao: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/prevRandao' + blockNumber: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/blockNumber' + gasLimit: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/gasLimit' + gasUsed: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/gasUsed' + timestamp: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/timestamp' + extraData: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/extraData' + baseFeePerGas: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/baseFeePerGas' + blockHash: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/blockHash' + transactions: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/transactions' + withdrawals: + $ref: '#/components/schemas/ExecutionPayloadV2/properties/withdrawals' + dataGasUsed: + title: Data gas used + $ref: '#/components/schemas/uint64' + excessDataGas: + title: Excess data gas + $ref: '#/components/schemas/uint64' ExecutionPayloadBodyV1: title: Execution payload body object V1 type: object @@ -200,3 +258,26 @@ ExecutionPayloadBodyV1: - 'null' items: $ref: '#/components/schemas/WithdrawalV1' +BlobsBundleV1: + title: Blobs bundle object V1 + type: object + required: + - commitments + - proofs + - blobs + properties: + commitments: + title: Commitments + type: array + items: + $ref: '#/components/schemas/bytes48' + proofs: + title: Proofs + type: array + items: + $ref: '#/components/schemas/bytes48' + blobs: + title: Blobs + type: array + items: + $ref: '#/components/schemas/bytes' diff --git a/src/schemas/base-types.yaml b/src/schemas/base-types.yaml index 71f8984ff..f9ff48ca8 100644 --- a/src/schemas/base-types.yaml +++ b/src/schemas/base-types.yaml @@ -27,6 +27,10 @@ bytes32: title: 32 hex encoded bytes type: string pattern: ^0x[0-9a-f]{64}$ +bytes48: + title: 48 hex encoded bytes + type: string + pattern: ^0x[0-9a-f]{96}$ bytes256: title: 256 hex encoded bytes type: string From 0de600f7077ca3cd1a61dd95239025c678eeb625 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Wed, 14 Jun 2023 14:45:08 +0600 Subject: [PATCH 6/8] Update src/engine/cancun.md Co-authored-by: Alex Stokes --- src/engine/cancun.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/cancun.md b/src/engine/cancun.md index f92e8f7e3..b0d8a2861 100644 --- a/src/engine/cancun.md +++ b/src/engine/cancun.md @@ -48,6 +48,7 @@ This structure has the syntax of [`ExecutionPayloadV2`](./shanghai.md#executionp - `withdrawals`: `Array of WithdrawalV1` - Array of withdrawals, each object is an `OBJECT` containing the fields of a `WithdrawalV1` structure. - `dataGasUsed`: `QUANTITY`, 64 bits - `excessDataGas`: `QUANTITY`, 64 Bits +- `parentBeaconBlockRoot`: `DATA`, 32 Bytes ### BlobsBundleV1 From 51da606df1d2fad05545384c6b4e284bcec8c6a2 Mon Sep 17 00:00:00 2001 From: Mikhail Kalinin Date: Wed, 14 Jun 2023 14:48:18 +0600 Subject: [PATCH 7/8] Add parentBeaconBlockRoot to schema --- src/engine/openrpc/schemas/payload.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/openrpc/schemas/payload.yaml b/src/engine/openrpc/schemas/payload.yaml index 4681408d0..75a048292 100644 --- a/src/engine/openrpc/schemas/payload.yaml +++ b/src/engine/openrpc/schemas/payload.yaml @@ -206,6 +206,7 @@ ExecutionPayloadV3: - withdrawals - dataGasUsed - excessDataGas + - parentBeaconBlockRoot properties: parentHash: $ref: '#/components/schemas/ExecutionPayloadV2/properties/parentHash' @@ -243,6 +244,9 @@ ExecutionPayloadV3: excessDataGas: title: Excess data gas $ref: '#/components/schemas/uint64' + parentBeaconBlockRoot: + title: Root of the parent beacon block + $ref: '#/components/schemas/bytes32' ExecutionPayloadBodyV1: title: Execution payload body object V1 type: object From a7560b60ace8b78a95e4794edbace91619dc8a66 Mon Sep 17 00:00:00 2001 From: Alex Stokes Date: Wed, 21 Jun 2023 16:04:53 -0600 Subject: [PATCH 8/8] move `blob-extension` specs into `cancun` spec --- src/engine/experimental/blob-extension.md | 120 ---------------------- 1 file changed, 120 deletions(-) delete mode 100644 src/engine/experimental/blob-extension.md diff --git a/src/engine/experimental/blob-extension.md b/src/engine/experimental/blob-extension.md deleted file mode 100644 index 4320450c5..000000000 --- a/src/engine/experimental/blob-extension.md +++ /dev/null @@ -1,120 +0,0 @@ - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [Shard Blob Extension](#shard-blob-extension) - - [Structures](#structures) - - [ExecutionPayloadV3](#executionpayloadv3) - - [BlobsBundleV1](#blobsbundlev1) - - [Methods](#methods) - - [engine_newPayloadV3](#engine_newpayloadv3) - - [Request](#request) - - [Response](#response) - - [Specification](#specification) - - [engine_getPayloadV3](#engine_getpayloadv3) - - [Request](#request-1) - - [Response](#response-1) - - [Specification](#specification-1) - - - -# Shard Blob Extension - -This is an extension specific to [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) to the structures and methods as defined in the [Engine API - Paris](../paris.md) and [Engine API - Shanghai](../shanghai.md). -This extension is backwards-compatible, but not part of the initial Engine API. - -## Structures - -### ExecutionPayloadV3 - -This structure has the syntax of `ExecutionPayloadV2` and append two new fields: `dataGasUsed` and `excessDataGas`. - -- `parentHash`: `DATA`, 32 Bytes -- `feeRecipient`: `DATA`, 20 Bytes -- `stateRoot`: `DATA`, 32 Bytes -- `receiptsRoot`: `DATA`, 32 Bytes -- `logsBloom`: `DATA`, 256 Bytes -- `prevRandao`: `DATA`, 32 Bytes -- `blockNumber`: `QUANTITY`, 64 Bits -- `gasLimit`: `QUANTITY`, 64 Bits -- `gasUsed`: `QUANTITY`, 64 Bits -- `timestamp`: `QUANTITY`, 64 Bits -- `extraData`: `DATA`, 0 to 32 Bytes -- `baseFeePerGas`: `QUANTITY`, 256 Bits -- `blockHash`: `DATA`, 32 Bytes -- `transactions`: `Array of DATA` - Array of transaction objects, each object is a byte list (`DATA`) representing `TransactionType || TransactionPayload` or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) -- `withdrawals`: `Array of WithdrawalV1` - Array of withdrawals, each object is an `OBJECT` containing the fields of a `WithdrawalV1` structure. -- `dataGasUsed`: `QUANTITY`, 64 bits -- `excessDataGas`: `QUANTITY`, 64 Bits - -### BlobsBundleV1 - -The fields are encoded as follows: - -- `commitments`: `Array of DATA` - Array of `KZGCommitment` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), 48 bytes each (`DATA`). -- `proofs`: `Array of DATA` - Array of `KZGProof` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), 48 bytes each (`DATA`). -- `blobs`: `Array of DATA` - Array of blobs, each blob is `FIELD_ELEMENTS_PER_BLOB * BYTES_PER_FIELD_ELEMENT = 4096 * 32 = 131072` bytes (`DATA`) representing a SSZ-encoded `Blob` as defined in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) - -All of the above three arrays **MUST** be of same length. - -## Methods - -### engine_newPayloadV3 - -#### Request - -* method: `engine_newPayloadV3` -* params: - 1. [`ExecutionPayloadV3`](#ExecutionPayloadV3). - 2. `Array of DATA`, 32 Bytes - Array of blob versioned hashes to validate. - -Client software **MUST** return `-32602: Invalid params` error unless all parameters and their fields are provided with non-`null` values. - -#### Response - -Refer to the response for `engine_newPayloadV2`. - -#### Specification - -This method follows the same specification as `engine_newPayloadV2` with the addition of the following: - -1. Given the expected array of blob versioned hashes client software **MUST** run its validation by taking the following steps: - 1. Obtain an actual array by concatenating blob versioned hashes lists (`tx.blob_versioned_hashes`) of each [blob transaction](https://eips.ethereum.org/EIPS/eip-4844#new-transaction-type) included in the payload, respecting the order of inclusion. If the payload has no blob transactions the expected array **MUST** be `[]`. - 2. Return `{status: INVALID, latestValidHash: null, validationError: errorMessage | null}` if the expected and the actual arrays don't match. - - This validation **MUST** be instantly run in all cases even during active sync process. - -2. Client software **MUST** return `-38005: Unsupported fork` error if the `timestamp` of the payload is less than the EIP-4844 activation timestamp. - -### engine_getPayloadV3 - -The response of this method is extended with [`BlobsBundleV1`](#blobsbundlev1) containing the blobs, their respective KZG commitments -and proofs corresponding to the `versioned_hashes` included in the blob transactions of the execution payload. - -#### Request - -* method: `engine_getPayloadV3` -* params: - 1. `payloadId`: `DATA`, 8 Bytes - Identifier of the payload build process -* timeout: 1s - -#### Response - -* result: `object` - - `executionPayload`: [`ExecutionPayloadV3`](#ExecutionPayloadV3) - - `blockValue` : `QUANTITY`, 256 Bits - The expected value to be received by the `feeRecipient` in wei - - `blobsBundle`: [`BlobsBundleV1`](#BlobsBundleV1) - Bundle with data corresponding to blob transactions included into `executionPayload` -* error: code and message set in case an exception happens while getting the payload. - -#### Specification - -Refer to the specification for `engine_getPayloadV2` with addition of the following: - -1. The call **MUST** return empty `blobs`, `commitments` and `proofs` if the paylaod doesn't contain any blob transactions. - -2. The call **MUST** return `commitments` matching the versioned hashes of the transactions list of the execution payload, in the same order, - i.e. `assert verify_kzg_commitments_against_transactions(payload.transactions, bundle.commitments)` (see EIP-4844 consensus-specs). - -3. The call **MUST** return `blobs` and `proofs` that match the `commitments` list, i.e. `assert len(commitments) == len(blobs) == len(proofs)` and `assert verify_blob_kzg_proof_batch(bundle.blobs, bundle.commitments, bundle.proofs)`. - -4. Client software **MUST** return `-38005: Unsupported fork` error if the `timestamp` of the built payload is less than the EIP-4844 activation timestamp.