From 7fb74066b80203048ccad463ee96dd85a961dcfc Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 4 Feb 2025 13:58:11 +0100 Subject: [PATCH] feat: type erase concrete engine server trait (#14204) --- crates/rpc/rpc-api/src/engine.rs | 13 ++++++++++- crates/rpc/rpc-api/src/lib.rs | 2 +- crates/rpc/rpc-builder/src/lib.rs | 26 +++++++-------------- crates/rpc/rpc-engine-api/src/engine_api.rs | 15 ++++++++++-- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/crates/rpc/rpc-api/src/engine.rs b/crates/rpc/rpc-api/src/engine.rs index 22dbc822d..d75d44cfa 100644 --- a/crates/rpc/rpc-api/src/engine.rs +++ b/crates/rpc/rpc-api/src/engine.rs @@ -16,8 +16,19 @@ use alloy_rpc_types_eth::{ EIP1186AccountProofResponse, Filter, Log, SyncStatus, }; use alloy_serde::JsonStorageKey; -use jsonrpsee::{core::RpcResult, proc_macros::rpc}; +use jsonrpsee::{core::RpcResult, proc_macros::rpc, RpcModule}; use reth_engine_primitives::EngineTypes; + +/// Helper trait for the engine api server. +/// +/// This type-erases the concrete [`jsonrpsee`] server implementation and only returns the +/// [`RpcModule`] that contains all the endpoints of the server. +pub trait IntoEngineApiRpcModule { + /// Consumes the type and returns all the methods and subscriptions defined in the trait and + /// returns them as a single [`RpcModule`] + fn into_rpc_module(self) -> RpcModule<()>; +} + // NOTE: We can't use associated types in the `EngineApi` trait because of jsonrpsee, so we use a // generic here. It would be nice if the rpc macro would understand which types need to have serde. // By default, if the trait has a generic, the rpc macro will add e.g. `Engine: DeserializeOwned` to diff --git a/crates/rpc/rpc-api/src/lib.rs b/crates/rpc/rpc-api/src/lib.rs index 196a4f4ec..87c6605df 100644 --- a/crates/rpc/rpc-api/src/lib.rs +++ b/crates/rpc/rpc-api/src/lib.rs @@ -39,7 +39,7 @@ pub mod servers { pub use crate::{ admin::AdminApiServer, debug::{DebugApiServer, DebugExecutionWitnessApiServer}, - engine::{EngineApiServer, EngineEthApiServer}, + engine::{EngineApiServer, EngineEthApiServer, IntoEngineApiRpcModule}, mev::{MevFullApiServer, MevSimApiServer}, miner::MinerApiServer, net::NetApiServer, diff --git a/crates/rpc/rpc-builder/src/lib.rs b/crates/rpc/rpc-builder/src/lib.rs index 68aeb1629..0886da8d4 100644 --- a/crates/rpc/rpc-builder/src/lib.rs +++ b/crates/rpc/rpc-builder/src/lib.rs @@ -89,14 +89,14 @@ //! //! ``` //! use reth_consensus::{ConsensusError, FullConsensus}; -//! use reth_engine_primitives::{EngineTypes, ExecutionData, PayloadValidator}; +//! use reth_engine_primitives::{ExecutionData, PayloadValidator}; //! use reth_evm::{execute::BlockExecutorProvider, ConfigureEvm}; //! use reth_evm_ethereum::EthEvmConfig; //! use reth_network_api::{NetworkInfo, Peers}; //! use reth_primitives::{Header, PooledTransaction, TransactionSigned}; //! use reth_provider::{AccountReader, CanonStateSubscriptions, ChangeSetReader, FullRpcProvider}; //! use reth_rpc::EthApi; -//! use reth_rpc_api::EngineApiServer; +//! use reth_rpc_api::{EngineApiServer, IntoEngineApiRpcModule}; //! use reth_rpc_builder::{ //! auth::AuthServerConfig, RethRpcModule, RpcModuleBuilder, RpcServerConfig, //! TransportRpcModuleConfig, @@ -120,7 +120,7 @@ //! provider: Provider, //! pool: Pool, //! network: Network, -//! engine_api: EngineApi, +//! engine_api: impl IntoEngineApiRpcModule, //! evm_config: EthEvmConfig, //! block_executor: BlockExecutor, //! consensus: Consensus, @@ -142,8 +142,6 @@ //! > + Unpin //! + 'static, //! Network: NetworkInfo + Peers + Clone + 'static, -//! EngineApi: EngineApiServer, -//! EngineT: EngineTypes, //! BlockExecutor: BlockExecutorProvider, //! Consensus: FullConsensus + Clone + 'static, //! Validator: PayloadValidator, @@ -213,7 +211,7 @@ use jsonrpsee::{ }; use reth_chainspec::EthereumHardforks; use reth_consensus::{ConsensusError, FullConsensus}; -use reth_engine_primitives::{EngineTypes, ExecutionData, PayloadValidator}; +use reth_engine_primitives::{ExecutionData, PayloadValidator}; use reth_evm::{execute::BlockExecutorProvider, ConfigureEvm}; use reth_network_api::{noop::NoopNetwork, NetworkInfo, Peers}; use reth_primitives::NodePrimitives; @@ -611,10 +609,10 @@ where /// also configures the auth (engine api) server, which exposes a subset of the `eth_` /// namespace. #[allow(clippy::type_complexity)] - pub fn build_with_auth_server( + pub fn build_with_auth_server( self, module_config: TransportRpcModuleConfig, - engine: EngineApi, + engine: impl IntoEngineApiRpcModule, eth: DynEthApiBuilder, payload_validator: Arc< dyn PayloadValidator, @@ -625,8 +623,6 @@ where RpcRegistryInner, ) where - EngineT: EngineTypes, - EngineApi: EngineApiServer, EthApi: FullEthApiServer< Provider: BlockReader< Block = ::Block, @@ -1268,14 +1264,8 @@ where /// * `api_` namespace /// /// Note: This does _not_ register the `engine_` in this registry. - pub fn create_auth_module(&self, engine_api: EngineApi) -> AuthRpcModule - where - EngineT: EngineTypes, - EngineApi: EngineApiServer, - { - let mut module = RpcModule::new(()); - - module.merge(engine_api.into_rpc()).expect("No conflicting methods"); + pub fn create_auth_module(&self, engine_api: impl IntoEngineApiRpcModule) -> AuthRpcModule { + let mut module = engine_api.into_rpc_module(); // also merge a subset of `eth_` handlers let eth_handlers = self.eth_handlers(); diff --git a/crates/rpc/rpc-engine-api/src/engine_api.rs b/crates/rpc/rpc-engine-api/src/engine_api.rs index 9a42aa3a4..e9945fc04 100644 --- a/crates/rpc/rpc-engine-api/src/engine_api.rs +++ b/crates/rpc/rpc-engine-api/src/engine_api.rs @@ -15,7 +15,7 @@ use alloy_rpc_types_engine::{ PraguePayloadFields, TransitionConfiguration, }; use async_trait::async_trait; -use jsonrpsee_core::RpcResult; +use jsonrpsee_core::{server::RpcModule, RpcResult}; use parking_lot::Mutex; use reth_chainspec::{EthereumHardfork, EthereumHardforks}; use reth_engine_primitives::{ @@ -27,7 +27,7 @@ use reth_payload_primitives::{ PayloadOrAttributes, }; use reth_primitives_traits::{Block, BlockBody}; -use reth_rpc_api::EngineApiServer; +use reth_rpc_api::{EngineApiServer, IntoEngineApiRpcModule}; use reth_storage_api::{BlockReader, HeaderProvider, StateProviderFactory}; use reth_tasks::TaskSpawner; use reth_transaction_pool::TransactionPool; @@ -1020,6 +1020,17 @@ where } } +impl IntoEngineApiRpcModule + for EngineApi +where + EngineT: EngineTypes, + Self: EngineApiServer, +{ + fn into_rpc_module(self) -> RpcModule<()> { + self.into_rpc().remove_context() + } +} + impl std::fmt::Debug for EngineApi where