From 4c4d8db8438bbb267dad94926bf81344b751403b Mon Sep 17 00:00:00 2001 From: fmoletta Date: Fri, 22 Aug 2025 15:52:37 -0300 Subject: [PATCH 01/11] prune-blocks first iteration --- Cargo.lock | 23 ++++++++ Cargo.toml | 2 +- crates/storage/api.rs | 4 ++ crates/storage/store.rs | 6 ++ crates/storage/store_db/in_memory.rs | 20 +++++++ crates/storage/store_db/libmdbx.rs | 34 +++++++++++ tooling/prune-blocks/Cargo.toml | 23 ++++++++ tooling/prune-blocks/src/main.rs | 85 ++++++++++++++++++++++++++++ 8 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 tooling/prune-blocks/Cargo.toml create mode 100644 tooling/prune-blocks/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index ec23c90882..ba012db8af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8564,6 +8564,29 @@ version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +[[package]] +name = "prune-blocks" +version = "0.1.0" +dependencies = [ + "clap 4.5.40", + "clap_complete", + "ethrex", + "ethrex-common", + "ethrex-rlp", + "ethrex-rpc", + "ethrex-storage", + "eyre", + "hex", + "keccak-hash", + "lazy_static", + "reqwest 0.12.20", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber 0.3.19", +] + [[package]] name = "ptr_meta" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 3a452e91a7..2ff3613ccb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ members = [ "tooling/load_test", "tooling/loc", "tooling/archive_sync", - "crates/common/config", + "crates/common/config", "tooling/prune-blocks", ] resolver = "2" diff --git a/crates/storage/api.rs b/crates/storage/api.rs index e0d9cbf4a4..50f28f2f72 100644 --- a/crates/storage/api.rs +++ b/crates/storage/api.rs @@ -53,6 +53,10 @@ pub trait StoreEngine: Debug + Send + Sync + RefUnwindSafe { /// Remove canonical block async fn remove_block(&self, block_number: BlockNumber) -> Result<(), StoreError>; + /// Removes Block and all asociated data (receipts, transaction locations, etc) + /// Doesn't fail if the block doesn't exist or has missing data + async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError>; + /// Obtain canonical block bodies in from..=to async fn get_block_bodies( &self, diff --git a/crates/storage/store.rs b/crates/storage/store.rs index 5100c7d39a..23fd5cc1e3 100644 --- a/crates/storage/store.rs +++ b/crates/storage/store.rs @@ -219,6 +219,12 @@ impl Store { self.engine.remove_block(block_number).await } + /// Removes Block and all asociated data (receipts, transaction locations, etc) + /// Doesn't fail if the block doesn't exist or has missing data + pub async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError> { + self.engine.purge_block(block_number).await + } + pub async fn get_block_bodies( &self, from: BlockNumber, diff --git a/crates/storage/store_db/in_memory.rs b/crates/storage/store_db/in_memory.rs index e0500ca970..99e82075f9 100644 --- a/crates/storage/store_db/in_memory.rs +++ b/crates/storage/store_db/in_memory.rs @@ -177,6 +177,26 @@ impl StoreEngine for Store { Ok(()) } + async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError> { + let mut store = self.inner()?; + let Some(block_hash) = store.canonical_hashes.remove(&block_number)else { + // Block must have been already purged + return Ok(()) + }; + // Obtain block hash & block body so we can use it to remove receipts & transactions + if let Some(block_body) = store.bodies.remove(&block_hash) { + // Remove transaction location and receipts. Note that if the block was obtained via snap sync these are not guaranteed to exist + for tx_hash in block_body.transactions.iter().map(|tx| tx.hash()) { + store.transaction_locations.remove(&tx_hash); + } + store.receipts.remove(&block_hash); + } + // Remove block header & number + store.headers.remove(&block_hash); + store.block_numbers.remove(&block_hash); + Ok(()) + } + async fn get_block_bodies( &self, from: BlockNumber, diff --git a/crates/storage/store_db/libmdbx.rs b/crates/storage/store_db/libmdbx.rs index 9a469aa6a0..88dcde741c 100644 --- a/crates/storage/store_db/libmdbx.rs +++ b/crates/storage/store_db/libmdbx.rs @@ -322,6 +322,40 @@ impl StoreEngine for Store { txn.commit().map_err(StoreError::LibmdbxError) } + async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError> { + let txn = self + .db + .begin_readwrite() + .map_err(StoreError::LibmdbxError)?; + let Some(block_hash) = txn.get::(block_number).map_err(StoreError::LibmdbxError)? else { + // Block must have been already purged + txn.commit().map_err(StoreError::LibmdbxError)?; + return Ok(()) + }; + let block_hash = block_hash.to()?; + // Obtain block hash & block body so we can use it to remove receipts & transactions + if let Some(block_body) = txn.get::(block_hash.into()).map_err(StoreError::LibmdbxError)? { + let block_body = block_body.to()?; + // Remove transaction location and receipts. Note that if the block was obtained via snap sync these are not guaranteed to exist + for (idx, tx_hash) in block_body.transactions.iter().map(|tx| tx.hash()).enumerate() { + txn.delete::(tx_hash.into(), None).map_err(StoreError::LibmdbxError)?; + txn.delete::((block_hash, idx as u64).into(), None).map_err(StoreError::LibmdbxError)?; + } + // Remove body + txn.delete::(block_hash.into(), None) + .map_err(StoreError::LibmdbxError)?; + } + // Remove block header, hash & number + txn.delete::(block_number, None) + .map_err(StoreError::LibmdbxError)?; + txn.delete::(block_hash.into(), None) + .map_err(StoreError::LibmdbxError)?; + txn.delete::(block_hash.into(), None) + .map_err(StoreError::LibmdbxError)?; + + txn.commit().map_err(StoreError::LibmdbxError) + } + async fn get_block_bodies( &self, from: BlockNumber, diff --git a/tooling/prune-blocks/Cargo.toml b/tooling/prune-blocks/Cargo.toml new file mode 100644 index 0000000000..2dd082367a --- /dev/null +++ b/tooling/prune-blocks/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "prune-blocks" +version.workspace = true +edition.workspace = true + +[dependencies] +lazy_static.workspace = true +ethrex-common.workspace = true +ethrex-storage.workspace = true +ethrex-rlp.workspace = true +ethrex-rpc.workspace = true +keccak-hash.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber = { version = "0.3", features = ["fmt"] } +clap = { workspace = true, features = ["string"] } +clap_complete.workspace = true +eyre.workspace = true +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +hex.workspace = true +ethrex.workspace = true diff --git a/tooling/prune-blocks/src/main.rs b/tooling/prune-blocks/src/main.rs new file mode 100644 index 0000000000..8f074156d1 --- /dev/null +++ b/tooling/prune-blocks/src/main.rs @@ -0,0 +1,85 @@ +use std::time::{Duration, Instant}; + +use clap::Parser; +use ethrex::{initializers::load_store, utils::{default_datadir, init_datadir}}; +use tracing::info; +use tracing_subscriber::FmtSubscriber; + +const MIN_BLOCKS_TO_KEEP: u64 = 128; + +fn mseconds_to_readable(mut mseconds: u128) -> String { + const DAY: u128 = 24 * HOUR; + const HOUR: u128 = 60 * MINUTE; + const MINUTE: u128 = 60 * SECOND; + const SECOND: u128 = 1000 * MSECOND; + const MSECOND: u128 = 1; + let mut res = String::new(); + let mut apply_time_unit = |unit_in_ms: u128, unit_str: &str| { + if mseconds > unit_in_ms { + let amount_of_unit = mseconds / unit_in_ms; + res.push_str(&format!("{amount_of_unit}{unit_str}")); + mseconds -= unit_in_ms * amount_of_unit + } + }; + apply_time_unit(DAY, "d"); + apply_time_unit(HOUR, "h"); + apply_time_unit(MINUTE, "m"); + apply_time_unit(SECOND, "s"); + apply_time_unit(MSECOND, "ms"); + + res +} + +#[derive(Parser)] +struct Args { + #[arg( + long = "blocks-to-keep", + value_name = "NUMBER", + help = "Amount of blocks to keep", + long_help = "Cannot be smaller than 128", + default_value_t = MIN_BLOCKS_TO_KEEP, + )] + blocks_to_keep: u64, + #[arg( + long = "datadir", + value_name = "DATABASE_DIRECTORY", + default_value_t = default_datadir(), + help = "Receives the name of the directory where the Database is located.", + long_help = "If the datadir is the word `memory`, ethrex will use the `InMemory Engine`.", + env = "ETHREX_DATADIR" + )] + pub datadir: String, +} + +#[tokio::main] +pub async fn main() -> eyre::Result<()> { + let args = Args::parse(); + tracing::subscriber::set_global_default(FmtSubscriber::new()) + .expect("setting default subscriber failed"); + if args.blocks_to_keep < MIN_BLOCKS_TO_KEEP { + return Err(eyre::ErrReport::msg( + format!("Must keep at least {MIN_BLOCKS_TO_KEEP} in store"), + )); + } + let data_dir = init_datadir(&args.datadir); + let store = load_store(&data_dir).await; + let latest_number = store.get_latest_block_number().await?; + if latest_number <= args.blocks_to_keep { + return Err(eyre::ErrReport::msg( + format!("Only have {latest_number} blocks in store, cannot prune"), + )); + } + let last_block_to_prune = latest_number - args.blocks_to_keep; + let prune_start = Instant::now(); + let mut last_show_progress = Instant::now(); + const SHOW_PROGRESS_INTERVAL: Duration = Duration::from_secs(5); + for block_number in 0..last_block_to_prune { + if last_show_progress.elapsed() > SHOW_PROGRESS_INTERVAL { + last_show_progress = Instant::now(); + info!("Pruned {block_number} blocks, {}% done", (block_number * 100) / last_block_to_prune) + } + store.purge_block(block_number).await?; + } + info!("Succesfully purged {last_block_to_prune} blocks in {}", mseconds_to_readable(prune_start.elapsed().as_millis())); + Ok(()) +} From 7e9f0944f0748d2d868264e140e0dc52cad44556 Mon Sep 17 00:00:00 2001 From: fmoletta Date: Fri, 22 Aug 2025 16:29:48 -0300 Subject: [PATCH 02/11] Add README.md --- tooling/prune-blocks/src/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tooling/prune-blocks/src/README.md diff --git a/tooling/prune-blocks/src/README.md b/tooling/prune-blocks/src/README.md new file mode 100644 index 0000000000..e7d04f3e59 --- /dev/null +++ b/tooling/prune-blocks/src/README.md @@ -0,0 +1,15 @@ +# Prune Blocks + +This tool can be used to reduce the DB size of the node by removing old blocks and their asociated data. Note that this is counter-spec and will hinder the node's ability to provide data to other nodes. It also does not performe state prunning. + +## Usage + +The tool takes two optional arguments: + *`datadir`: The path to the DB location, will use the default one if not provided + *`blocks_to_keep`: The amount of latest blocks that will be kept in the DB. This value must be al least 128 and lower than the current amount of blocks in the chain. + +And should be ran like this: + +```bash +cargo run --release -- --datadir DATADIR --blocks-to-keep BLOCKS_TO_KEEP +``` From 727786cc90b72c69c2a79d2776cd46c77431ae8f Mon Sep 17 00:00:00 2001 From: fmoletta Date: Fri, 22 Aug 2025 16:35:21 -0300 Subject: [PATCH 03/11] Remove unneded dependencies --- tooling/prune-blocks/Cargo.toml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tooling/prune-blocks/Cargo.toml b/tooling/prune-blocks/Cargo.toml index 2dd082367a..329d7ce4c8 100644 --- a/tooling/prune-blocks/Cargo.toml +++ b/tooling/prune-blocks/Cargo.toml @@ -5,19 +5,10 @@ edition.workspace = true [dependencies] lazy_static.workspace = true -ethrex-common.workspace = true ethrex-storage.workspace = true -ethrex-rlp.workspace = true -ethrex-rpc.workspace = true -keccak-hash.workspace = true tokio.workspace = true tracing.workspace = true tracing-subscriber = { version = "0.3", features = ["fmt"] } clap = { workspace = true, features = ["string"] } -clap_complete.workspace = true eyre.workspace = true -reqwest.workspace = true -serde.workspace = true -serde_json.workspace = true -hex.workspace = true ethrex.workspace = true From 0e1a343208caf33a6a2766661fe09e3a1e53b7c0 Mon Sep 17 00:00:00 2001 From: fmoletta Date: Fri, 22 Aug 2025 16:48:31 -0300 Subject: [PATCH 04/11] fix --- Cargo.lock | 9 ------- crates/storage/store_db/in_memory.rs | 4 ++-- crates/storage/store_db/libmdbx.rs | 35 +++++++++++++++++++--------- tooling/prune-blocks/src/main.rs | 27 ++++++++++++++------- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba012db8af..fbbc4980cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8569,19 +8569,10 @@ name = "prune-blocks" version = "0.1.0" dependencies = [ "clap 4.5.40", - "clap_complete", "ethrex", - "ethrex-common", - "ethrex-rlp", - "ethrex-rpc", "ethrex-storage", "eyre", - "hex", - "keccak-hash", "lazy_static", - "reqwest 0.12.20", - "serde", - "serde_json", "tokio", "tracing", "tracing-subscriber 0.3.19", diff --git a/crates/storage/store_db/in_memory.rs b/crates/storage/store_db/in_memory.rs index 99e82075f9..a4110408ae 100644 --- a/crates/storage/store_db/in_memory.rs +++ b/crates/storage/store_db/in_memory.rs @@ -179,9 +179,9 @@ impl StoreEngine for Store { async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError> { let mut store = self.inner()?; - let Some(block_hash) = store.canonical_hashes.remove(&block_number)else { + let Some(block_hash) = store.canonical_hashes.remove(&block_number) else { // Block must have been already purged - return Ok(()) + return Ok(()); }; // Obtain block hash & block body so we can use it to remove receipts & transactions if let Some(block_body) = store.bodies.remove(&block_hash) { diff --git a/crates/storage/store_db/libmdbx.rs b/crates/storage/store_db/libmdbx.rs index 88dcde741c..57afd7fef1 100644 --- a/crates/storage/store_db/libmdbx.rs +++ b/crates/storage/store_db/libmdbx.rs @@ -324,26 +324,39 @@ impl StoreEngine for Store { async fn purge_block(&self, block_number: BlockNumber) -> Result<(), StoreError> { let txn = self - .db - .begin_readwrite() - .map_err(StoreError::LibmdbxError)?; - let Some(block_hash) = txn.get::(block_number).map_err(StoreError::LibmdbxError)? else { + .db + .begin_readwrite() + .map_err(StoreError::LibmdbxError)?; + let Some(block_hash) = txn + .get::(block_number) + .map_err(StoreError::LibmdbxError)? + else { // Block must have been already purged txn.commit().map_err(StoreError::LibmdbxError)?; - return Ok(()) + return Ok(()); }; let block_hash = block_hash.to()?; // Obtain block hash & block body so we can use it to remove receipts & transactions - if let Some(block_body) = txn.get::(block_hash.into()).map_err(StoreError::LibmdbxError)? { + if let Some(block_body) = txn + .get::(block_hash.into()) + .map_err(StoreError::LibmdbxError)? + { let block_body = block_body.to()?; // Remove transaction location and receipts. Note that if the block was obtained via snap sync these are not guaranteed to exist - for (idx, tx_hash) in block_body.transactions.iter().map(|tx| tx.hash()).enumerate() { - txn.delete::(tx_hash.into(), None).map_err(StoreError::LibmdbxError)?; - txn.delete::((block_hash, idx as u64).into(), None).map_err(StoreError::LibmdbxError)?; + for (idx, tx_hash) in block_body + .transactions + .iter() + .map(|tx| tx.hash()) + .enumerate() + { + txn.delete::(tx_hash.into(), None) + .map_err(StoreError::LibmdbxError)?; + txn.delete::((block_hash, idx as u64).into(), None) + .map_err(StoreError::LibmdbxError)?; } // Remove body txn.delete::(block_hash.into(), None) - .map_err(StoreError::LibmdbxError)?; + .map_err(StoreError::LibmdbxError)?; } // Remove block header, hash & number txn.delete::(block_number, None) @@ -352,7 +365,7 @@ impl StoreEngine for Store { .map_err(StoreError::LibmdbxError)?; txn.delete::(block_hash.into(), None) .map_err(StoreError::LibmdbxError)?; - + txn.commit().map_err(StoreError::LibmdbxError) } diff --git a/tooling/prune-blocks/src/main.rs b/tooling/prune-blocks/src/main.rs index 8f074156d1..97b1be3e0a 100644 --- a/tooling/prune-blocks/src/main.rs +++ b/tooling/prune-blocks/src/main.rs @@ -1,7 +1,10 @@ use std::time::{Duration, Instant}; use clap::Parser; -use ethrex::{initializers::load_store, utils::{default_datadir, init_datadir}}; +use ethrex::{ + initializers::load_store, + utils::{default_datadir, init_datadir}, +}; use tracing::info; use tracing_subscriber::FmtSubscriber; @@ -57,17 +60,17 @@ pub async fn main() -> eyre::Result<()> { tracing::subscriber::set_global_default(FmtSubscriber::new()) .expect("setting default subscriber failed"); if args.blocks_to_keep < MIN_BLOCKS_TO_KEEP { - return Err(eyre::ErrReport::msg( - format!("Must keep at least {MIN_BLOCKS_TO_KEEP} in store"), - )); + return Err(eyre::ErrReport::msg(format!( + "Must keep at least {MIN_BLOCKS_TO_KEEP} in store" + ))); } let data_dir = init_datadir(&args.datadir); let store = load_store(&data_dir).await; let latest_number = store.get_latest_block_number().await?; if latest_number <= args.blocks_to_keep { - return Err(eyre::ErrReport::msg( - format!("Only have {latest_number} blocks in store, cannot prune"), - )); + return Err(eyre::ErrReport::msg(format!( + "Only have {latest_number} blocks in store, cannot prune" + ))); } let last_block_to_prune = latest_number - args.blocks_to_keep; let prune_start = Instant::now(); @@ -76,10 +79,16 @@ pub async fn main() -> eyre::Result<()> { for block_number in 0..last_block_to_prune { if last_show_progress.elapsed() > SHOW_PROGRESS_INTERVAL { last_show_progress = Instant::now(); - info!("Pruned {block_number} blocks, {}% done", (block_number * 100) / last_block_to_prune) + info!( + "Pruned {block_number} blocks, {}% done", + (block_number * 100) / last_block_to_prune + ) } store.purge_block(block_number).await?; } - info!("Succesfully purged {last_block_to_prune} blocks in {}", mseconds_to_readable(prune_start.elapsed().as_millis())); + info!( + "Succesfully purged {last_block_to_prune} blocks in {}", + mseconds_to_readable(prune_start.elapsed().as_millis()) + ); Ok(()) } From 3db9ae668e4901436754d08e250c7ec7becf0b8d Mon Sep 17 00:00:00 2001 From: fmoletta Date: Fri, 22 Aug 2025 17:23:54 -0300 Subject: [PATCH 05/11] Remove unneded dependencies --- Cargo.lock | 1 - tooling/prune-blocks/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbbc4980cd..1c86e106e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8572,7 +8572,6 @@ dependencies = [ "ethrex", "ethrex-storage", "eyre", - "lazy_static", "tokio", "tracing", "tracing-subscriber 0.3.19", diff --git a/tooling/prune-blocks/Cargo.toml b/tooling/prune-blocks/Cargo.toml index 329d7ce4c8..25be056774 100644 --- a/tooling/prune-blocks/Cargo.toml +++ b/tooling/prune-blocks/Cargo.toml @@ -4,7 +4,6 @@ version.workspace = true edition.workspace = true [dependencies] -lazy_static.workspace = true ethrex-storage.workspace = true tokio.workspace = true tracing.workspace = true From 47132d7282ef0cea7bb49f6f9bb0627c3ae8f0c7 Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:09:14 -0300 Subject: [PATCH 06/11] fix info text --- tooling/prune-blocks/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling/prune-blocks/src/main.rs b/tooling/prune-blocks/src/main.rs index 97b1be3e0a..0bb01660da 100644 --- a/tooling/prune-blocks/src/main.rs +++ b/tooling/prune-blocks/src/main.rs @@ -87,7 +87,7 @@ pub async fn main() -> eyre::Result<()> { store.purge_block(block_number).await?; } info!( - "Succesfully purged {last_block_to_prune} blocks in {}", + "Succesfully pruned {last_block_to_prune} blocks in {}", mseconds_to_readable(prune_start.elapsed().as_millis()) ); Ok(()) From 686615cc2b2bf0e75dbfbdb60a040a91c7a0d7cb Mon Sep 17 00:00:00 2001 From: fmoletta Date: Mon, 25 Aug 2025 10:27:32 -0300 Subject: [PATCH 07/11] Skip the genesis block --- tooling/prune-blocks/src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tooling/prune-blocks/src/main.rs b/tooling/prune-blocks/src/main.rs index 0bb01660da..7818d9c602 100644 --- a/tooling/prune-blocks/src/main.rs +++ b/tooling/prune-blocks/src/main.rs @@ -76,7 +76,8 @@ pub async fn main() -> eyre::Result<()> { let prune_start = Instant::now(); let mut last_show_progress = Instant::now(); const SHOW_PROGRESS_INTERVAL: Duration = Duration::from_secs(5); - for block_number in 0..last_block_to_prune { + // Skip the genesis block + for block_number in 1..last_block_to_prune { if last_show_progress.elapsed() > SHOW_PROGRESS_INTERVAL { last_show_progress = Instant::now(); info!( From 82c8e60e2031a6ca2b1f6d452af89abe4e00f345 Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:49:04 -0300 Subject: [PATCH 08/11] fix typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tomás Grüner <47506558+MegaRedHand@users.noreply.github.com> --- tooling/prune-blocks/src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling/prune-blocks/src/README.md b/tooling/prune-blocks/src/README.md index e7d04f3e59..9d2bf03701 100644 --- a/tooling/prune-blocks/src/README.md +++ b/tooling/prune-blocks/src/README.md @@ -1,6 +1,6 @@ # Prune Blocks -This tool can be used to reduce the DB size of the node by removing old blocks and their asociated data. Note that this is counter-spec and will hinder the node's ability to provide data to other nodes. It also does not performe state prunning. +This tool can be used to reduce the DB size of the node by removing old blocks and their associated data. Note that this is counter-spec and will hinder the node's ability to provide data to other nodes. It also does not perform state pruning. ## Usage From 8c040cbc57d5d8368e4b222c432f5ebdcbf33a77 Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:50:21 -0300 Subject: [PATCH 09/11] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tomás Grüner <47506558+MegaRedHand@users.noreply.github.com> --- tooling/prune-blocks/src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling/prune-blocks/src/README.md b/tooling/prune-blocks/src/README.md index 9d2bf03701..1f8b5cd8ca 100644 --- a/tooling/prune-blocks/src/README.md +++ b/tooling/prune-blocks/src/README.md @@ -8,7 +8,7 @@ The tool takes two optional arguments: *`datadir`: The path to the DB location, will use the default one if not provided *`blocks_to_keep`: The amount of latest blocks that will be kept in the DB. This value must be al least 128 and lower than the current amount of blocks in the chain. -And should be ran like this: +And should be run like this: ```bash cargo run --release -- --datadir DATADIR --blocks-to-keep BLOCKS_TO_KEEP From 1c8b9146c9e2c3de270a3bd84f53481e138e83e6 Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:52:22 -0300 Subject: [PATCH 10/11] fmt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tomás Grüner <47506558+MegaRedHand@users.noreply.github.com> --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2ff3613ccb..5b238de089 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,8 @@ members = [ "tooling/load_test", "tooling/loc", "tooling/archive_sync", - "crates/common/config", "tooling/prune-blocks", + "crates/common/config", + "tooling/prune-blocks", ] resolver = "2" From f523421032f5fd113dfeb8bb7dbd4653d0b2e20e Mon Sep 17 00:00:00 2001 From: fmoletta Date: Mon, 25 Aug 2025 16:26:08 -0300 Subject: [PATCH 11/11] fix typo --- tooling/prune-blocks/src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling/prune-blocks/src/README.md b/tooling/prune-blocks/src/README.md index e7d04f3e59..fbe824c0e2 100644 --- a/tooling/prune-blocks/src/README.md +++ b/tooling/prune-blocks/src/README.md @@ -6,7 +6,7 @@ This tool can be used to reduce the DB size of the node by removing old blocks a The tool takes two optional arguments: *`datadir`: The path to the DB location, will use the default one if not provided - *`blocks_to_keep`: The amount of latest blocks that will be kept in the DB. This value must be al least 128 and lower than the current amount of blocks in the chain. + *`blocks_to_keep`: The amount of latest blocks that will be kept in the DB. This value must be at least 128 and lower than the current amount of blocks in the chain. And should be ran like this: