feat: simplify PayloadBuilder setup (#14276)

This commit is contained in:
Arsenii Kulikov
2025-02-07 00:44:16 +04:00
committed by GitHub
parent 63d5feab33
commit 1f1eabc428
32 changed files with 278 additions and 366 deletions

View File

@ -34,12 +34,11 @@ use reth::{
node::{NodeTypes, NodeTypesWithEngine},
rpc::{EngineValidatorBuilder, RpcAddOns},
BuilderContext, FullNodeTypes, Node, NodeAdapter, NodeBuilder, NodeComponentsBuilder,
PayloadBuilderConfig,
},
network::NetworkHandle,
payload::ExecutionPayloadValidator,
primitives::{Block, EthPrimitives, SealedBlock, TransactionSigned},
providers::{CanonStateSubscriptions, EthStorage, StateProviderFactory},
providers::{EthStorage, StateProviderFactory},
rpc::{
eth::EthApi,
types::engine::{ExecutionPayload, PayloadError},
@ -48,10 +47,7 @@ use reth::{
transaction_pool::{PoolTransaction, TransactionPool},
version::default_extra_data_bytes,
};
use reth_basic_payload_builder::{
BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig, BuildArguments, BuildOutcome,
PayloadBuilder, PayloadConfig,
};
use reth_basic_payload_builder::{BuildArguments, BuildOutcome, PayloadBuilder, PayloadConfig};
use reth_chainspec::{Chain, ChainSpec, ChainSpecProvider};
use reth_engine_local::payload::UnsupportedLocalAttributes;
use reth_ethereum_payload_builder::EthereumBuilderConfig;
@ -68,10 +64,7 @@ use reth_node_ethereum::{
},
EthEvmConfig,
};
use reth_payload_builder::{
EthBuiltPayload, EthPayloadBuilderAttributes, PayloadBuilderError, PayloadBuilderHandle,
PayloadBuilderService,
};
use reth_payload_builder::{EthBuiltPayload, EthPayloadBuilderAttributes, PayloadBuilderError};
use reth_tracing::{RethTracer, Tracer};
use reth_trie_db::MerklePatriciaTrie;
use serde::{Deserialize, Serialize};
@ -367,11 +360,13 @@ where
+ Unpin
+ 'static,
{
async fn spawn_payload_service(
self,
type PayloadBuilder = CustomPayloadBuilder<Pool, Node::Provider>;
async fn build_payload_builder(
&self,
ctx: &BuilderContext<Node>,
pool: Pool,
) -> eyre::Result<PayloadBuilderHandle<<Node::Types as NodeTypesWithEngine>::Engine>> {
) -> eyre::Result<Self::PayloadBuilder> {
let payload_builder = CustomPayloadBuilder {
inner: reth_ethereum_payload_builder::EthereumPayloadBuilder::new(
ctx.provider().clone(),
@ -380,24 +375,6 @@ where
EthereumBuilderConfig::new(default_extra_data_bytes()),
),
};
let conf = ctx.payload_builder_config();
let payload_job_config = BasicPayloadJobGeneratorConfig::default()
.interval(conf.interval())
.deadline(conf.deadline())
.max_payload_tasks(conf.max_payload_tasks());
let payload_generator = BasicPayloadJobGenerator::with_builder(
ctx.provider().clone(),
ctx.task_executor().clone(),
payload_job_config,
payload_builder,
);
let (payload_service, payload_builder) =
PayloadBuilderService::new(payload_generator, ctx.provider().canonical_state_stream());
ctx.task_executor().spawn_critical("payload builder service", Box::pin(payload_service));
Ok(payload_builder)
}
}

View File

@ -12,6 +12,7 @@ reth-evm-ethereum.workspace = true
reth-node-api.workspace = true
reth-node-core.workspace = true
reth-primitives.workspace = true
reth-ethereum-payload-builder.workspace = true
reth-node-ethereum = { workspace = true, features = ["test-utils"] }
reth-tracing.workspace = true
reth-evm.workspace = true

View File

@ -204,12 +204,15 @@ where
PayloadBuilderAttributes = EthPayloadBuilderAttributes,
>,
{
async fn spawn_payload_service(
self,
type PayloadBuilder =
reth_ethereum_payload_builder::EthereumPayloadBuilder<Pool, Node::Provider, MyEvmConfig>;
async fn build_payload_builder(
&self,
ctx: &BuilderContext<Node>,
pool: Pool,
) -> eyre::Result<reth::payload::PayloadBuilderHandle<Types::Engine>> {
self.inner.spawn(MyEvmConfig::new(ctx.chain_spec()), ctx, pool)
) -> eyre::Result<Self::PayloadBuilder> {
self.inner.build(MyEvmConfig::new(ctx.chain_spec()), ctx, pool)
}
}
#[tokio::main]

View File

@ -11,20 +11,15 @@
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
use generator::EmptyBlockPayloadJobGenerator;
use reth::{
builder::{components::PayloadServiceBuilder, node::FullNodeTypes, BuilderContext},
cli::{config::PayloadBuilderConfig, Cli},
payload::PayloadBuilderHandle,
providers::CanonStateSubscriptions,
transaction_pool::{PoolTransaction, TransactionPool},
};
use reth_basic_payload_builder::BasicPayloadJobGeneratorConfig;
use reth_chainspec::ChainSpec;
use reth_ethereum_payload_builder::EthereumBuilderConfig;
use reth_ethereum_payload_builder::{EthereumBuilderConfig, EthereumPayloadBuilder};
use reth_node_api::NodeTypesWithEngine;
use reth_node_ethereum::{node::EthereumAddOns, EthEngineTypes, EthEvmConfig, EthereumNode};
use reth_payload_builder::PayloadBuilderService;
use reth_primitives::{EthPrimitives, TransactionSigned};
pub mod generator;
@ -47,38 +42,22 @@ where
+ Unpin
+ 'static,
{
async fn spawn_payload_service(
self,
type PayloadBuilder = EthereumPayloadBuilder<Pool, Node::Provider, EthEvmConfig>;
async fn build_payload_builder(
&self,
ctx: &BuilderContext<Node>,
pool: Pool,
) -> eyre::Result<PayloadBuilderHandle<<Node::Types as NodeTypesWithEngine>::Engine>> {
) -> eyre::Result<Self::PayloadBuilder> {
tracing::info!("Spawning a custom payload builder");
let conf = ctx.payload_builder_config();
let payload_job_config = BasicPayloadJobGeneratorConfig::default()
.interval(conf.interval())
.deadline(conf.deadline())
.max_payload_tasks(conf.max_payload_tasks());
let payload_generator = EmptyBlockPayloadJobGenerator::with_builder(
Ok(reth_ethereum_payload_builder::EthereumPayloadBuilder::new(
ctx.provider().clone(),
ctx.task_executor().clone(),
payload_job_config,
reth_ethereum_payload_builder::EthereumPayloadBuilder::new(
ctx.provider().clone(),
pool,
EthEvmConfig::new(ctx.chain_spec()),
EthereumBuilderConfig::new(conf.extra_data_bytes()),
),
);
let (payload_service, payload_builder) =
PayloadBuilderService::new(payload_generator, ctx.provider().canonical_state_stream());
ctx.task_executor()
.spawn_critical("custom payload builder service", Box::pin(payload_service));
Ok(payload_builder)
pool,
EthEvmConfig::new(ctx.chain_spec()),
EthereumBuilderConfig::new(conf.extra_data_bytes()),
))
}
}