From 2416756b20841acb2d2ef227da3b1f9e027fc0c2 Mon Sep 17 00:00:00 2001 From: Bjerg Date: Sat, 20 May 2023 09:10:32 +0200 Subject: [PATCH] feat: integrate payload builder args in cli (#2757) --- Cargo.lock | 1 - bin/reth/Cargo.toml | 1 - bin/reth/src/args/mod.rs | 4 +- bin/reth/src/args/payload_build_args.rs | 56 -------------------- bin/reth/src/args/payload_builder_args.rs | 64 +++++++++++++++++++++++ bin/reth/src/node/mod.rs | 27 +++++++--- bin/reth/src/utils.rs | 8 ++- crates/payload/basic/src/lib.rs | 4 +- 8 files changed, 94 insertions(+), 71 deletions(-) delete mode 100644 bin/reth/src/args/payload_build_args.rs create mode 100644 bin/reth/src/args/payload_builder_args.rs diff --git a/Cargo.lock b/Cargo.lock index 200cde26c..55bf32ded 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4548,7 +4548,6 @@ dependencies = [ "metrics", "metrics-exporter-prometheus", "metrics-util", - "num_cpus", "pin-project", "pretty_assertions", "proptest", diff --git a/bin/reth/Cargo.toml b/bin/reth/Cargo.toml index b91c4b885..55017d416 100644 --- a/bin/reth/Cargo.toml +++ b/bin/reth/Cargo.toml @@ -81,7 +81,6 @@ hyper = "0.14.25" # misc eyre = "0.6.8" clap = { version = "4", features = ["derive"] } -num_cpus = "1.13.0" tempfile = { version = "3.3.0" } backon = "0.4" hex = "0.4" diff --git a/bin/reth/src/args/mod.rs b/bin/reth/src/args/mod.rs index 30b7066e6..a77e1e446 100644 --- a/bin/reth/src/args/mod.rs +++ b/bin/reth/src/args/mod.rs @@ -16,8 +16,8 @@ mod secret_key; pub use secret_key::{get_secret_key, SecretKeyError}; /// MinerArgs struct for configuring the miner -mod payload_build_args; -pub use payload_build_args::PayloadBuilderArgs; +mod payload_builder_args; +pub use payload_builder_args::PayloadBuilderArgs; /// Stage related arguments mod stage_args; diff --git a/bin/reth/src/args/payload_build_args.rs b/bin/reth/src/args/payload_build_args.rs deleted file mode 100644 index d448e023b..000000000 --- a/bin/reth/src/args/payload_build_args.rs +++ /dev/null @@ -1,56 +0,0 @@ -use clap::{builder::RangedU64ValueParser, Args}; -use reth_primitives::Address; - -/// Parameters for configuring the Payload Builder -#[derive(Debug, Args, PartialEq, Default)] -pub struct PayloadBuilderArgs { - /// Public address for block mining rewards - #[arg(long = "builder.etherbase", help_heading = "Builder")] - pub etherbase: Option
, - - /// Block extra data set by the builder - #[arg(long = "builder.extradata", help_heading = "Builder")] - pub extradata: Option, - - /// Target gas ceiling for mined blocks - #[arg(long = "builder.gaslimit", help_heading = "Builder")] - pub gaslimit: Option, - - /// Minimum gas price for mining a transaction - #[arg(long = "builder.gasprice", help_heading = "Builder")] - pub gasprice: Option, - - /// Time interval to recreate the block being mined in seconds - #[arg(long = "builder.recommit", help_heading = "Builder")] - pub recommit: Option, - - /// Number of CPU threads to use for mining - #[arg(long = "builder.threads", help_heading = "Builder", value_parser = RangedU64ValueParser::::new().range(1..=num_cpus::get() as u64))] - pub num_threads: Option, -} - -#[cfg(test)] -mod tests { - - use super::*; - use clap::{Args, Parser}; - - /// A helper type to parse Args more easily - #[derive(Parser)] - struct CommandParser { - #[clap(flatten)] - args: T, - } - - #[test] - fn test_args_with_valid_num_threads() { - let num_cpus = num_cpus::get(); - let args = CommandParser::::parse_from([ - "reth", - "--builder.threads", - &format!("{}", num_cpus), - ]) - .args; - assert!(args.num_threads.is_some()) - } -} diff --git a/bin/reth/src/args/payload_builder_args.rs b/bin/reth/src/args/payload_builder_args.rs new file mode 100644 index 000000000..caa7d94ef --- /dev/null +++ b/bin/reth/src/args/payload_builder_args.rs @@ -0,0 +1,64 @@ +use crate::{utils::parse_duration_from_secs, version::P2P_VERSION}; +use clap::{builder::RangedU64ValueParser, Args}; +use std::time::Duration; + +/// Parameters for configuring the Payload Builder +#[derive(Debug, Args, PartialEq, Default)] +pub struct PayloadBuilderArgs { + /// Extra block data set by the builder. + #[arg(long = "builder.extradata", help_heading = "Builder", default_value = P2P_VERSION)] + pub extradata: String, + + /// Target gas ceiling for built blocks. + #[arg( + long = "builder.gaslimit", + help_heading = "Builder", + default_value = "30000000", + value_name = "GAS_LIMIT" + )] + pub max_gas_limit: u64, + + /// The interval at which the job should build a new payload after the last (in seconds). + #[arg(long = "builder.interval", help_heading = "Builder", value_parser = parse_duration_from_secs, default_value = "1", value_name = "SECONDS")] + pub interval: Duration, + + /// The deadline for when the payload builder job should resolve. + #[arg(long = "builder.deadline", help_heading = "Builder", value_parser = parse_duration_from_secs, default_value = "12", value_name = "SECONDS")] + pub deadline: Duration, + + /// Maximum number of tasks to spawn for building a payload. + #[arg(long = "builder.max-tasks", help_heading = "Builder", default_value = "3", value_parser = RangedU64ValueParser::::new().range(1..))] + pub max_payload_tasks: usize, +} + +#[cfg(test)] +mod tests { + + use super::*; + use clap::{Args, Parser}; + + /// A helper type to parse Args more easily + #[derive(Parser)] + struct CommandParser { + #[clap(flatten)] + args: T, + } + + #[test] + fn test_args_with_valid_max_tasks() { + let args = + CommandParser::::parse_from(["reth", "--builder.max-tasks", "1"]) + .args; + assert_eq!(args.max_payload_tasks, 1) + } + + #[test] + fn test_args_with_invalid_max_tasks() { + assert!(CommandParser::::try_parse_from([ + "reth", + "--builder.max-tasks", + "0" + ]) + .is_err()); + } +} diff --git a/bin/reth/src/node/mod.rs b/bin/reth/src/node/mod.rs index 77aebff33..699e16b99 100644 --- a/bin/reth/src/node/mod.rs +++ b/bin/reth/src/node/mod.rs @@ -71,10 +71,12 @@ use std::{ use tokio::sync::{mpsc::unbounded_channel, oneshot, watch}; use tracing::*; -use crate::dirs::MaybePlatformPath; +use crate::{args::PayloadBuilderArgs, dirs::MaybePlatformPath}; use reth_interfaces::p2p::headers::client::HeadersClient; use reth_payload_builder::PayloadBuilderService; +use reth_primitives::bytes::BytesMut; use reth_provider::providers::BlockchainProvider; +use reth_rlp::Encodable; use reth_stages::stages::{MERKLE_EXECUTION, MERKLE_UNWIND}; pub mod events; @@ -105,11 +107,11 @@ pub struct Command { /// - goerli /// - sepolia #[arg( - long, - value_name = "CHAIN_OR_PATH", - verbatim_doc_comment, - default_value = "mainnet", - value_parser = genesis_value_parser + long, + value_name = "CHAIN_OR_PATH", + verbatim_doc_comment, + default_value = "mainnet", + value_parser = genesis_value_parser )] chain: Arc, @@ -125,6 +127,9 @@ pub struct Command { #[clap(flatten)] rpc: RpcServerArgs, + #[clap(flatten)] + builder: PayloadBuilderArgs, + #[clap(flatten)] debug: DebugArgs, @@ -246,12 +251,18 @@ impl Command { let (consensus_engine_tx, consensus_engine_rx) = unbounded_channel(); // configure the payload builder + let mut extradata = BytesMut::new(); + self.builder.extradata.as_bytes().encode(&mut extradata); let payload_generator = BasicPayloadJobGenerator::new( blockchain_db.clone(), transaction_pool.clone(), ctx.task_executor.clone(), - // TODO use extradata from args - BasicPayloadJobGeneratorConfig::default(), + BasicPayloadJobGeneratorConfig::default() + .interval(self.builder.interval) + .deadline(self.builder.deadline) + .max_payload_tasks(self.builder.max_payload_tasks) + .extradata(extradata.freeze()) + .max_gas_limit(self.builder.max_gas_limit), Arc::clone(&self.chain), ); let (payload_service, payload_builder) = PayloadBuilderService::new(payload_generator); diff --git a/bin/reth/src/utils.rs b/bin/reth/src/utils.rs index bea92485c..1e586afe8 100644 --- a/bin/reth/src/utils.rs +++ b/bin/reth/src/utils.rs @@ -16,7 +16,7 @@ use reth_interfaces::{ }; use reth_primitives::{BlockHashOrNumber, HeadersDirection, SealedHeader}; use reth_provider::insert_canonical_block; -use std::{collections::BTreeMap, path::Path}; +use std::{collections::BTreeMap, path::Path, time::Duration}; use tracing::info; /// Get a single header from network @@ -119,3 +119,9 @@ impl<'a, DB: Database> DbTool<'a, DB> { Ok(()) } } + +/// Helper to parse a [Duration] from seconds +pub fn parse_duration_from_secs(arg: &str) -> Result { + let seconds = arg.parse()?; + Ok(Duration::from_secs(seconds)) +} diff --git a/crates/payload/basic/src/lib.rs b/crates/payload/basic/src/lib.rs index 9ac539d04..17472920d 100644 --- a/crates/payload/basic/src/lib.rs +++ b/crates/payload/basic/src/lib.rs @@ -174,11 +174,11 @@ impl PayloadTaskGuard { pub struct BasicPayloadJobGeneratorConfig { /// Data to include in the block's extra data field. extradata: Bytes, - /// Target gas ceiling for mined blocks, defaults to 30_000_000 gas. + /// Target gas ceiling for built blocks, defaults to 30_000_000 gas. max_gas_limit: u64, /// The interval at which the job should build a new payload after the last. interval: Duration, - /// The deadline when this job should resolve. + /// The deadline for when the payload builder job should resolve. deadline: Duration, /// Maximum number of tasks to spawn for building a payload. max_payload_tasks: usize,