diff --git a/crates/engine/primitives/src/lib.rs b/crates/engine/primitives/src/lib.rs index a16b5b1c45..e97cb3b104 100644 --- a/crates/engine/primitives/src/lib.rs +++ b/crates/engine/primitives/src/lib.rs @@ -62,7 +62,8 @@ pub trait EngineTypes: + TryInto + TryInto + TryInto - + TryInto, + + TryInto + + TryInto, > + DeserializeOwned + Serialize { @@ -106,6 +107,14 @@ pub trait EngineTypes: + Send + Sync + 'static; + /// Execution Payload V6 envelope type. + type ExecutionPayloadEnvelopeV6: DeserializeOwned + + Serialize + + Clone + + Unpin + + Send + + Sync + + 'static; } /// Type that validates the payloads processed by the engine API. diff --git a/crates/ethereum/engine-primitives/src/lib.rs b/crates/ethereum/engine-primitives/src/lib.rs index 95c317a8c0..58aa7a1767 100644 --- a/crates/ethereum/engine-primitives/src/lib.rs +++ b/crates/ethereum/engine-primitives/src/lib.rs @@ -17,10 +17,11 @@ pub use payload::{payload_id, BlobSidecars, EthBuiltPayload, EthPayloadBuilderAt mod error; pub use error::*; -use alloy_rpc_types_engine::{ExecutionData, ExecutionPayload, ExecutionPayloadEnvelopeV5}; +use alloy_rpc_types_engine::{ExecutionData, ExecutionPayload}; pub use alloy_rpc_types_engine::{ ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, ExecutionPayloadEnvelopeV4, - ExecutionPayloadV1, PayloadAttributes as EthPayloadAttributes, + ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, ExecutionPayloadV1, + PayloadAttributes as EthPayloadAttributes, }; use reth_engine_primitives::EngineTypes; use reth_payload_primitives::{BuiltPayload, PayloadTypes}; @@ -66,13 +67,15 @@ where + TryInto + TryInto + TryInto - + TryInto, + + TryInto + + TryInto, { type ExecutionPayloadEnvelopeV1 = ExecutionPayloadV1; type ExecutionPayloadEnvelopeV2 = ExecutionPayloadEnvelopeV2; type ExecutionPayloadEnvelopeV3 = ExecutionPayloadEnvelopeV3; type ExecutionPayloadEnvelopeV4 = ExecutionPayloadEnvelopeV4; type ExecutionPayloadEnvelopeV5 = ExecutionPayloadEnvelopeV5; + type ExecutionPayloadEnvelopeV6 = ExecutionPayloadEnvelopeV6; } /// A default payload type for [`EthEngineTypes`] diff --git a/crates/ethereum/engine-primitives/src/payload.rs b/crates/ethereum/engine-primitives/src/payload.rs index 61b891e19d..fb71371e71 100644 --- a/crates/ethereum/engine-primitives/src/payload.rs +++ b/crates/ethereum/engine-primitives/src/payload.rs @@ -11,8 +11,8 @@ use alloy_primitives::{Address, B256, U256}; use alloy_rlp::Encodable; use alloy_rpc_types_engine::{ BlobsBundleV1, BlobsBundleV2, ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, - ExecutionPayloadEnvelopeV4, ExecutionPayloadEnvelopeV5, ExecutionPayloadFieldV2, - ExecutionPayloadV1, ExecutionPayloadV3, PayloadAttributes, PayloadId, + ExecutionPayloadEnvelopeV4, ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, + ExecutionPayloadFieldV2, ExecutionPayloadV1, ExecutionPayloadV3, PayloadAttributes, PayloadId, }; use core::convert::Infallible; use reth_ethereum_primitives::EthPrimitives; @@ -160,6 +160,13 @@ impl EthBuiltPayload { execution_requests: requests.unwrap_or_default(), }) } + + /// Try converting built payload into [`ExecutionPayloadEnvelopeV6`]. + /// + /// Note: Amsterdam fork is not yet implemented, so this conversion is not yet supported. + pub fn try_into_v6(self) -> Result { + unimplemented!("ExecutionPayloadEnvelopeV6 not yet supported") + } } impl BuiltPayload for EthBuiltPayload { @@ -227,6 +234,14 @@ impl TryFrom for ExecutionPayloadEnvelopeV5 { } } +impl TryFrom for ExecutionPayloadEnvelopeV6 { + type Error = BuiltPayloadConversionError; + + fn try_from(value: EthBuiltPayload) -> Result { + value.try_into_v6() + } +} + /// An enum representing blob transaction sidecars belonging to [`EthBuiltPayload`]. #[derive(Clone, Default, Debug)] pub enum BlobSidecars { diff --git a/crates/optimism/node/src/engine.rs b/crates/optimism/node/src/engine.rs index 386026f234..652bb44f47 100644 --- a/crates/optimism/node/src/engine.rs +++ b/crates/optimism/node/src/engine.rs @@ -62,6 +62,7 @@ where type ExecutionPayloadEnvelopeV3 = OpExecutionPayloadEnvelopeV3; type ExecutionPayloadEnvelopeV4 = OpExecutionPayloadEnvelopeV4; type ExecutionPayloadEnvelopeV5 = OpExecutionPayloadEnvelopeV4; + type ExecutionPayloadEnvelopeV6 = OpExecutionPayloadEnvelopeV4; } /// Validator for Optimism engine API. diff --git a/crates/rpc/rpc-api/src/engine.rs b/crates/rpc/rpc-api/src/engine.rs index aca0af4e76..520058f0bb 100644 --- a/crates/rpc/rpc-api/src/engine.rs +++ b/crates/rpc/rpc-api/src/engine.rs @@ -12,7 +12,8 @@ use alloy_json_rpc::RpcObject; use alloy_primitives::{Address, BlockHash, Bytes, B256, U256, U64}; use alloy_rpc_types_engine::{ ClientVersionV1, ExecutionPayloadBodiesV1, ExecutionPayloadInputV2, ExecutionPayloadV1, - ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, + ExecutionPayloadV3, ExecutionPayloadV4, ForkchoiceState, ForkchoiceUpdated, PayloadId, + PayloadStatus, }; use alloy_rpc_types_eth::{ state::StateOverride, BlockOverrides, EIP1186AccountProofResponse, Filter, Log, SyncStatus, @@ -73,6 +74,18 @@ pub trait EngineApi { execution_requests: RequestsOrHash, ) -> RpcResult; + /// Post Amsterdam payload handler + /// + /// See also + #[method(name = "newPayloadV5")] + async fn new_payload_v5( + &self, + payload: ExecutionPayloadV4, + versioned_hashes: Vec, + parent_beacon_block_root: B256, + execution_requests: RequestsOrHash, + ) -> RpcResult; + /// See also /// /// Caution: This should not accept the `withdrawals` field in the payload attributes. @@ -178,6 +191,19 @@ pub trait EngineApi { payload_id: PayloadId, ) -> RpcResult; + /// Post Amsterdam payload handler. + /// + /// See also + /// + /// Returns the most recent version of the payload that is available in the corresponding + /// payload build process at the time of receiving this call. Note: + /// > Provider software MAY stop the corresponding build process after serving this call. + #[method(name = "getPayloadV6")] + async fn get_payload_v6( + &self, + payload_id: PayloadId, + ) -> RpcResult; + /// See also #[method(name = "getPayloadBodiesByHashV1")] async fn get_payload_bodies_by_hash_v1( diff --git a/crates/rpc/rpc-engine-api/src/engine_api.rs b/crates/rpc/rpc-engine-api/src/engine_api.rs index 5a7b69dd9e..4c0eeed026 100644 --- a/crates/rpc/rpc-engine-api/src/engine_api.rs +++ b/crates/rpc/rpc-engine-api/src/engine_api.rs @@ -11,8 +11,8 @@ use alloy_primitives::{BlockHash, BlockNumber, B256, U64}; use alloy_rpc_types_engine::{ CancunPayloadFields, ClientVersionV1, ExecutionData, ExecutionPayloadBodiesV1, ExecutionPayloadBodyV1, ExecutionPayloadInputV2, ExecutionPayloadSidecar, ExecutionPayloadV1, - ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, - PraguePayloadFields, + ExecutionPayloadV3, ExecutionPayloadV4, ForkchoiceState, ForkchoiceUpdated, PayloadId, + PayloadStatus, PraguePayloadFields, }; use async_trait::async_trait; use jsonrpsee_core::{server::RpcModule, RpcResult}; @@ -963,6 +963,24 @@ where Ok(self.new_payload_v4_metered(payload).await?) } + /// Handler for `engine_newPayloadV5` + /// + /// Post Amsterdam payload handler. Currently returns unsupported fork error. + /// + /// See also + async fn new_payload_v5( + &self, + _payload: ExecutionPayloadV4, + _versioned_hashes: Vec, + _parent_beacon_block_root: B256, + _execution_requests: RequestsOrHash, + ) -> RpcResult { + trace!(target: "rpc::engine", "Serving engine_newPayloadV5"); + Err(EngineApiError::EngineObjectValidationError( + reth_payload_primitives::EngineObjectValidationError::UnsupportedFork, + ))? + } + /// Handler for `engine_forkchoiceUpdatedV1` /// See also /// @@ -1086,6 +1104,21 @@ where Ok(self.get_payload_v5_metered(payload_id).await?) } + /// Handler for `engine_getPayloadV6` + /// + /// Post Amsterdam payload handler. Currently returns unsupported fork error. + /// + /// See also + async fn get_payload_v6( + &self, + _payload_id: PayloadId, + ) -> RpcResult { + trace!(target: "rpc::engine", "Serving engine_getPayloadV6"); + Err(EngineApiError::EngineObjectValidationError( + reth_payload_primitives::EngineObjectValidationError::UnsupportedFork, + ))? + } + /// Handler for `engine_getPayloadBodiesByHashV1` /// See also async fn get_payload_bodies_by_hash_v1( diff --git a/examples/custom-engine-types/src/main.rs b/examples/custom-engine-types/src/main.rs index a26ce1594a..e799d89c71 100644 --- a/examples/custom-engine-types/src/main.rs +++ b/examples/custom-engine-types/src/main.rs @@ -23,8 +23,8 @@ use alloy_primitives::{Address, B256}; use alloy_rpc_types::{ engine::{ ExecutionData, ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, - ExecutionPayloadEnvelopeV4, ExecutionPayloadEnvelopeV5, ExecutionPayloadV1, - PayloadAttributes as EthPayloadAttributes, PayloadId, + ExecutionPayloadEnvelopeV4, ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, + ExecutionPayloadV1, PayloadAttributes as EthPayloadAttributes, PayloadId, }, Withdrawal, }; @@ -169,6 +169,7 @@ impl EngineTypes for CustomEngineTypes { type ExecutionPayloadEnvelopeV3 = ExecutionPayloadEnvelopeV3; type ExecutionPayloadEnvelopeV4 = ExecutionPayloadEnvelopeV4; type ExecutionPayloadEnvelopeV5 = ExecutionPayloadEnvelopeV5; + type ExecutionPayloadEnvelopeV6 = ExecutionPayloadEnvelopeV6; } /// Custom engine validator