From 605cbd0ee42adfd20f62576cef7d861f3c6d4955 Mon Sep 17 00:00:00 2001 From: ZanCorDX <126988525+ZanCorDX@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:12:45 -0300 Subject: [PATCH] New flag require-non-empty-blocklist (#397) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📝 Summary This flag is backwards compatible. When set true makes use more robust for those looking to enforce a blocklist. ## ✅ I have completed the following steps: * [X] Run `make lint` * [X] Run `make test` * [X] Added tests (if applicable) --- .../src/backtest/backtest_build_range.rs | 2 +- .../build_block/landed_block_from_db.rs | 2 +- .../src/backtest/redistribute/cli/mod.rs | 2 +- .../rbuilder/src/live_builder/base_config.rs | 46 +++++++++++++++++-- crates/rbuilder/src/live_builder/config.rs | 2 +- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/crates/rbuilder/src/backtest/backtest_build_range.rs b/crates/rbuilder/src/backtest/backtest_build_range.rs index e940ddf7..dad46e49 100644 --- a/crates/rbuilder/src/backtest/backtest_build_range.rs +++ b/crates/rbuilder/src/backtest/backtest_build_range.rs @@ -135,7 +135,7 @@ where let blocklist = config .base_config() - .blocklist_provider(false, cancel_token.clone()) + .blocklist_provider(cancel_token.clone()) .await? .get_blocklist()?; diff --git a/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs b/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs index 1df4fd8f..d8c82f81 100644 --- a/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs +++ b/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs @@ -80,7 +80,7 @@ impl LandedBlockFromDBOrdersSource { .await?; let blocklist = config .base_config() - .blocklist_provider(false, CancellationToken::new()) + .blocklist_provider(CancellationToken::new()) .await? .get_blocklist()?; diff --git a/crates/rbuilder/src/backtest/redistribute/cli/mod.rs b/crates/rbuilder/src/backtest/redistribute/cli/mod.rs index 8b605747..86b5e5d2 100644 --- a/crates/rbuilder/src/backtest/redistribute/cli/mod.rs +++ b/crates/rbuilder/src/backtest/redistribute/cli/mod.rs @@ -59,7 +59,7 @@ where let blocklist = config .base_config() - .blocklist_provider(false, CancellationToken::new()) + .blocklist_provider(CancellationToken::new()) .await? .get_blocklist()?; diff --git a/crates/rbuilder/src/live_builder/base_config.rs b/crates/rbuilder/src/live_builder/base_config.rs index d68fa302..55b92325 100644 --- a/crates/rbuilder/src/live_builder/base_config.rs +++ b/crates/rbuilder/src/live_builder/base_config.rs @@ -102,6 +102,9 @@ pub struct BaseConfig { /// Like blocklist_url_max_age_hours but in secs for integration tests. pub blocklist_url_max_age_secs: Option, + /// if true will not allow to start without a blocklist or with an empty blocklist. + pub require_non_empty_blocklist: Option, + #[serde(deserialize_with = "deserialize_extra_data")] pub extra_data: Vec, @@ -299,25 +302,40 @@ impl BaseConfig { pub async fn blocklist_provider( &self, - validate_blocklist: bool, cancellation_token: tokio_util::sync::CancellationToken, ) -> eyre::Result> { if self.blocklist.is_some() && self.blocklist_file_path.is_some() { eyre::bail!("You can't use blocklist AND blocklist_file_path") } + let require_non_empty_blocklist = self + .require_non_empty_blocklist + .unwrap_or(DEFAULT_REQUIRE_NON_EMPTY_BLOCKLIST); + if self.blocklist_file_path.is_none() + && self.blocklist.is_none() + && require_non_empty_blocklist + { + eyre::bail!("require_non_empty_blocklist = true but no blocklist used (blocklist_file_path/blocklist are not set)"); + } + if let Some(blocklist) = &self.blocklist { // First try url loading match Url::parse(blocklist) { Ok(url) => { return self - .blocklist_provider_from_url(url, validate_blocklist, cancellation_token) + .blocklist_provider_from_url( + url, + require_non_empty_blocklist, + cancellation_token, + ) .await; } Err(_) => { // second try file loading - return self - .blocklist_provider_from_file(&blocklist.into(), validate_blocklist); + return self.blocklist_provider_from_file( + &blocklist.into(), + require_non_empty_blocklist, + ); } } } @@ -325,7 +343,8 @@ impl BaseConfig { // Backwards compatibility if let Some(blocklist_file_path) = &self.blocklist_file_path { warn!("blocklist_file_path is deprecated please use blocklist"); - return self.blocklist_provider_from_file(blocklist_file_path, validate_blocklist); + return self + .blocklist_provider_from_file(blocklist_file_path, require_non_empty_blocklist); } // default to empty @@ -467,6 +486,7 @@ pub const DEFAULT_INCOMING_BUNDLES_PORT: u16 = 8645; pub const DEFAULT_RETH_DB_PATH: &str = "/mnt/data/reth"; /// This will update every 2.4 hours, super reasonable. pub const DEFAULT_BLOCKLIST_URL_MAX_AGE_HOURS: u64 = 24; +pub const DEFAULT_REQUIRE_NON_EMPTY_BLOCKLIST: bool = false; impl Default for BaseConfig { fn default() -> Self { @@ -510,6 +530,7 @@ impl Default for BaseConfig { simulation_threads: 1, sbundle_mergeable_signers: None, sbundle_mergeabe_signers: None, + require_non_empty_blocklist: Some(DEFAULT_REQUIRE_NON_EMPTY_BLOCKLIST), } } } @@ -611,6 +632,7 @@ mod test { use reth_node_core::dirs::{DataDirPath, MaybePlatformPath}; use reth_provider::{providers::StaticFileProvider, ProviderFactory}; use tempfile::TempDir; + use tokio_util::sync::CancellationToken; #[test] fn test_default_config() { @@ -620,6 +642,20 @@ mod test { assert_eq!(config, config_default); } + #[tokio::test] + async fn test_require_non_empty_blocklist() { + let config = BaseConfig { + blocklist: None, + blocklist_file_path: None, + require_non_empty_blocklist: Some(true), + ..Default::default() + }; + assert!(config + .blocklist_provider(CancellationToken::new()) + .await + .is_err()); + } + #[test] fn test_reth_db() { // Setup and initialize a temp reth db (with static files) diff --git a/crates/rbuilder/src/live_builder/config.rs b/crates/rbuilder/src/live_builder/config.rs index 4052de16..c0974e70 100644 --- a/crates/rbuilder/src/live_builder/config.rs +++ b/crates/rbuilder/src/live_builder/config.rs @@ -409,7 +409,7 @@ impl LiveBuilderConfig for Config { let blocklist_provider = self .base_config - .blocklist_provider(false, cancellation_token.clone()) + .blocklist_provider(cancellation_token.clone()) .await?; let payload_event = MevBoostSlotDataGenerator::new( self.l1_config.beacon_clients()?,