feat(book): [prune] config section (#4328)

This commit is contained in:
Alexey Shekhirin
2023-08-23 16:44:29 +01:00
committed by GitHub
parent 5a7a57d86b
commit 9a97640f19
7 changed files with 69 additions and 16 deletions

View File

@ -3,7 +3,7 @@
use clap::Args;
use reth_config::config::PruneConfig;
use reth_primitives::{
ChainSpec, ContractLogsPruneConfig, PruneMode, PruneModes, MINIMUM_PRUNING_DISTANCE,
ChainSpec, PruneMode, PruneModes, ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE,
};
use std::sync::Arc;
@ -35,7 +35,7 @@ impl PruningArgs {
.map(|contract| PruneMode::Before(contract.block)),
account_history: Some(PruneMode::Distance(MINIMUM_PRUNING_DISTANCE)),
storage_history: Some(PruneMode::Distance(MINIMUM_PRUNING_DISTANCE)),
contract_logs_filter: ContractLogsPruneConfig(
receipts_log_filter: ReceiptsLogPruneConfig(
_chain_spec
.deposit_contract
.as_ref()

View File

@ -27,6 +27,7 @@ The configuration file contains the following sections:
- [`reputation_weights`](#reputation_weights)
- [`backoff_durations`](#backoff_durations)
- [`[sessions]`](#the-sessions-section)
- [`[prune]`](#the-prune-section)
## The `[stages]` section
@ -330,4 +331,56 @@ secs = 120
nanos = 0
```
## The `[prune]` section
The prune section configures the pruning configuration.
You can configure the pruning of different parts of the data independently of others.
For any unspecified parts, the default setting is no pruning.
### Default config
No pruning, run as archive node.
### Example of the custom pruning configuration
This configuration will:
- Run pruning every 5 blocks
- Continuously prune all transaction senders, account history and storage history before the block `head-128`, i.e. keep the data for the last 129 blocks
- Prune all receipts before the block 1920000, i.e. keep receipts from the block 1920000
```toml
[prune]
# Minimum pruning interval measured in blocks
block_interval = 5
[prune.parts]
# Sender Recovery pruning configuration
sender_recovery = { distance = 128 } # Prune all transaction senders before the block `head-128`, i.e. keep transaction senders for the last 129 blocks
# Transaction Lookup pruning configuration
transaction_lookup = "full" # Prune all TxNumber => TxHash mappings
# Receipts pruning configuration. This setting overrides `receipts_log_filter`.
receipts = { before = 1920000 } # Prune all receipts from transactions before the block 1920000, i.e. keep receipts from the block 1920000
# Account History pruning configuration
account_history = { distance = 128 } # Prune all historical account states before the block `head-128`
# Storage History pruning configuration
storage_history = { distance = 128 } # Prune all historical storage states before the block `head-128`
```
We can also prune receipts more granular, using the logs filtering:
```toml
# Receipts pruning configuration by retaining only those receipts that contain logs emitted
# by the specified addresses, discarding all others. This setting is overridden by `receipts`.
[prune.parts.receipts_log_filter]
# Prune all receipts, leaving only those which:
# - Contain logs from address `0x7ea2be2df7ba6e54b1a9c70676f668455e329d29`, starting from the block 17000000
# - Contain logs from address `0xdac17f958d2ee523a2206206994597c13d831ec7` in the last 1001 blocks
"0x7ea2be2df7ba6e54b1a9c70676f668455e329d29" = { before = 17000000 }
"0xdac17f958d2ee523a2206206994597c13d831ec7" = { distance = 1000 }
```
[TOML]: https://toml.io/

View File

@ -81,7 +81,7 @@ pub use net::{
};
pub use peer::{PeerId, WithPeerId};
pub use prune::{
ContractLogsPruneConfig, PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError,
PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError, ReceiptsLogPruneConfig,
MINIMUM_PRUNING_DISTANCE,
};
pub use receipt::{Receipt, ReceiptWithBloom, ReceiptWithBloomRef};

View File

@ -13,9 +13,9 @@ pub use target::{PruneModes, MINIMUM_PRUNING_DISTANCE};
/// Configuration for pruning receipts not associated with logs emitted by the specified contracts.
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct ContractLogsPruneConfig(pub BTreeMap<Address, PruneMode>);
pub struct ReceiptsLogPruneConfig(pub BTreeMap<Address, PruneMode>);
impl ContractLogsPruneConfig {
impl ReceiptsLogPruneConfig {
/// Checks if the configuration is empty
pub fn is_empty(&self) -> bool {
self.0.is_empty()

View File

@ -1,6 +1,6 @@
use crate::{
prune::PrunePartError, serde_helper::deserialize_opt_prune_mode_with_min_blocks, BlockNumber,
ContractLogsPruneConfig, PruneMode, PrunePart,
PruneMode, PrunePart, ReceiptsLogPruneConfig,
};
use paste::paste;
use serde::{Deserialize, Serialize};
@ -23,8 +23,8 @@ pub struct PruneModes {
/// Transaction Lookup pruning configuration.
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_lookup: Option<PruneMode>,
/// Configuration for pruning of receipts. This setting overrides
/// `PruneModes::contract_logs_filter` and offers improved performance.
/// Receipts pruning configuration. This setting overrides `receipts_log_filter`
/// and offers improved performance.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_opt_prune_mode_with_min_blocks::<64, _>"
@ -42,12 +42,12 @@ pub struct PruneModes {
deserialize_with = "deserialize_opt_prune_mode_with_min_blocks::<64, _>"
)]
pub storage_history: Option<PruneMode>,
/// Retains only those receipts that contain logs emitted by the specified addresses,
/// discarding all others. Note that this setting is overridden by `PruneModes::receipts`.
/// Receipts pruning configuration by retaining only those receipts that contain logs emitted
/// by the specified addresses, discarding others. This setting is overridden by `receipts`.
///
/// The [`BlockNumber`] represents the starting block from which point onwards the receipts are
/// preserved.
pub contract_logs_filter: ContractLogsPruneConfig,
pub receipts_log_filter: ReceiptsLogPruneConfig,
}
macro_rules! impl_prune_parts {
@ -90,7 +90,7 @@ macro_rules! impl_prune_parts {
$(
$part: Some(PruneMode::Full),
)+
contract_logs_filter: Default::default()
receipts_log_filter: Default::default()
}
}

View File

@ -103,7 +103,7 @@ impl<DB: Database> Pruner<DB> {
.record(part_start.elapsed())
}
if !self.modes.contract_logs_filter.is_empty() {
if !self.modes.receipts_log_filter.is_empty() {
let part_start = Instant::now();
self.prune_receipts_by_logs(&provider, tip_block_number)?;
self.metrics
@ -305,7 +305,7 @@ impl<DB: Database> Pruner<DB> {
.map(|checkpoint| checkpoint.block_number);
let address_filter =
self.modes.contract_logs_filter.group_by_block(tip_block_number, pruned)?;
self.modes.receipts_log_filter.group_by_block(tip_block_number, pruned)?;
// Splits all transactions in different block ranges. Each block range will have its own
// filter address list and will check it while going through the table
@ -411,7 +411,7 @@ impl<DB: Database> Pruner<DB> {
// one using `get_next_tx_num_range_from_checkpoint`.
let checkpoint_block = self
.modes
.contract_logs_filter
.receipts_log_filter
.lowest_block_with_distance(tip_block_number, pruned)?
.unwrap_or(to_block);

View File

@ -661,7 +661,7 @@ impl PostState {
let contract_log_pruner = self
.prune_modes
.contract_logs_filter
.receipts_log_filter
.group_by_block(tip, None)
.map_err(|e| Error::Custom(e.to_string()))?;