From 97bc3611db7b4b60758c311e448d26514eb65ca8 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Wed, 26 Feb 2025 17:06:51 +0100 Subject: [PATCH] feat(engine): Op engine capabilities (#14733) Co-authored-by: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Co-authored-by: Matthias Seitz --- crates/node/builder/src/rpc.rs | 16 ++++++++++++++-- crates/optimism/node/src/rpc.rs | 3 ++- crates/optimism/rpc/src/engine.rs | 20 +++++++++++++++++++- crates/optimism/rpc/src/lib.rs | 2 +- crates/rpc/rpc-engine-api/src/engine_api.rs | 7 ++++++- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/crates/node/builder/src/rpc.rs b/crates/node/builder/src/rpc.rs index 3824d3dad9..d4a5d66426 100644 --- a/crates/node/builder/src/rpc.rs +++ b/crates/node/builder/src/rpc.rs @@ -7,6 +7,7 @@ use std::{ }; use crate::{BeaconConsensusEngineEvent, BeaconConsensusEngineHandle, EthApiBuilderCtx}; +use alloy_primitives::map::HashSet; use alloy_rpc_types::engine::{ClientVersionV1, ExecutionData}; use futures::TryFutureExt; use reth_chainspec::EthereumHardforks; @@ -664,6 +665,17 @@ pub trait EngineApiBuilder: Send + Sync { #[derive(Debug, Default)] pub struct BasicEngineApiBuilder { engine_validator_builder: EV, + capabilities: Option, +} + +impl BasicEngineApiBuilder { + /// Sets list of capabilities supported by engine API. Takes list of method names. + pub fn capabilities(mut self, caps: &[&str]) -> Self { + self.capabilities = Some(EngineCapabilities::new( + caps.iter().map(|cap| cap.to_string()).collect::>(), + )); + self + } } impl EngineApiBuilder for BasicEngineApiBuilder @@ -685,7 +697,7 @@ where >; async fn build_engine_api(self, ctx: &AddOnsContext<'_, N>) -> eyre::Result { - let Self { engine_validator_builder } = self; + let Self { engine_validator_builder, capabilities } = self; let engine_validator = engine_validator_builder.build(ctx).await?; let client = ClientVersionV1 { @@ -702,7 +714,7 @@ where ctx.node.pool().clone(), Box::new(ctx.node.task_executor().clone()), client, - EngineCapabilities::default(), + capabilities.unwrap_or_default(), engine_validator, )) } diff --git a/crates/optimism/node/src/rpc.rs b/crates/optimism/node/src/rpc.rs index 1da0d0dc15..cefed27fb9 100644 --- a/crates/optimism/node/src/rpc.rs +++ b/crates/optimism/node/src/rpc.rs @@ -1,5 +1,6 @@ //! RPC component builder +use reth_optimism_rpc::engine::OP_CAPABILITIES; pub use reth_optimism_rpc::OpEngineApi; use alloy_rpc_types_engine::ExecutionData; @@ -34,7 +35,7 @@ where >; async fn build_engine_api(self, ctx: &AddOnsContext<'_, N>) -> eyre::Result { - let inner = self.inner.build_engine_api(ctx).await?; + let inner = self.inner.capabilities(OP_CAPABILITIES).build_engine_api(ctx).await?; Ok(OpEngineApi::new(inner)) } diff --git a/crates/optimism/rpc/src/engine.rs b/crates/optimism/rpc/src/engine.rs index 52dba10eb2..69545827ff 100644 --- a/crates/optimism/rpc/src/engine.rs +++ b/crates/optimism/rpc/src/engine.rs @@ -17,6 +17,24 @@ use reth_rpc_api::IntoEngineApiRpcModule; use reth_rpc_engine_api::{EngineApi, EngineApiServer}; use reth_transaction_pool::TransactionPool; +/// The list of all supported Engine capabilities available over the engine endpoint. +/// +/// Spec: +pub const OP_CAPABILITIES: &[&str] = &[ + "engine_forkchoiceUpdatedV2", + "engine_forkchoiceUpdatedV3", + "engine_exchangeTransitionConfigurationV1", + "engine_getClientVersionV1", + "engine_getPayloadV2", + "engine_getPayloadV3", + "engine_getPayloadV4", + "engine_newPayloadV2", + "engine_newPayloadV3", + "engine_newPayloadV4", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1", +]; + /// Extension trait that gives access to Optimism engine API RPC methods. /// /// Note: @@ -311,7 +329,7 @@ where } async fn exchange_capabilities(&self, _capabilities: Vec) -> RpcResult> { - EngineApiServer::exchange_capabilities(&self.inner, _capabilities).await + Ok(self.inner.capabilities().list()) } } diff --git a/crates/optimism/rpc/src/lib.rs b/crates/optimism/rpc/src/lib.rs index b92e0c1064..d343e32d1a 100644 --- a/crates/optimism/rpc/src/lib.rs +++ b/crates/optimism/rpc/src/lib.rs @@ -17,7 +17,7 @@ pub mod witness; #[cfg(feature = "client")] pub use engine::OpEngineApiClient; -pub use engine::{OpEngineApi, OpEngineApiServer}; +pub use engine::{OpEngineApi, OpEngineApiServer, OP_CAPABILITIES}; pub use error::{OpEthApiError, OpInvalidTransactionError, SequencerClientError}; pub use eth::{OpEthApi, OpReceiptBuilder}; pub use sequencer::SequencerClient; diff --git a/crates/rpc/rpc-engine-api/src/engine_api.rs b/crates/rpc/rpc-engine-api/src/engine_api.rs index b7f3b03df9..37405a8d15 100644 --- a/crates/rpc/rpc-engine-api/src/engine_api.rs +++ b/crates/rpc/rpc-engine-api/src/engine_api.rs @@ -553,6 +553,11 @@ where Ok(self.inner.beacon_consensus.fork_choice_updated(state, payload_attrs, version).await?) } + + /// Returns reference to supported capabilities. + pub fn capabilities(&self) -> &EngineCapabilities { + &self.inner.capabilities + } } impl @@ -1009,7 +1014,7 @@ where /// Handler for `engine_exchangeCapabilitiesV1` /// See also async fn exchange_capabilities(&self, _capabilities: Vec) -> RpcResult> { - Ok(self.inner.capabilities.list()) + Ok(self.capabilities().list()) } async fn get_blobs_v1(