Skip to content

Commit 070ac27

Browse files
committed
refactor
1 parent 41c4844 commit 070ac27

29 files changed

+531
-247
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ ethereum-types = "0.14.1"
3737
# networking
3838
axum = "0.7.5"
3939
axum-extra = { version = "0.9.3", features = ["typed-header"] }
40-
reqwest = "0.12.4"
40+
reqwest = { version = "0.12.4", features = ["json"] }
4141
headers = "0.4.0"
4242

4343
# async
File renamed without changes.

LICENSE renamed to LICENSE-MIT

File renamed without changes.

bin/commit-boost/src/main.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use cb_cli::runner::Runner;
21
use cb_common::utils::initialize_tracing_log;
3-
use cb_pbs::{BuilderState, DefaultBuilderApi};
42
use clap::Parser;
53

64
#[tokio::main]
@@ -12,12 +10,9 @@ async fn main() {
1210

1311
initialize_tracing_log();
1412

15-
let (chain, config) = cb_cli::Args::parse().to_config();
13+
let args = cb_cli::Args::parse();
1614

17-
let state = BuilderState::new(chain, config);
18-
let runner = Runner::<(), DefaultBuilderApi>::new(state);
19-
20-
if let Err(err) = runner.run().await {
15+
if let Err(err) = args.run().await {
2116
eprintln!("Error: {err}");
2217
std::process::exit(1)
2318
};

config.example.toml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
chain = "Holesky"
2+
3+
[pbs]
4+
# path = "target/debug/custom_boost"
5+
address = "127.0.0.1:18550"
6+
relays = []
7+
relay_check = true
8+
timeout_get_header_ms = 950
9+
timeout_get_payload_ms = 4000
10+
timeout_register_validator_ms = 3000
11+
skip_sigverify = true
12+
min_bid_eth = 0.0
13+
14+
[signer]
15+
address = "127.0.0.1:33950"
16+
17+
[[modules]]
18+
id = "DA_COMMIT"
19+
path = "target/debug/da_commit"
20+
sleep_secs = 5

crates/cli/src/lib.rs

+96-67
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,119 @@
1-
use std::net::SocketAddr;
1+
use std::process::Stdio;
22

3-
use cb_common::{config::BuilderConfig, pbs::RelayEntry, types::Chain, utils::eth_to_wei};
3+
use cb_common::{
4+
config::{CommitBoostConfig, CONFIG_PATH_ENV, MODULE_ID_ENV},
5+
utils::print_logo,
6+
};
7+
use cb_crypto::service::SigningService;
8+
use cb_pbs::{BuilderState, DefaultBuilderApi, PbsService};
49
use clap::{Parser, Subcommand};
510

6-
pub mod runner;
7-
811
#[derive(Parser, Debug)]
912
#[command(version, about)]
1013
pub struct Args {
1114
#[command(subcommand)]
1215
pub cmd: Command,
13-
14-
/// Start with Holesky spec
15-
#[arg(long, global = true)]
16-
pub holesky: bool,
16+
// /// Start with Holesky spec
17+
// #[arg(long, global = true)]
18+
// pub holesky: bool,
1719
}
1820

1921
#[derive(Debug, Subcommand)]
2022
pub enum Command {
21-
/// Pbs module configs, try to keep compatibility with MEV boost cli configs
22-
Boost {
23-
/// Address to start for boost server on
24-
#[arg(short, long, default_value = "127.0.0.1:18550", env = "BOOST_LISTEN_ADDR")]
25-
listen_address: SocketAddr,
26-
/// Add a single relay (can be repeated or comma separated). Format is scheme://pubkey@host
27-
#[arg(short, long, visible_alias = "relays", env = "RELAYS", num_args = 1.., required = true, value_delimiter = ',')]
28-
relay: Vec<String>,
29-
/// Check relay status on startup and getStatus calls
30-
#[arg(long, env = "RELAY_STARTUP_CHECK")]
31-
relay_check: bool,
32-
/// Timeout in ms for calling getHeader to relays
33-
#[arg(long, default_value_t = 950, env = "RELAY_TIMEOUT_MS_GETHEADER")]
34-
timeout_get_header_ms: u64,
35-
/// Timeout in ms for calling getPayload to relays
36-
#[arg(long, default_value_t = 4000, env = "RELAY_TIMEOUT_MS_GETPAYLOAD")]
37-
timeout_get_payload_ms: u64,
38-
/// Timeout in ms for calling registerValidator to relays
39-
#[arg(long, default_value_t = 3000, env = "RELAY_TIMEOUT_MS_REGVAL")]
40-
timeout_register_validator_ms: u64,
41-
/// Skip signature verification for relay headers
42-
#[arg(long)]
43-
skip_sigverify: bool,
44-
/// Minimum bid to accept from relays in ETH
45-
#[arg(long, default_value_t = 0.0, env = "MIN_BID_ETH")]
46-
min_bid_eth: f64,
23+
// /// Start pbs module, signing server and commit modules
24+
// Start {
25+
// /// Address to start for boost server on
26+
// #[arg(short, long, default_value = "127.0.0.1:18550", env = "BOOST_LISTEN_ADDR")]
27+
// pbs_address: SocketAddr,
28+
// /// Add a single relay (can be repeated or comma separated). Format is
29+
// scheme://pubkey@host #[arg(short, long, visible_alias = "relays", env = "RELAYS",
30+
// num_args = 1.., required = true, value_delimiter = ',')] relay: Vec<String>,
31+
// #[arg(long)]
32+
// pbs: Option<String>,
33+
// /// Check relay status on startup and getStatus calls
34+
// #[arg(long, env = "RELAY_STARTUP_CHECK")]
35+
// relay_check: bool,
36+
// /// Timeout in ms for calling getHeader to relays
37+
// #[arg(long, default_value_t = 950, env = "RELAY_TIMEOUT_MS_GETHEADER")]
38+
// timeout_get_header_ms: u64,
39+
// /// Timeout in ms for calling getPayload to relays
40+
// #[arg(long, default_value_t = 4000, env = "RELAY_TIMEOUT_MS_GETPAYLOAD")]
41+
// timeout_get_payload_ms: u64,
42+
// /// Timeout in ms for calling registerValidator to relays
43+
// #[arg(long, default_value_t = 3000, env = "RELAY_TIMEOUT_MS_REGVAL")]
44+
// timeout_register_validator_ms: u64,
45+
// /// Skip signature verification for relay headers
46+
// #[arg(long)]
47+
// skip_sigverify: bool,
48+
// /// Minimum bid to accept from relays in ETH
49+
// #[arg(long, default_value_t = 0.0, env = "MIN_BID_ETH")]
50+
// min_bid_eth: f64,
51+
// /// Address where to start the service on
52+
// #[arg(long, default_value = "127.0.0.1:33950", env = SIGNER_LISTEN_ADDR)]
53+
// sign_address: SocketAddr,
54+
// /// Path to executable
55+
// #[arg(short, long, num_args = 1.., required = true, value_delimiter = ',')]
56+
// module: Vec<String>,
57+
// },
58+
Start {
59+
/// Path to config file
60+
config: String,
4761
},
4862
}
4963

5064
impl Args {
51-
pub fn to_config(self) -> (Chain, BuilderConfig) {
52-
let chain = if self.holesky { Chain::Holesky } else { Chain::Mainnet };
65+
pub async fn run(self) -> eyre::Result<()> {
66+
print_logo();
5367

5468
match self.cmd {
55-
Command::Boost {
56-
listen_address: address,
57-
relay,
58-
relay_check,
59-
timeout_get_header_ms,
60-
timeout_get_payload_ms,
61-
timeout_register_validator_ms,
62-
skip_sigverify,
63-
min_bid_eth,
64-
} => {
65-
let config = BuilderConfig {
66-
address,
67-
relays: deser_relay_vec(relay),
68-
relay_check,
69-
timeout_get_header_ms,
70-
timeout_get_payload_ms,
71-
timeout_register_validator_ms,
72-
skip_sigverify,
73-
min_bid_wei: eth_to_wei(min_bid_eth),
74-
};
75-
println!("{}", serde_json::to_string_pretty(&config).unwrap());
76-
(chain, config)
69+
Command::Start { config: config_path } => {
70+
let config = CommitBoostConfig::from_file(&config_path);
71+
72+
// this mocks the commit boost client starting containers, processes etc
73+
let mut child_handles = Vec::with_capacity(config.modules.len());
74+
75+
for module in config.modules {
76+
let child = std::process::Command::new(module.path)
77+
.env(MODULE_ID_ENV, module.id)
78+
.env(CONFIG_PATH_ENV, &config_path)
79+
.spawn()
80+
.expect("failed to start process");
81+
82+
child_handles.push(child);
83+
}
84+
85+
// start signing server
86+
tokio::spawn(SigningService::run(config.chain, config.signer));
87+
88+
// start pbs server
89+
if let Some(pbs_path) = config.pbs.path {
90+
let cmd = std::process::Command::new(pbs_path)
91+
.env(CONFIG_PATH_ENV, &config_path)
92+
.stdout(Stdio::inherit())
93+
.stderr(Stdio::inherit())
94+
.output()
95+
.expect("failed to start pbs module");
96+
97+
if !cmd.status.success() {
98+
eprintln!("Process failed with status: {}", cmd.status);
99+
}
100+
} else {
101+
let state = BuilderState::<()>::new(config.chain, config.pbs);
102+
PbsService::run::<(), DefaultBuilderApi>(state).await;
103+
}
77104
}
78105
}
106+
107+
Ok(())
79108
}
80109
}
81110

82-
fn deser_relay_vec(relays: Vec<String>) -> Vec<RelayEntry> {
83-
relays
84-
.into_iter()
85-
.map(|s| {
86-
serde_json::from_str::<RelayEntry>(&format!("\"{}\"", s.trim()))
87-
.expect("invalid relay format, should be scheme://pubkey@host")
88-
})
89-
.collect()
90-
}
111+
// fn deser_relay_vec(relays: Vec<String>) -> Vec<RelayEntry> {
112+
// relays
113+
// .into_iter()
114+
// .map(|s| {
115+
// serde_json::from_str::<RelayEntry>(&format!("\"{}\"", s.trim()))
116+
// .expect("invalid relay format, should be scheme://pubkey@host")
117+
// })
118+
// .collect()
119+
// }

crates/cli/src/runner.rs

+15-18
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@ use std::{collections::HashSet, future::Future, marker::PhantomData};
33
use alloy_rpc_types_beacon::BlsPublicKey;
44
use cb_crypto::{
55
manager::{Signer, SigningManager},
6-
service::SigningService,
76
types::SignRequest,
87
};
9-
use cb_pbs::{
10-
BuilderApi, BuilderApiState, BuilderEvent, BuilderState, DefaultBuilderApi, PbsService,
11-
};
8+
use cb_pbs::{BuilderApi, BuilderApiState, BuilderEvent, BuilderState, DefaultBuilderApi};
129
use tokio::sync::{
1310
broadcast,
1411
mpsc::{self, unbounded_channel, UnboundedSender},
@@ -23,13 +20,13 @@ pub struct Runner<S: BuilderApiState = (), T: BuilderApi<S> = DefaultBuilderApi>
2320
sign_manager: SigningManager,
2421

2522
notif_tx: SignRequestSender,
26-
notif_rx: mpsc::UnboundedReceiver<SignRequest>,
23+
2724
_marker: PhantomData<T>,
2825
}
2926

3027
impl<S: BuilderApiState, T: BuilderApi<S>> Runner<S, T> {
3128
pub fn new(state: BuilderState<S>) -> Self {
32-
let (notif_tx, notif_rx) = unbounded_channel();
29+
let (notif_tx, _) = unbounded_channel();
3330

3431
// TODO: move this in run + spawn only if needed
3532
let mut sign_manager = SigningManager::new(state.chain);
@@ -41,7 +38,7 @@ impl<S: BuilderApiState, T: BuilderApi<S>> Runner<S, T> {
4138
hooks_ids: HashSet::new(),
4239
sign_manager,
4340
notif_tx,
44-
notif_rx,
41+
4542
_marker: PhantomData,
4643
}
4744
}
@@ -78,18 +75,18 @@ impl<S: BuilderApiState, T: BuilderApi<S>> Runner<S, T> {
7875
tokio::spawn(hook(self.state.subscribe_events()));
7976
}
8077

81-
pub async fn run(self) -> eyre::Result<()> {
82-
// start signature service
83-
if !self.commit_ids.is_empty() {
84-
let sign_service = SigningService::new(self.sign_manager, self.notif_rx);
85-
tokio::spawn(sign_service.run());
86-
}
78+
// pub async fn run(self) -> eyre::Result<()> {
79+
// // start signature service
80+
// if !self.commit_ids.is_empty() {
81+
// let sign_service = SigningService::new(self.sign_manager, self.notif_rx);
82+
// tokio::spawn(sign_service.run());
83+
// }
8784

88-
// TODO: start commitments and hooks here
85+
// // TODO: start commitments and hooks here
8986

90-
// start boost service
91-
PbsService::run::<S, T>(self.state).await;
87+
// // start boost service
88+
// PbsService::run::<S, T>(self.state).await;
9289

93-
Ok(())
94-
}
90+
// Ok(())
91+
// }
9592
}

crates/common/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ url.workspace = true
1313

1414
tracing.workspace = true
1515
tracing-subscriber.workspace = true
16+
toml.workspace = true
1617

1718
[dev-dependencies]
1819
serde_json.workspace = true

0 commit comments

Comments
 (0)