feat(l2-withdrawals): Define OpEngineApiBuilder (#14426)

This commit is contained in:
Emilia Hane
2025-02-12 08:04:52 +01:00
committed by GitHub
parent 771a99be53
commit ea40f78e59
6 changed files with 67 additions and 4 deletions

1
Cargo.lock generated
View File

@ -8613,6 +8613,7 @@ dependencies = [
"alloy-rpc-types-engine", "alloy-rpc-types-engine",
"alloy-rpc-types-eth", "alloy-rpc-types-eth",
"async-trait", "async-trait",
"derive_more",
"jsonrpsee", "jsonrpsee",
"jsonrpsee-core", "jsonrpsee-core",
"jsonrpsee-types", "jsonrpsee-types",

View File

@ -23,6 +23,9 @@ pub use engine::OpEngineTypes;
pub mod node; pub mod node;
pub use node::{OpNetworkPrimitives, OpNode}; pub use node::{OpNetworkPrimitives, OpNode};
pub mod rpc;
pub use rpc::OpEngineApiBuilder;
pub use reth_optimism_txpool as txpool; pub use reth_optimism_txpool as txpool;
/// Helpers for running test node instances. /// Helpers for running test node instances.

View File

@ -4,7 +4,7 @@ use crate::{
args::RollupArgs, args::RollupArgs,
engine::OpEngineValidator, engine::OpEngineValidator,
txpool::{OpTransactionPool, OpTransactionValidator}, txpool::{OpTransactionPool, OpTransactionValidator},
OpEngineTypes, OpEngineApiBuilder, OpEngineTypes,
}; };
use op_alloy_consensus::OpPooledTransaction; use op_alloy_consensus::OpPooledTransaction;
use reth_chainspec::{EthChainSpec, Hardforks}; use reth_chainspec::{EthChainSpec, Hardforks};
@ -202,7 +202,12 @@ impl NodeTypesWithEngine for OpNode {
pub struct OpAddOns<N: FullNodeComponents> { pub struct OpAddOns<N: FullNodeComponents> {
/// Rpc add-ons responsible for launching the RPC servers and instantiating the RPC handlers /// Rpc add-ons responsible for launching the RPC servers and instantiating the RPC handlers
/// and eth-api. /// and eth-api.
pub rpc_add_ons: RpcAddOns<N, OpEthApi<N>, OpEngineValidatorBuilder>, pub rpc_add_ons: RpcAddOns<
N,
OpEthApi<N>,
OpEngineValidatorBuilder,
OpEngineApiBuilder<OpEngineValidatorBuilder>,
>,
/// Data availability configuration for the OP builder. /// Data availability configuration for the OP builder.
pub da_config: OpDAConfig, pub da_config: OpDAConfig,
} }

View File

@ -0,0 +1,40 @@
//! RPC component builder
pub use reth_optimism_rpc::OpEngineApi;
use reth_chainspec::EthereumHardforks;
use reth_node_api::{
AddOnsContext, EngineTypes, ExecutionData, FullNodeComponents, NodeTypes, NodeTypesWithEngine,
};
use reth_node_builder::rpc::{BasicEngineApiBuilder, EngineApiBuilder, EngineValidatorBuilder};
/// Builder for basic [`OpEngineApi`] implementation.
#[derive(Debug, Default)]
pub struct OpEngineApiBuilder<EV> {
inner: BasicEngineApiBuilder<EV>,
}
impl<N, EV> EngineApiBuilder<N> for OpEngineApiBuilder<EV>
where
N: FullNodeComponents<
Types: NodeTypesWithEngine<
ChainSpec: EthereumHardforks,
Engine: EngineTypes<ExecutionData = ExecutionData>,
>,
>,
EV: EngineValidatorBuilder<N>,
{
type EngineApi = OpEngineApi<
N::Provider,
<N::Types as NodeTypesWithEngine>::Engine,
N::Pool,
EV::Validator,
<N::Types as NodeTypes>::ChainSpec,
>;
async fn build_engine_api(self, ctx: &AddOnsContext<'_, N>) -> eyre::Result<Self::EngineApi> {
let inner = self.inner.build_engine_api(ctx).await?;
Ok(OpEngineApi::new(inner))
}
}

View File

@ -69,6 +69,7 @@ serde_json.workspace = true
# misc # misc
thiserror.workspace = true thiserror.workspace = true
tracing.workspace = true tracing.workspace = true
derive_more = { workspace = true, features = ["constructor"] }
[dev-dependencies] [dev-dependencies]
reth-optimism-chainspec.workspace = true reth-optimism-chainspec.workspace = true

View File

@ -6,12 +6,14 @@ use alloy_rpc_types_engine::{
ClientVersionV1, ExecutionPayloadBodiesV1, ExecutionPayloadInputV2, ExecutionPayloadV3, ClientVersionV1, ExecutionPayloadBodiesV1, ExecutionPayloadInputV2, ExecutionPayloadV3,
ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus,
}; };
use derive_more::Constructor;
use jsonrpsee::proc_macros::rpc; use jsonrpsee::proc_macros::rpc;
use jsonrpsee_core::RpcResult; use jsonrpsee_core::{server::RpcModule, RpcResult};
use op_alloy_rpc_types_engine::OpExecutionPayloadV4; use op_alloy_rpc_types_engine::OpExecutionPayloadV4;
use reth_chainspec::EthereumHardforks; use reth_chainspec::EthereumHardforks;
use reth_node_api::{EngineTypes, EngineValidator, ExecutionData}; use reth_node_api::{EngineTypes, EngineValidator, ExecutionData};
use reth_provider::{BlockReader, HeaderProvider, StateProviderFactory}; use reth_provider::{BlockReader, HeaderProvider, StateProviderFactory};
use reth_rpc_api::IntoEngineApiRpcModule;
use reth_rpc_engine_api::{EngineApi, EngineApiServer}; use reth_rpc_engine_api::{EngineApi, EngineApiServer};
use reth_transaction_pool::TransactionPool; use reth_transaction_pool::TransactionPool;
@ -194,7 +196,7 @@ pub trait OpEngineApi<Engine: EngineTypes> {
/// The Engine API implementation that grants the Consensus layer access to data and /// The Engine API implementation that grants the Consensus layer access to data and
/// functions in the Execution layer that are crucial for the consensus process. /// functions in the Execution layer that are crucial for the consensus process.
#[derive(Debug)] #[derive(Debug, Constructor)]
pub struct OpEngineApi<Provider, EngineT: EngineTypes, Pool, Validator, ChainSpec> { pub struct OpEngineApi<Provider, EngineT: EngineTypes, Pool, Validator, ChainSpec> {
inner: EngineApi<Provider, EngineT, Pool, Validator, ChainSpec>, inner: EngineApi<Provider, EngineT, Pool, Validator, ChainSpec>,
} }
@ -312,3 +314,14 @@ where
EngineApiServer::exchange_capabilities(&self.inner, _capabilities).await EngineApiServer::exchange_capabilities(&self.inner, _capabilities).await
} }
} }
impl<Provider, EngineT, Pool, Validator, ChainSpec> IntoEngineApiRpcModule
for OpEngineApi<Provider, EngineT, Pool, Validator, ChainSpec>
where
EngineT: EngineTypes,
Self: OpEngineApiServer<EngineT>,
{
fn into_rpc_module(self) -> RpcModule<()> {
self.into_rpc().remove_context()
}
}