mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: integrate payload builder args in cli (#2757)
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -4548,7 +4548,6 @@ dependencies = [
|
||||
"metrics",
|
||||
"metrics-exporter-prometheus",
|
||||
"metrics-util",
|
||||
"num_cpus",
|
||||
"pin-project",
|
||||
"pretty_assertions",
|
||||
"proptest",
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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())
|
||||
}
|
||||
}
|
||||
64
bin/reth/src/args/payload_builder_args.rs
Normal file
64
bin/reth/src/args/payload_builder_args.rs
Normal 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());
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user