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,