mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: type erase concrete engine server trait (#14204)
This commit is contained in:
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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>,
|
||||
//! EngineT: EngineTypes,
|
||||
//! BlockExecutor: BlockExecutorProvider<Primitives = Provider::Primitives>,
|
||||
//! Consensus: FullConsensus<Provider::Primitives, Error = ConsensusError> + Clone + 'static,
|
||||
//! Validator: PayloadValidator<Block = reth_primitives::Block, ExecutionData = ExecutionData>,
|
||||
@ -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<EngineApi, EngineT, EthApi>(
|
||||
pub fn build_with_auth_server<EthApi>(
|
||||
self,
|
||||
module_config: TransportRpcModuleConfig,
|
||||
engine: EngineApi,
|
||||
engine: impl IntoEngineApiRpcModule,
|
||||
eth: DynEthApiBuilder<Provider, Pool, EvmConfig, Network, Tasks, EthApi>,
|
||||
payload_validator: Arc<
|
||||
dyn PayloadValidator<Block = Provider::Block, ExecutionData = ExecutionData>,
|
||||
@ -625,8 +623,6 @@ where
|
||||
RpcRegistryInner<Provider, Pool, Network, Tasks, EthApi, BlockExecutor, Consensus>,
|
||||
)
|
||||
where
|
||||
EngineT: EngineTypes,
|
||||
EngineApi: EngineApiServer<EngineT>,
|
||||
EthApi: FullEthApiServer<
|
||||
Provider: BlockReader<
|
||||
Block = <BlockExecutor::Primitives as NodePrimitives>::Block,
|
||||
@ -1268,14 +1264,8 @@ where
|
||||
/// * `api_` namespace
|
||||
///
|
||||
/// Note: This does _not_ register the `engine_` in this registry.
|
||||
pub fn create_auth_module<EngineApi, EngineT>(&self, engine_api: EngineApi) -> AuthRpcModule
|
||||
where
|
||||
EngineT: EngineTypes,
|
||||
EngineApi: EngineApiServer<EngineT>,
|
||||
{
|
||||
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();
|
||||
|
||||
@ -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<Provider, EngineT, Pool, Validator, ChainSpec> IntoEngineApiRpcModule
|
||||
for EngineApi<Provider, EngineT, Pool, Validator, ChainSpec>
|
||||
where
|
||||
EngineT: EngineTypes,
|
||||
Self: EngineApiServer<EngineT>,
|
||||
{
|
||||
fn into_rpc_module(self) -> RpcModule<()> {
|
||||
self.into_rpc().remove_context()
|
||||
}
|
||||
}
|
||||
|
||||
impl<Provider, EngineT, Pool, Validator, ChainSpec> std::fmt::Debug
|
||||
for EngineApi<Provider, EngineT, Pool, Validator, ChainSpec>
|
||||
where
|
||||
|
||||
Reference in New Issue
Block a user