mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: integrate type specific engine validator in tree service (#12952)
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -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",
|
||||||
|
|||||||
@ -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,
|
||||||
>,
|
>,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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?;
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user