feat: integrate payload builder args in cli (#2757)

This commit is contained in:
Bjerg
2023-05-20 09:10:32 +02:00
committed by GitHub
parent 8e89360774
commit 2416756b20
8 changed files with 94 additions and 71 deletions

1
Cargo.lock generated
View File

@ -4548,7 +4548,6 @@ dependencies = [
"metrics",
"metrics-exporter-prometheus",
"metrics-util",
"num_cpus",
"pin-project",
"pretty_assertions",
"proptest",

View File

@ -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"

View File

@ -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;

View File

@ -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<Address>,
/// Block extra data set by the builder
#[arg(long = "builder.extradata", help_heading = "Builder")]
pub extradata: Option<String>,
/// Target gas ceiling for mined blocks
#[arg(long = "builder.gaslimit", help_heading = "Builder")]
pub gaslimit: Option<u64>,
/// Minimum gas price for mining a transaction
#[arg(long = "builder.gasprice", help_heading = "Builder")]
pub gasprice: Option<u64>,
/// Time interval to recreate the block being mined in seconds
#[arg(long = "builder.recommit", help_heading = "Builder")]
pub recommit: Option<u32>,
/// Number of CPU threads to use for mining
#[arg(long = "builder.threads", help_heading = "Builder", value_parser = RangedU64ValueParser::<usize>::new().range(1..=num_cpus::get() as u64))]
pub num_threads: Option<usize>,
}
#[cfg(test)]
mod tests {
use super::*;
use clap::{Args, Parser};
/// A helper type to parse Args more easily
#[derive(Parser)]
struct CommandParser<T: Args> {
#[clap(flatten)]
args: T,
}
#[test]
fn test_args_with_valid_num_threads() {
let num_cpus = num_cpus::get();
let args = CommandParser::<PayloadBuilderArgs>::parse_from([
"reth",
"--builder.threads",
&format!("{}", num_cpus),
])
.args;
assert!(args.num_threads.is_some())
}
}

View File

@ -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::<usize>::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<T: Args> {
#[clap(flatten)]
args: T,
}
#[test]
fn test_args_with_valid_max_tasks() {
let args =
CommandParser::<PayloadBuilderArgs>::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::<PayloadBuilderArgs>::try_parse_from([
"reth",
"--builder.max-tasks",
"0"
])
.is_err());
}
}

View File

@ -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;
@ -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);

View File

@ -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<Duration, std::num::ParseIntError> {
let seconds = arg.parse()?;
Ok(Duration::from_secs(seconds))
}

View File

@ -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,