feat: integrate type specific engine validator in tree service (#12952)

This commit is contained in:
Matthias Seitz
2024-11-28 17:09:54 +01:00
committed by GitHub
parent 55b758ac10
commit cca6372e87
11 changed files with 72 additions and 63 deletions

4
Cargo.lock generated
View File

@ -7183,10 +7183,10 @@ dependencies = [
"reth-engine-tree", "reth-engine-tree",
"reth-ethereum-engine-primitives", "reth-ethereum-engine-primitives",
"reth-evm", "reth-evm",
"reth-node-types",
"reth-payload-builder", "reth-payload-builder",
"reth-payload-builder-primitives", "reth-payload-builder-primitives",
"reth-payload-primitives", "reth-payload-primitives",
"reth-payload-validator",
"reth-provider", "reth-provider",
"reth-prune", "reth-prune",
"reth-rpc-types-compat", "reth-rpc-types-compat",
@ -7235,7 +7235,6 @@ dependencies = [
"reth-network-p2p", "reth-network-p2p",
"reth-node-types", "reth-node-types",
"reth-payload-builder", "reth-payload-builder",
"reth-payload-validator",
"reth-primitives", "reth-primitives",
"reth-provider", "reth-provider",
"reth-prune", "reth-prune",
@ -7279,7 +7278,6 @@ dependencies = [
"reth-payload-builder", "reth-payload-builder",
"reth-payload-builder-primitives", "reth-payload-builder-primitives",
"reth-payload-primitives", "reth-payload-primitives",
"reth-payload-validator",
"reth-primitives", "reth-primitives",
"reth-provider", "reth-provider",
"reth-prune", "reth-prune",

View File

@ -5,6 +5,7 @@ use reth_chainspec::EthChainSpec;
use reth_db::{test_utils::TempDatabase, DatabaseEnv}; use reth_db::{test_utils::TempDatabase, DatabaseEnv};
use reth_engine_local::LocalPayloadAttributesBuilder; use reth_engine_local::LocalPayloadAttributesBuilder;
use reth_network_api::test_utils::PeersHandleProvider; use reth_network_api::test_utils::PeersHandleProvider;
use reth_node_api::EngineValidator;
use reth_node_builder::{ use reth_node_builder::{
components::NodeComponentsBuilder, components::NodeComponentsBuilder,
rpc::{EngineValidatorAddOn, RethRpcAddOns}, rpc::{EngineValidatorAddOn, RethRpcAddOns},
@ -131,7 +132,10 @@ where
>, >,
>, >,
N::AddOns: RethRpcAddOns<Adapter<N, BlockchainProvider2<NodeTypesWithDBAdapter<N, TmpDB>>>> N::AddOns: RethRpcAddOns<Adapter<N, BlockchainProvider2<NodeTypesWithDBAdapter<N, TmpDB>>>>
+ EngineValidatorAddOn<Adapter<N, BlockchainProvider2<NodeTypesWithDBAdapter<N, TmpDB>>>>, + EngineValidatorAddOn<
Adapter<N, BlockchainProvider2<NodeTypesWithDBAdapter<N, TmpDB>>>,
Validator: EngineValidator<N::Engine, Block = reth_primitives::Block>,
>,
LocalPayloadAttributesBuilder<N::ChainSpec>: PayloadAttributesBuilder< LocalPayloadAttributesBuilder<N::ChainSpec>: PayloadAttributesBuilder<
<<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadAttributes, <<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadAttributes,
>, >,

View File

@ -16,12 +16,12 @@ reth-consensus.workspace = true
reth-engine-primitives.workspace = true reth-engine-primitives.workspace = true
reth-engine-service.workspace = true reth-engine-service.workspace = true
reth-engine-tree.workspace = true reth-engine-tree.workspace = true
reth-node-types.workspace = true
reth-evm.workspace = true reth-evm.workspace = true
reth-ethereum-engine-primitives.workspace = true reth-ethereum-engine-primitives.workspace = true
reth-payload-builder.workspace = true reth-payload-builder.workspace = true
reth-payload-builder-primitives.workspace = true reth-payload-builder-primitives.workspace = true
reth-payload-primitives.workspace = true reth-payload-primitives.workspace = true
reth-payload-validator.workspace = true
reth-provider.workspace = true reth-provider.workspace = true
reth-prune.workspace = true reth-prune.workspace = true
reth-rpc-types-compat.workspace = true reth-rpc-types-compat.workspace = true

View File

@ -19,7 +19,7 @@ use futures_util::{Stream, StreamExt};
use reth_beacon_consensus::{BeaconConsensusEngineEvent, EngineNodeTypes}; use reth_beacon_consensus::{BeaconConsensusEngineEvent, EngineNodeTypes};
use reth_chainspec::EthChainSpec; use reth_chainspec::EthChainSpec;
use reth_consensus::Consensus; use reth_consensus::Consensus;
use reth_engine_primitives::BeaconEngineMessage; use reth_engine_primitives::{BeaconEngineMessage, EngineValidator};
use reth_engine_service::service::EngineMessageStream; use reth_engine_service::service::EngineMessageStream;
use reth_engine_tree::{ use reth_engine_tree::{
chain::{ChainEvent, HandlerEvent}, chain::{ChainEvent, HandlerEvent},
@ -31,9 +31,9 @@ use reth_engine_tree::{
tree::{EngineApiTreeHandler, InvalidBlockHook, TreeConfig}, tree::{EngineApiTreeHandler, InvalidBlockHook, TreeConfig},
}; };
use reth_evm::execute::BlockExecutorProvider; use reth_evm::execute::BlockExecutorProvider;
use reth_node_types::BlockTy;
use reth_payload_builder::PayloadBuilderHandle; use reth_payload_builder::PayloadBuilderHandle;
use reth_payload_primitives::{PayloadAttributesBuilder, PayloadTypes}; use reth_payload_primitives::{PayloadAttributesBuilder, PayloadTypes};
use reth_payload_validator::ExecutionPayloadValidator;
use reth_provider::{providers::BlockchainProvider2, ChainSpecProvider, ProviderFactory}; use reth_provider::{providers::BlockchainProvider2, ChainSpecProvider, ProviderFactory};
use reth_prune::PrunerWithFactory; use reth_prune::PrunerWithFactory;
use reth_stages_api::MetricEventsSender; use reth_stages_api::MetricEventsSender;
@ -63,13 +63,14 @@ where
{ {
/// Constructor for [`LocalEngineService`]. /// Constructor for [`LocalEngineService`].
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn new<B>( pub fn new<B, V>(
consensus: Arc<dyn Consensus>, consensus: Arc<dyn Consensus>,
executor_factory: impl BlockExecutorProvider, executor_factory: impl BlockExecutorProvider,
provider: ProviderFactory<N>, provider: ProviderFactory<N>,
blockchain_db: BlockchainProvider2<N>, blockchain_db: BlockchainProvider2<N>,
pruner: PrunerWithFactory<ProviderFactory<N>>, pruner: PrunerWithFactory<ProviderFactory<N>>,
payload_builder: PayloadBuilderHandle<N::Engine>, payload_builder: PayloadBuilderHandle<N::Engine>,
payload_validator: V,
tree_config: TreeConfig, tree_config: TreeConfig,
invalid_block_hook: Box<dyn InvalidBlockHook>, invalid_block_hook: Box<dyn InvalidBlockHook>,
sync_metrics_tx: MetricEventsSender, sync_metrics_tx: MetricEventsSender,
@ -80,6 +81,7 @@ where
) -> Self ) -> Self
where where
B: PayloadAttributesBuilder<<N::Engine as PayloadTypes>::PayloadAttributes>, B: PayloadAttributesBuilder<<N::Engine as PayloadTypes>::PayloadAttributes>,
V: EngineValidator<N::Engine, Block = BlockTy<N>>,
{ {
let chain_spec = provider.chain_spec(); let chain_spec = provider.chain_spec();
let engine_kind = let engine_kind =
@ -87,8 +89,6 @@ where
let persistence_handle = let persistence_handle =
PersistenceHandle::spawn_service(provider, pruner, sync_metrics_tx); PersistenceHandle::spawn_service(provider, pruner, sync_metrics_tx);
let payload_validator = ExecutionPayloadValidator::new(chain_spec);
let canonical_in_memory_state = blockchain_db.canonical_in_memory_state(); let canonical_in_memory_state = blockchain_db.canonical_in_memory_state();
let (to_tree_tx, from_tree) = EngineApiTreeHandler::<N::Primitives, _, _, _, _>::spawn_new( let (to_tree_tx, from_tree) = EngineApiTreeHandler::<N::Primitives, _, _, _, _>::spawn_new(

View File

@ -18,7 +18,6 @@ reth-engine-tree.workspace = true
reth-evm.workspace = true reth-evm.workspace = true
reth-network-p2p.workspace = true reth-network-p2p.workspace = true
reth-payload-builder.workspace = true reth-payload-builder.workspace = true
reth-payload-validator.workspace = true
reth-provider.workspace = true reth-provider.workspace = true
reth-prune.workspace = true reth-prune.workspace = true
reth-stages-api.workspace = true reth-stages-api.workspace = true

View File

@ -3,7 +3,7 @@ use pin_project::pin_project;
use reth_beacon_consensus::{BeaconConsensusEngineEvent, EngineNodeTypes}; use reth_beacon_consensus::{BeaconConsensusEngineEvent, EngineNodeTypes};
use reth_chainspec::EthChainSpec; use reth_chainspec::EthChainSpec;
use reth_consensus::Consensus; use reth_consensus::Consensus;
use reth_engine_primitives::BeaconEngineMessage; use reth_engine_primitives::{BeaconEngineMessage, EngineValidator};
use reth_engine_tree::{ use reth_engine_tree::{
backfill::PipelineSync, backfill::PipelineSync,
download::BasicBlockDownloader, download::BasicBlockDownloader,
@ -17,9 +17,8 @@ pub use reth_engine_tree::{
}; };
use reth_evm::execute::BlockExecutorProvider; use reth_evm::execute::BlockExecutorProvider;
use reth_network_p2p::EthBlockClient; use reth_network_p2p::EthBlockClient;
use reth_node_types::NodeTypesWithEngine; use reth_node_types::{BlockTy, NodeTypesWithEngine};
use reth_payload_builder::PayloadBuilderHandle; use reth_payload_builder::PayloadBuilderHandle;
use reth_payload_validator::ExecutionPayloadValidator;
use reth_provider::{providers::BlockchainProvider2, ProviderFactory}; use reth_provider::{providers::BlockchainProvider2, ProviderFactory};
use reth_prune::PrunerWithFactory; use reth_prune::PrunerWithFactory;
use reth_stages_api::{MetricEventsSender, Pipeline}; use reth_stages_api::{MetricEventsSender, Pipeline};
@ -65,7 +64,7 @@ where
{ {
/// Constructor for `EngineService`. /// Constructor for `EngineService`.
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn new( pub fn new<V>(
consensus: Arc<dyn Consensus>, consensus: Arc<dyn Consensus>,
executor_factory: E, executor_factory: E,
chain_spec: Arc<N::ChainSpec>, chain_spec: Arc<N::ChainSpec>,
@ -77,10 +76,14 @@ where
blockchain_db: BlockchainProvider2<N>, blockchain_db: BlockchainProvider2<N>,
pruner: PrunerWithFactory<ProviderFactory<N>>, pruner: PrunerWithFactory<ProviderFactory<N>>,
payload_builder: PayloadBuilderHandle<N::Engine>, payload_builder: PayloadBuilderHandle<N::Engine>,
payload_validator: V,
tree_config: TreeConfig, tree_config: TreeConfig,
invalid_block_hook: Box<dyn InvalidBlockHook>, invalid_block_hook: Box<dyn InvalidBlockHook>,
sync_metrics_tx: MetricEventsSender, sync_metrics_tx: MetricEventsSender,
) -> Self { ) -> Self
where
V: EngineValidator<N::Engine, Block = BlockTy<N>>,
{
let engine_kind = let engine_kind =
if chain_spec.is_optimism() { EngineApiKind::OpStack } else { EngineApiKind::Ethereum }; if chain_spec.is_optimism() { EngineApiKind::OpStack } else { EngineApiKind::Ethereum };
@ -88,7 +91,6 @@ where
let persistence_handle = let persistence_handle =
PersistenceHandle::spawn_service(provider, pruner, sync_metrics_tx); PersistenceHandle::spawn_service(provider, pruner, sync_metrics_tx);
let payload_validator = ExecutionPayloadValidator::new(chain_spec);
let canonical_in_memory_state = blockchain_db.canonical_in_memory_state(); let canonical_in_memory_state = blockchain_db.canonical_in_memory_state();
@ -148,7 +150,7 @@ mod tests {
use reth_chainspec::{ChainSpecBuilder, MAINNET}; use reth_chainspec::{ChainSpecBuilder, MAINNET};
use reth_engine_primitives::BeaconEngineMessage; use reth_engine_primitives::BeaconEngineMessage;
use reth_engine_tree::{test_utils::TestPipelineBuilder, tree::NoopInvalidBlockHook}; use reth_engine_tree::{test_utils::TestPipelineBuilder, tree::NoopInvalidBlockHook};
use reth_ethereum_engine_primitives::EthEngineTypes; use reth_ethereum_engine_primitives::{EthEngineTypes, EthereumEngineValidator};
use reth_evm_ethereum::execute::EthExecutorProvider; use reth_evm_ethereum::execute::EthExecutorProvider;
use reth_exex_types::FinishedExExHeight; use reth_exex_types::FinishedExExHeight;
use reth_network_p2p::test_utils::TestFullBlockClient; use reth_network_p2p::test_utils::TestFullBlockClient;
@ -186,7 +188,7 @@ mod tests {
let blockchain_db = let blockchain_db =
BlockchainProvider2::with_latest(provider_factory.clone(), SealedHeader::default()) BlockchainProvider2::with_latest(provider_factory.clone(), SealedHeader::default())
.unwrap(); .unwrap();
let engine_payload_validator = EthereumEngineValidator::new(chain_spec.clone());
let (_tx, rx) = watch::channel(FinishedExExHeight::NoExExs); let (_tx, rx) = watch::channel(FinishedExExHeight::NoExExs);
let pruner = Pruner::new_with_factory(provider_factory.clone(), vec![], 0, 0, None, rx); let pruner = Pruner::new_with_factory(provider_factory.clone(), vec![], 0, 0, None, rx);
@ -204,6 +206,7 @@ mod tests {
blockchain_db, blockchain_db,
pruner, pruner,
PayloadBuilderHandle::new(tx), PayloadBuilderHandle::new(tx),
engine_payload_validator,
TreeConfig::default(), TreeConfig::default(),
Box::new(NoopInvalidBlockHook::default()), Box::new(NoopInvalidBlockHook::default()),
sync_metrics_tx, sync_metrics_tx,

View File

@ -16,7 +16,7 @@ reth-beacon-consensus.workspace = true
reth-blockchain-tree-api.workspace = true reth-blockchain-tree-api.workspace = true
reth-blockchain-tree.workspace = true reth-blockchain-tree.workspace = true
reth-chain-state.workspace = true reth-chain-state.workspace = true
reth-chainspec.workspace = true reth-chainspec = { workspace = true, optional = true }
reth-consensus.workspace = true reth-consensus.workspace = true
reth-engine-primitives.workspace = true reth-engine-primitives.workspace = true
reth-errors.workspace = true reth-errors.workspace = true
@ -25,7 +25,6 @@ reth-network-p2p.workspace = true
reth-payload-builder-primitives.workspace = true reth-payload-builder-primitives.workspace = true
reth-payload-builder.workspace = true reth-payload-builder.workspace = true
reth-payload-primitives.workspace = true reth-payload-primitives.workspace = true
reth-payload-validator.workspace = true
reth-primitives.workspace = true reth-primitives.workspace = true
reth-provider.workspace = true reth-provider.workspace = true
reth-prune.workspace = true reth-prune.workspace = true

View File

@ -1,8 +1,9 @@
use crate::{ use crate::{
backfill::{BackfillAction, BackfillSyncState}, backfill::{BackfillAction, BackfillSyncState},
chain::FromOrchestrator, chain::FromOrchestrator,
engine::{DownloadRequest, EngineApiEvent, FromEngine}, engine::{DownloadRequest, EngineApiEvent, EngineApiKind, EngineApiRequest, FromEngine},
persistence::PersistenceHandle, persistence::PersistenceHandle,
tree::metrics::EngineApiMetrics,
}; };
use alloy_consensus::{BlockHeader, Header}; use alloy_consensus::{BlockHeader, Header};
use alloy_eips::BlockNumHash; use alloy_eips::BlockNumHash;
@ -24,18 +25,16 @@ use reth_blockchain_tree::{
use reth_chain_state::{ use reth_chain_state::{
CanonicalInMemoryState, ExecutedBlock, MemoryOverlayStateProvider, NewCanonicalChain, CanonicalInMemoryState, ExecutedBlock, MemoryOverlayStateProvider, NewCanonicalChain,
}; };
use reth_chainspec::EthereumHardforks;
use reth_consensus::{Consensus, PostExecutionInput}; use reth_consensus::{Consensus, PostExecutionInput};
use reth_engine_primitives::{ use reth_engine_primitives::{
BeaconEngineMessage, BeaconOnNewPayloadError, EngineApiMessageVersion, EngineTypes, BeaconEngineMessage, BeaconOnNewPayloadError, EngineApiMessageVersion, EngineTypes,
ForkchoiceStateTracker, OnForkChoiceUpdated, EngineValidator, ForkchoiceStateTracker, OnForkChoiceUpdated,
}; };
use reth_errors::{ConsensusError, ProviderResult}; use reth_errors::{ConsensusError, ProviderResult};
use reth_evm::execute::BlockExecutorProvider; use reth_evm::execute::BlockExecutorProvider;
use reth_payload_builder::PayloadBuilderHandle; use reth_payload_builder::PayloadBuilderHandle;
use reth_payload_builder_primitives::PayloadBuilder; use reth_payload_builder_primitives::PayloadBuilder;
use reth_payload_primitives::{PayloadAttributes, PayloadBuilderAttributes}; use reth_payload_primitives::{PayloadAttributes, PayloadBuilderAttributes};
use reth_payload_validator::ExecutionPayloadValidator;
use reth_primitives::{ use reth_primitives::{
Block, EthPrimitives, GotExpected, NodePrimitives, SealedBlock, SealedBlockWithSenders, Block, EthPrimitives, GotExpected, NodePrimitives, SealedBlock, SealedBlockWithSenders,
SealedHeader, SealedHeader,
@ -72,10 +71,6 @@ pub mod config;
mod invalid_block_hook; mod invalid_block_hook;
mod metrics; mod metrics;
mod persistence_state; mod persistence_state;
use crate::{
engine::{EngineApiKind, EngineApiRequest},
tree::metrics::EngineApiMetrics,
};
pub use config::TreeConfig; pub use config::TreeConfig;
pub use invalid_block_hook::{InvalidBlockHooks, NoopInvalidBlockHook}; pub use invalid_block_hook::{InvalidBlockHooks, NoopInvalidBlockHook};
pub use persistence_state::PersistenceState; pub use persistence_state::PersistenceState;
@ -472,11 +467,14 @@ pub enum TreeAction {
/// ///
/// This type is responsible for processing engine API requests, maintaining the canonical state and /// This type is responsible for processing engine API requests, maintaining the canonical state and
/// emitting events. /// emitting events.
pub struct EngineApiTreeHandler<N, P, E, T: EngineTypes, Spec> { pub struct EngineApiTreeHandler<N, P, E, T, V>
where
T: EngineTypes,
{
provider: P, provider: P,
executor_provider: E, executor_provider: E,
consensus: Arc<dyn Consensus>, consensus: Arc<dyn Consensus>,
payload_validator: ExecutionPayloadValidator<Spec>, payload_validator: V,
/// Keeps track of internals such as executed and buffered blocks. /// Keeps track of internals such as executed and buffered blocks.
state: EngineApiTreeState, state: EngineApiTreeState,
/// The half for sending messages to the engine. /// The half for sending messages to the engine.
@ -516,8 +514,8 @@ pub struct EngineApiTreeHandler<N, P, E, T: EngineTypes, Spec> {
_primtives: PhantomData<N>, _primtives: PhantomData<N>,
} }
impl<N, P: Debug, E: Debug, T: EngineTypes + Debug, Spec: Debug> std::fmt::Debug impl<N, P: Debug, E: Debug, T: EngineTypes + Debug, V: Debug> std::fmt::Debug
for EngineApiTreeHandler<N, P, E, T, Spec> for EngineApiTreeHandler<N, P, E, T, V>
{ {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("EngineApiTreeHandler") f.debug_struct("EngineApiTreeHandler")
@ -540,7 +538,7 @@ impl<N, P: Debug, E: Debug, T: EngineTypes + Debug, Spec: Debug> std::fmt::Debug
} }
} }
impl<N, P, E, T, Spec> EngineApiTreeHandler<N, P, E, T, Spec> impl<N, P, E, T, V> EngineApiTreeHandler<N, P, E, T, V>
where where
N: NodePrimitives, N: NodePrimitives,
P: DatabaseProviderFactory P: DatabaseProviderFactory
@ -552,7 +550,7 @@ where
<P as DatabaseProviderFactory>::Provider: BlockReader, <P as DatabaseProviderFactory>::Provider: BlockReader,
E: BlockExecutorProvider, E: BlockExecutorProvider,
T: EngineTypes, T: EngineTypes,
Spec: Send + Sync + EthereumHardforks + 'static, V: EngineValidator<T, Block = reth_primitives::Block>,
{ {
/// Creates a new [`EngineApiTreeHandler`]. /// Creates a new [`EngineApiTreeHandler`].
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
@ -560,7 +558,7 @@ where
provider: P, provider: P,
executor_provider: E, executor_provider: E,
consensus: Arc<dyn Consensus>, consensus: Arc<dyn Consensus>,
payload_validator: ExecutionPayloadValidator<Spec>, payload_validator: V,
outgoing: UnboundedSender<EngineApiEvent>, outgoing: UnboundedSender<EngineApiEvent>,
state: EngineApiTreeState, state: EngineApiTreeState,
canonical_in_memory_state: CanonicalInMemoryState, canonical_in_memory_state: CanonicalInMemoryState,
@ -609,7 +607,7 @@ where
provider: P, provider: P,
executor_provider: E, executor_provider: E,
consensus: Arc<dyn Consensus>, consensus: Arc<dyn Consensus>,
payload_validator: ExecutionPayloadValidator<Spec>, payload_validator: V,
persistence: PersistenceHandle, persistence: PersistenceHandle,
payload_builder: PayloadBuilderHandle<T>, payload_builder: PayloadBuilderHandle<T>,
canonical_in_memory_state: CanonicalInMemoryState, canonical_in_memory_state: CanonicalInMemoryState,
@ -2629,7 +2627,7 @@ mod tests {
use reth_chain_state::{test_utils::TestBlockBuilder, BlockState}; use reth_chain_state::{test_utils::TestBlockBuilder, BlockState};
use reth_chainspec::{ChainSpec, HOLESKY, MAINNET}; use reth_chainspec::{ChainSpec, HOLESKY, MAINNET};
use reth_engine_primitives::ForkchoiceStatus; use reth_engine_primitives::ForkchoiceStatus;
use reth_ethereum_engine_primitives::EthEngineTypes; use reth_ethereum_engine_primitives::{EthEngineTypes, EthereumEngineValidator};
use reth_evm::test_utils::MockExecutorProvider; use reth_evm::test_utils::MockExecutorProvider;
use reth_primitives::{BlockExt, EthPrimitives}; use reth_primitives::{BlockExt, EthPrimitives};
use reth_provider::test_utils::MockEthProvider; use reth_provider::test_utils::MockEthProvider;
@ -2701,7 +2699,7 @@ mod tests {
MockEthProvider, MockEthProvider,
MockExecutorProvider, MockExecutorProvider,
EthEngineTypes, EthEngineTypes,
ChainSpec, EthereumEngineValidator,
>, >,
to_tree_tx: Sender<FromEngine<EngineApiRequest<EthEngineTypes>>>, to_tree_tx: Sender<FromEngine<EngineApiRequest<EthEngineTypes>>>,
from_tree_rx: UnboundedReceiver<EngineApiEvent>, from_tree_rx: UnboundedReceiver<EngineApiEvent>,
@ -2736,7 +2734,7 @@ mod tests {
let provider = MockEthProvider::default(); let provider = MockEthProvider::default();
let executor_provider = MockExecutorProvider::default(); let executor_provider = MockExecutorProvider::default();
let payload_validator = ExecutionPayloadValidator::new(chain_spec.clone()); let payload_validator = EthereumEngineValidator::new(chain_spec.clone());
let (from_tree_tx, from_tree_rx) = unbounded_channel(); let (from_tree_tx, from_tree_rx) = unbounded_channel();

View File

@ -19,8 +19,8 @@ use reth_exex::ExExManagerHandle;
use reth_network::{NetworkSyncUpdater, SyncState}; use reth_network::{NetworkSyncUpdater, SyncState};
use reth_network_api::BlockDownloaderProvider; use reth_network_api::BlockDownloaderProvider;
use reth_node_api::{ use reth_node_api::{
BuiltPayload, FullNodeTypes, NodeTypesWithEngine, PayloadAttributesBuilder, PayloadBuilder, BlockTy, BuiltPayload, EngineValidator, FullNodeTypes, NodeTypesWithEngine,
PayloadTypes, PayloadAttributesBuilder, PayloadBuilder, PayloadTypes,
}; };
use reth_node_core::{ use reth_node_core::{
dirs::{ChainPath, DataDirPath}, dirs::{ChainPath, DataDirPath},
@ -75,7 +75,14 @@ where
T: FullNodeTypes<Types = Types, Provider = BlockchainProvider2<Types>>, T: FullNodeTypes<Types = Types, Provider = BlockchainProvider2<Types>>,
CB: NodeComponentsBuilder<T>, CB: NodeComponentsBuilder<T>,
AO: RethRpcAddOns<NodeAdapter<T, CB::Components>> AO: RethRpcAddOns<NodeAdapter<T, CB::Components>>
+ EngineValidatorAddOn<NodeAdapter<T, CB::Components>>, + EngineValidatorAddOn<
NodeAdapter<T, CB::Components>,
Validator: EngineValidator<
<Types as NodeTypesWithEngine>::Engine,
Block = BlockTy<Types>,
>,
>,
LocalPayloadAttributesBuilder<Types::ChainSpec>: PayloadAttributesBuilder< LocalPayloadAttributesBuilder<Types::ChainSpec>: PayloadAttributesBuilder<
<<Types as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadAttributes, <<Types as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadAttributes,
>, >,
@ -196,10 +203,24 @@ where
pruner_builder.finished_exex_height(exex_manager_handle.finished_height()); pruner_builder.finished_exex_height(exex_manager_handle.finished_height());
} }
let pruner = pruner_builder.build_with_provider_factory(ctx.provider_factory().clone()); let pruner = pruner_builder.build_with_provider_factory(ctx.provider_factory().clone());
let pruner_events = pruner.events(); let pruner_events = pruner.events();
info!(target: "reth::cli", prune_config=?ctx.prune_config().unwrap_or_default(), "Pruner initialized"); info!(target: "reth::cli", prune_config=?ctx.prune_config().unwrap_or_default(), "Pruner initialized");
let event_sender = EventSender::default();
let beacon_engine_handle =
BeaconConsensusEngineHandle::new(consensus_engine_tx.clone(), event_sender.clone());
// extract the jwt secret from the args if possible
let jwt_secret = ctx.auth_jwt_secret()?;
let add_ons_ctx = AddOnsContext {
node: ctx.node_adapter().clone(),
config: ctx.node_config(),
beacon_engine_handle: beacon_engine_handle.clone(),
jwt_secret,
};
let engine_payload_validator = add_ons.engine_validator(&add_ons_ctx).await?;
let mut engine_service = if ctx.is_dev() { let mut engine_service = if ctx.is_dev() {
let eth_service = LocalEngineService::new( let eth_service = LocalEngineService::new(
ctx.consensus(), ctx.consensus(),
@ -208,6 +229,7 @@ where
ctx.blockchain_db().clone(), ctx.blockchain_db().clone(),
pruner, pruner,
ctx.components().payload_builder().clone(), ctx.components().payload_builder().clone(),
engine_payload_validator,
engine_tree_config, engine_tree_config,
ctx.invalid_block_hook()?, ctx.invalid_block_hook()?,
ctx.sync_metrics_tx(), ctx.sync_metrics_tx(),
@ -231,6 +253,7 @@ where
ctx.blockchain_db().clone(), ctx.blockchain_db().clone(),
pruner, pruner,
ctx.components().payload_builder().clone(), ctx.components().payload_builder().clone(),
engine_payload_validator,
engine_tree_config, engine_tree_config,
ctx.invalid_block_hook()?, ctx.invalid_block_hook()?,
ctx.sync_metrics_tx(), ctx.sync_metrics_tx(),
@ -239,11 +262,6 @@ where
Either::Right(eth_service) Either::Right(eth_service)
}; };
let event_sender = EventSender::default();
let beacon_engine_handle =
BeaconConsensusEngineHandle::new(consensus_engine_tx, event_sender.clone());
info!(target: "reth::cli", "Consensus engine initialized"); info!(target: "reth::cli", "Consensus engine initialized");
let events = stream_select!( let events = stream_select!(
@ -269,16 +287,6 @@ where
), ),
); );
// extract the jwt secret from the args if possible
let jwt_secret = ctx.auth_jwt_secret()?;
let add_ons_ctx = AddOnsContext {
node: ctx.node_adapter().clone(),
config: ctx.node_config(),
beacon_engine_handle,
jwt_secret,
};
let RpcHandle { rpc_server_handles, rpc_registry } = let RpcHandle { rpc_server_handles, rpc_registry } =
add_ons.launch_add_ons(add_ons_ctx).await?; add_ons.launch_add_ons(add_ons_ctx).await?;

View File

@ -70,7 +70,7 @@ pub trait LaunchNode<Target> {
type Node; type Node;
/// Create and return a new node asynchronously. /// Create and return a new node asynchronously.
fn launch_node(self, target: Target) -> impl Future<Output = eyre::Result<Self::Node>> + Send; fn launch_node(self, target: Target) -> impl Future<Output = eyre::Result<Self::Node>>;
} }
impl<F, Target, Fut, Node> LaunchNode<Target> for F impl<F, Target, Fut, Node> LaunchNode<Target> for F
@ -80,7 +80,7 @@ where
{ {
type Node = Node; type Node = Node;
fn launch_node(self, target: Target) -> impl Future<Output = eyre::Result<Self::Node>> + Send { fn launch_node(self, target: Target) -> impl Future<Output = eyre::Result<Self::Node>> {
self(target) self(target)
} }
} }

View File

@ -601,7 +601,7 @@ where
} }
/// A type that knows how to build the engine validator. /// A type that knows how to build the engine validator.
pub trait EngineValidatorBuilder<Node: FullNodeComponents>: Send + Clone { pub trait EngineValidatorBuilder<Node: FullNodeComponents>: Send + Sync + Clone {
/// The consensus implementation to build. /// The consensus implementation to build.
type Validator: EngineValidator<<Node::Types as NodeTypesWithEngine>::Engine>; type Validator: EngineValidator<<Node::Types as NodeTypesWithEngine>::Engine>;
@ -617,7 +617,7 @@ where
Node: FullNodeComponents, Node: FullNodeComponents,
Validator: Validator:
EngineValidator<<Node::Types as NodeTypesWithEngine>::Engine> + Clone + Unpin + 'static, EngineValidator<<Node::Types as NodeTypesWithEngine>::Engine> + Clone + Unpin + 'static,
F: FnOnce(&AddOnsContext<'_, Node>) -> Fut + Send + Clone, F: FnOnce(&AddOnsContext<'_, Node>) -> Fut + Send + Sync + Clone,
Fut: Future<Output = eyre::Result<Validator>> + Send, Fut: Future<Output = eyre::Result<Validator>> + Send,
{ {
type Validator = Validator; type Validator = Validator;