//! This example shows how implement a custom node. //! //! A node consists of: //! - primitives: block,header,transactions //! - components: network,pool,evm //! - engine: advances the node #![cfg_attr(not(test), warn(unused_crate_dependencies))] use crate::{ evm::CustomExecutorBuilder, pool::CustomPooledTransaction, primitives::CustomTransaction, }; use chainspec::CustomChainSpec; use primitives::CustomNodePrimitives; use reth_ethereum::node::api::{FullNodeTypes, NodeTypes}; use reth_node_builder::{ components::{BasicPayloadServiceBuilder, ComponentsBuilder}, Node, }; use reth_op::node::{ node::{OpConsensusBuilder, OpNetworkBuilder, OpPayloadBuilder, OpPoolBuilder}, txpool, OpNode, OpPayloadTypes, }; pub mod chainspec; pub mod engine; pub mod engine_api; pub mod evm; pub mod pool; pub mod primitives; #[derive(Debug, Clone)] pub struct CustomNode {} impl NodeTypes for CustomNode { type Primitives = CustomNodePrimitives; type ChainSpec = CustomChainSpec; type StateCommitment = ::StateCommitment; type Storage = ::Storage; type Payload = OpPayloadTypes; } impl Node for CustomNode where N: FullNodeTypes, { type ComponentsBuilder = ComponentsBuilder< N, OpPoolBuilder>, BasicPayloadServiceBuilder, OpNetworkBuilder, CustomExecutorBuilder, OpConsensusBuilder, >; type AddOns = (); fn components_builder(&self) -> Self::ComponentsBuilder { ComponentsBuilder::default() .node_types::() .pool(OpPoolBuilder::default()) .executor(CustomExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new(OpPayloadBuilder::new(false))) .network(OpNetworkBuilder::new(false, false)) .consensus(OpConsensusBuilder::default()) } fn add_ons(&self) -> Self::AddOns {} }