mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat(book): [prune] config section (#4328)
This commit is contained in:
@ -3,7 +3,7 @@
|
|||||||
use clap::Args;
|
use clap::Args;
|
||||||
use reth_config::config::PruneConfig;
|
use reth_config::config::PruneConfig;
|
||||||
use reth_primitives::{
|
use reth_primitives::{
|
||||||
ChainSpec, ContractLogsPruneConfig, PruneMode, PruneModes, MINIMUM_PRUNING_DISTANCE,
|
ChainSpec, PruneMode, PruneModes, ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE,
|
||||||
};
|
};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ impl PruningArgs {
|
|||||||
.map(|contract| PruneMode::Before(contract.block)),
|
.map(|contract| PruneMode::Before(contract.block)),
|
||||||
account_history: Some(PruneMode::Distance(MINIMUM_PRUNING_DISTANCE)),
|
account_history: Some(PruneMode::Distance(MINIMUM_PRUNING_DISTANCE)),
|
||||||
storage_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
|
_chain_spec
|
||||||
.deposit_contract
|
.deposit_contract
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
|||||||
@ -27,6 +27,7 @@ The configuration file contains the following sections:
|
|||||||
- [`reputation_weights`](#reputation_weights)
|
- [`reputation_weights`](#reputation_weights)
|
||||||
- [`backoff_durations`](#backoff_durations)
|
- [`backoff_durations`](#backoff_durations)
|
||||||
- [`[sessions]`](#the-sessions-section)
|
- [`[sessions]`](#the-sessions-section)
|
||||||
|
- [`[prune]`](#the-prune-section)
|
||||||
|
|
||||||
## The `[stages]` section
|
## The `[stages]` section
|
||||||
|
|
||||||
@ -330,4 +331,56 @@ secs = 120
|
|||||||
nanos = 0
|
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/
|
[TOML]: https://toml.io/
|
||||||
|
|||||||
@ -81,7 +81,7 @@ pub use net::{
|
|||||||
};
|
};
|
||||||
pub use peer::{PeerId, WithPeerId};
|
pub use peer::{PeerId, WithPeerId};
|
||||||
pub use prune::{
|
pub use prune::{
|
||||||
ContractLogsPruneConfig, PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError,
|
PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError, ReceiptsLogPruneConfig,
|
||||||
MINIMUM_PRUNING_DISTANCE,
|
MINIMUM_PRUNING_DISTANCE,
|
||||||
};
|
};
|
||||||
pub use receipt::{Receipt, ReceiptWithBloom, ReceiptWithBloomRef};
|
pub use receipt::{Receipt, ReceiptWithBloom, ReceiptWithBloomRef};
|
||||||
|
|||||||
@ -13,9 +13,9 @@ pub use target::{PruneModes, MINIMUM_PRUNING_DISTANCE};
|
|||||||
|
|
||||||
/// Configuration for pruning receipts not associated with logs emitted by the specified contracts.
|
/// Configuration for pruning receipts not associated with logs emitted by the specified contracts.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
|
#[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
|
/// Checks if the configuration is empty
|
||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
self.0.is_empty()
|
self.0.is_empty()
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
prune::PrunePartError, serde_helper::deserialize_opt_prune_mode_with_min_blocks, BlockNumber,
|
prune::PrunePartError, serde_helper::deserialize_opt_prune_mode_with_min_blocks, BlockNumber,
|
||||||
ContractLogsPruneConfig, PruneMode, PrunePart,
|
PruneMode, PrunePart, ReceiptsLogPruneConfig,
|
||||||
};
|
};
|
||||||
use paste::paste;
|
use paste::paste;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -23,8 +23,8 @@ pub struct PruneModes {
|
|||||||
/// Transaction Lookup pruning configuration.
|
/// Transaction Lookup pruning configuration.
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub transaction_lookup: Option<PruneMode>,
|
pub transaction_lookup: Option<PruneMode>,
|
||||||
/// Configuration for pruning of receipts. This setting overrides
|
/// Receipts pruning configuration. This setting overrides `receipts_log_filter`
|
||||||
/// `PruneModes::contract_logs_filter` and offers improved performance.
|
/// and offers improved performance.
|
||||||
#[serde(
|
#[serde(
|
||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
deserialize_with = "deserialize_opt_prune_mode_with_min_blocks::<64, _>"
|
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, _>"
|
deserialize_with = "deserialize_opt_prune_mode_with_min_blocks::<64, _>"
|
||||||
)]
|
)]
|
||||||
pub storage_history: Option<PruneMode>,
|
pub storage_history: Option<PruneMode>,
|
||||||
/// Retains only those receipts that contain logs emitted by the specified addresses,
|
/// Receipts pruning configuration by retaining only those receipts that contain logs emitted
|
||||||
/// discarding all others. Note that this setting is overridden by `PruneModes::receipts`.
|
/// 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
|
/// The [`BlockNumber`] represents the starting block from which point onwards the receipts are
|
||||||
/// preserved.
|
/// preserved.
|
||||||
pub contract_logs_filter: ContractLogsPruneConfig,
|
pub receipts_log_filter: ReceiptsLogPruneConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! impl_prune_parts {
|
macro_rules! impl_prune_parts {
|
||||||
@ -90,7 +90,7 @@ macro_rules! impl_prune_parts {
|
|||||||
$(
|
$(
|
||||||
$part: Some(PruneMode::Full),
|
$part: Some(PruneMode::Full),
|
||||||
)+
|
)+
|
||||||
contract_logs_filter: Default::default()
|
receipts_log_filter: Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -103,7 +103,7 @@ impl<DB: Database> Pruner<DB> {
|
|||||||
.record(part_start.elapsed())
|
.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();
|
let part_start = Instant::now();
|
||||||
self.prune_receipts_by_logs(&provider, tip_block_number)?;
|
self.prune_receipts_by_logs(&provider, tip_block_number)?;
|
||||||
self.metrics
|
self.metrics
|
||||||
@ -305,7 +305,7 @@ impl<DB: Database> Pruner<DB> {
|
|||||||
.map(|checkpoint| checkpoint.block_number);
|
.map(|checkpoint| checkpoint.block_number);
|
||||||
|
|
||||||
let address_filter =
|
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
|
// 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
|
// 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`.
|
// one using `get_next_tx_num_range_from_checkpoint`.
|
||||||
let checkpoint_block = self
|
let checkpoint_block = self
|
||||||
.modes
|
.modes
|
||||||
.contract_logs_filter
|
.receipts_log_filter
|
||||||
.lowest_block_with_distance(tip_block_number, pruned)?
|
.lowest_block_with_distance(tip_block_number, pruned)?
|
||||||
.unwrap_or(to_block);
|
.unwrap_or(to_block);
|
||||||
|
|
||||||
|
|||||||
@ -661,7 +661,7 @@ impl PostState {
|
|||||||
|
|
||||||
let contract_log_pruner = self
|
let contract_log_pruner = self
|
||||||
.prune_modes
|
.prune_modes
|
||||||
.contract_logs_filter
|
.receipts_log_filter
|
||||||
.group_by_block(tip, None)
|
.group_by_block(tip, None)
|
||||||
.map_err(|e| Error::Custom(e.to_string()))?;
|
.map_err(|e| Error::Custom(e.to_string()))?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user