Engine API changes introduced in Amsterdam.
This specification is based on and extends Engine API - Osaka specification.
Table of contents
- Structures
- Methods
Structures
ExecutionPayloadV4
This structure has the syntax of ExecutionPayloadV3 and appends the new field: blockAccessList.
parentHash:DATA, 32 BytesfeeRecipient:DATA, 20 BytesstateRoot:DATA, 32 BytesreceiptsRoot:DATA, 32 ByteslogsBloom:DATA, 256 BytesprevRandao:DATA, 32 BytesblockNumber:QUANTITY, 64 BitsgasLimit:QUANTITY, 64 BitsgasUsed:QUANTITY, 64 Bitstimestamp:QUANTITY, 64 BitsextraData:DATA, 0 to 32 BytesbaseFeePerGas:QUANTITY, 256 BitsblockHash:DATA, 32 Bytestransactions:Array of DATA- Array of transaction objects, each object is a byte list (DATA) representingTransactionType || TransactionPayloadorLegacyTransactionas defined in EIP-2718withdrawals:Array of WithdrawalV1- Array of withdrawals, each object is anOBJECTcontaining the fields of aWithdrawalV1structure.blobGasUsed:QUANTITY, 64 BitsexcessBlobGas:QUANTITY, 64 BitsblockAccessList:DATA- RLP-encoded block access list as defined in EIP-7928slotNumber:QUANTITY, 64 Bits
ExecutionPayloadBodyV2
This structure has the syntax of ExecutionPayloadBodyV1 and appends the new field: blockAccessList.
transactions:Array of DATA- Array of transaction objects, each object is a byte list (DATA) representingTransactionType || TransactionPayloadorLegacyTransactionas defined in EIP-2718withdrawals:Array of WithdrawalV1- Array of withdrawals, each object is anOBJECTcontaining the fields of aWithdrawalV1structure. Value isnullfor blocks produced before Shanghai.blockAccessList:DATA|null- RLP-encoded block access list as defined in EIP-7928. Value isnullfor blocks produced before Amsterdam or if the data has been pruned.
PayloadAttributesV4
This structure has the syntax of PayloadAttributesV3 and appends two new fields: slotNumber and targetGasLimit.
timestamp:QUANTITY, 64 Bits - value for thetimestampfield of the new payloadprevRandao:DATA, 32 Bytes - value for theprevRandaofield of the new payloadsuggestedFeeRecipient:DATA, 20 Bytes - suggested value for thefeeRecipientfield of the new payloadwithdrawals:Array of WithdrawalV1- Array of withdrawals, each object is anOBJECTcontaining the fields of aWithdrawalV1structure.parentBeaconBlockRoot:DATA, 32 Bytes - Root of the parent beacon block.slotNumber:QUANTITY, 64 Bits - value for theslotNumberfield of the new payloadtargetGasLimit:QUANTITY, 64 Bits - target value for thegasLimitfield of the new payload
BlobCellsAndProofsV1
blob_cells:Array of DATA|null- a sequence of byte arrays (DATA) representing the partial matrix of the requested blobs, withnullentries for missing cells.proofs:Array of DATA|null- Array ofKZGProofas defined in EIP-4844, 48 bytes each (DATA). Entries corresponding tonullcells MUST also benull.
Methods
engine_newPayloadV5
This method is updated to support the new ExecutionPayloadV4 structure.
Request
- method:
engine_newPayloadV5 - params:
executionPayload:ExecutionPayloadV4.expectedBlobVersionedHashes:Array of DATA, 32 Bytes - Array of expected blob versioned hashes to validate.parentBeaconBlockRoot:DATA, 32 Bytes - Root of the parent beacon block.executionRequests:Array of DATA- List of execution layer triggered requests.
- timeout: 6s
Response
Refer to the response for engine_newPayloadV4.
Specification
This method follows the same specification as engine_newPayloadV4 with the following changes:
-
Client software MUST return
-38005: Unsupported forkerror if thetimestampof the payload does not fall within the time frame of the Amsterdam fork. -
Client software MUST return
-32602: Invalid paramserror if theblockAccessListfield is missing. -
Client software MUST return
{status: INVALID, latestValidHash: null, validationError: errorMessage | null}if theblockAccessListfield is not a valid RLP encoding of the block access list as defined in EIP-7928.
engine_getPayloadV6
This method is updated to return the new ExecutionPayloadV4 structure.
Request
- method:
engine_getPayloadV6 - params:
payloadId:DATA, 8 Bytes - Identifier of the payload build process
- timeout: 1s
Response
- result:
objectexecutionPayload:ExecutionPayloadV4blockValue:QUANTITY, 256 Bits - The expected value to be received by thefeeRecipientin weiblobsBundle:BlobsBundleV2- Bundle with data corresponding to blob transactions included intoexecutionPayloadshouldOverrideBuilder:BOOLEAN- Suggestion from the execution layer to use thisexecutionPayloadinstead of an externally provided oneexecutionRequests:Array of DATA- Execution layer triggered requests obtained from theexecutionPayloadtransaction execution.
- error: code and message set in case an exception happens while getting the payload.
Specification
This method follows the same specification as engine_getPayloadV5 with the following changes:
- Client software MUST return
-38005: Unsupported forkerror if thetimestampof the built payload does not fall within the time frame of the Amsterdam fork.
engine_getPayloadBodiesByHashV2
This method retrieves execution payload bodies including block access lists for specified blocks.
Request
- method:
engine_getPayloadBodiesByHashV2 - params:
blockHashes:Array of DATA, 32 Bytes - Array of block hashes to retrieve payload bodies for
- timeout: 10s
Response
- result:
Array of ExecutionPayloadBodyV2- Array ofExecutionPayloadBodyV2objects ornullfor blocks that are unavailable - error: code and message set in case an exception happens while getting the payload bodies.
Specification
This method follows the same specification as engine_getPayloadBodiesByHashV1 with the following additions:
-
Client software MUST set the
blockAccessListfield tonullfor blocks that predate the Amsterdam fork activation. -
Client software MUST set the
blockAccessListfield tonullif the block access list has been pruned from storage.
engine_getPayloadBodiesByRangeV2
This method retrieves execution payload bodies including block access lists for a range of blocks.
Request
- method:
engine_getPayloadBodiesByRangeV2 - params:
start:QUANTITY, 64 Bits - Starting block numbercount:QUANTITY, 64 Bits - Number of blocks to retrieve payload bodies for
- timeout: 10s
Response
- result:
Array of ExecutionPayloadBodyV2- Array ofExecutionPayloadBodyV2objects ornullfor blocks that are unavailable - error: code and message set in case an exception happens while getting the payload bodies.
Specification
This method follows the same specification as engine_getPayloadBodiesByRangeV1 with the following additions:
-
Client software MUST set the
blockAccessListfield tonullfor blocks that predate the Amsterdam fork activation. -
Client software MUST set the
blockAccessListfield tonullif the block access list has been pruned from storage.
engine_forkchoiceUpdatedV4
Request
- method:
engine_forkchoiceUpdatedV4 - params:
forkchoiceState:ForkchoiceStateV1.payloadAttributes:Object|null- Instance ofPayloadAttributesV4ornull.custodyColumns:DATA|null, 16 Bytes - Interpreted as a bitarray of lengthCELLS_PER_EXT_BLOBindicating which column indices form the CL’s custody set, ornullif the CL does not provide custody services.
- timeout: 8s
Response
Refer to the response for engine_forkchoiceUpdatedV3.
Specification
This method follows the same specification as engine_forkchoiceUpdatedV3 with the following changes to the processing flow:
-
Extend point (8) of the
engine_forkchoiceUpdatedV1specification by defining the following sequence of checks that MUST be run overpayloadAttributes:-
payloadAttributesmatches thePayloadAttributesV4structure, return-38003: Invalid payload attributeson failure. -
payloadAttributes.timestampdoes not fall within the time frame of the Amsterdam fork, return-38005: Unsupported forkon failure.
-
-
Client software MUST use the target gas limit supplied in
payloadAttributes.targetGasLimitwhen constructing a payload. -
If
custodyColumnsis provided (non-null), the following rules apply:-
custodyColumnsMUST be a 16-byteDATAvalue. If it is not, the client software MUST return-32602: Invalid params. -
The Execution client MUST adopt the provided custody set when acting as a sampler for type 3 transactions.
-
For type 3 transactions pending in the blobpool:
-
If the custody set has expanded, the Execution client SHOULD issue new sampling requests for the delta. It MAY broadcast an updated
NewPooledTransactionHashesannouncement with the newly available set. -
If the custody set has contracted, the Execution client MAY prune dropped cells from local storage. To prevent peers from perceiving an availability fault, this pruning SHOULD occur only after a delay of 2 slots following the broadcast of an updated
NewPooledTransactionHashesannouncement that reflects the reduced set.
-
-
The Execution client MUST run custody set update independently to the fork choice update, i.e. execution time errors occurred during custody set update MUST NOT affect the main processing flow of this method.
-
engine_getBlobsV4
Consensus layer clients MAY use this method to fetch blob cells from the execution layer blob pool, with support for partial responses. Unlike engine_getBlobsV3, this method returns individual cells and their KZG proofs rather than full blobs.
Request
- method:
engine_getBlobsV4 - params:
versioned_blob_hashes:Array of DATA, 32 Bytes - an array of blob versioned hashes.indices_bitarray:DATA, 16 Bytes - a bitarray denoting the indices of the cells to retrieve.
- timeout: 1s
Response
- result:
(Array of BlobCellsAndProofsV1) | null- Array ofBlobCellsAndProofsV1, insertingnullonly at the positions of the missing blobs, or anullliteral in the designated cases specified below. - error: code and message set in case an error occurs during processing of the request.
Specification
- Given an array of blob versioned hashes and a cell indices bitarray, client software MUST respond with an array of
BlobCellsAndProofsV1objects with matching versioned hashes, respecting the order of versioned hashes in the input array. EachBlobCellsAndProofsV1object contains only the cells at the indices specified by the bitarray and their corresponding KZG proofs. - Given an array of blob versioned hashes and a cell indices bitarray, if client software has every one of the requested blobs, it MUST return an array of
BlobCellsAndProofsV1objects whose order exactly matches the input array. The sameindices_bitarrayis applied to extract cells from each blob. For instance, if the request is[A_versioned_hash, B_versioned_hash, C_versioned_hash]with a specificindices_bitarray, and client software hasA,BandCavailable, the response MUST be[A_cells_and_proofs, B_cells_and_proofs, C_cells_and_proofs], where each object contains the cells at the indices specified by the bitarray. - If one or more of the requested blobs are unavailable, the client MUST return an array of the same length and order, inserting
nullonly at the positions of the missing blobs. For instance, if the request is[A_versioned_hash, B_versioned_hash, C_versioned_hash]and client software has data for blobsAandC, but doesn’t have data forB, the response MUST be[A_cells_and_proofs, null, C_cells_and_proofs]. If all blobs are missing, the client software must return an array of matching length, filled withnullat all positions. - Within a
BlobCellsAndProofsV1object, if specific cells are unavailable for an otherwise available blob, those cells MUST be set tonullin theblob_cellsarray, and the corresponding entries in theproofsarray MUST also benull. - Client software MUST support request sizes of at least 128 blob versioned hashes. The client MUST return
-38004: Too large requesterror if the number of requested blobs is too large. - Client software MUST return
nullif syncing or otherwise unable to generally serve blob pool data. - Callers MUST consider that execution layer clients may prune old blobs from their pool, and will respond with
nullat the corresponding position if a blob has been pruned.
Update the methods of previous forks
Osaka API
For the following methods:
a validation MUST be added:
- Client software MUST return
-38005: Unsupported forkerror if thetimestampof payload is greater than or equal to the Amsterdam activation timestamp.