Compare commits

..

10 Commits

Author SHA1 Message Date
joshieDo
48d404d392 fix: skip MDBX history writes in append_blocks_with_state when RocksDB configured
When edge storage settings configure history to be read from RocksDB,
skip writing history indices to MDBX in append_blocks_with_state.
This matches the existing pattern in update_history_indices.

History data will be populated via healing/stages instead.
2026-01-27 15:01:30 +00:00
joshieDo
098749e63a Revert "fix: use EitherWriter for history index insertion to support RocksDB"
This reverts commit a4ae97f1a6.
2026-01-27 15:00:47 +00:00
joshieDo
a4ae97f1a6 fix: use EitherWriter for history index insertion to support RocksDB
The insert_account_history_index and insert_storage_history_index
functions were always writing to MDBX, but when edge feature is enabled,
the readers look in RocksDB based on storage settings.

This fix:
- Adds append_account_history_index and append_storage_history_index
  methods to EitherWriter that handle the sharding logic
- Updates insert_*_history_index in DatabaseProvider to use EitherWriter
  which correctly routes writes to MDBX or RocksDB based on settings
- Removes the now-unused append_history_index helper function
- Simplifies update_history_indices since EitherWriter handles routing
2026-01-27 14:58:05 +00:00
joshieDo
7c3713645f fix: use cfg for RocksDB iter method which only exists with edge feature 2026-01-27 14:22:26 +00:00
joshieDo
e581192da9 test: fix edge tests by checking storage settings and adding RocksDB tables
- Update init_genesis_history test to check storage settings instead of
  compile-time feature flags to determine where history is stored
- Add .with_default_tables() to RocksDBProvider builder in e2e tests
  to ensure history column families are created when edge feature is enabled
2026-01-27 14:03:58 +00:00
joshieDo
445b1e92c2 fix: ensure edge enables history in rocksdb 2026-01-27 13:30:51 +00:00
Georgios Konstantopoulos
e4e05e9ef9 refactor: align RocksDbArgs defaults with StorageSettings::base() (#21472)
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: yongkangc <chiayongkang@hotmail.com>
2026-01-27 13:13:25 +00:00
joshieDo
c8245594bc fix(db): write genesis history to correct storage backend (#21471)
Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
Co-authored-by: Amp <amp@ampcode.com>
2026-01-27 11:59:06 +00:00
Dan Cline
ed40ce8c4c chore: simplify account_changesets_range (#21457) 2026-01-27 11:44:11 +00:00
YK
1e734936d8 fix(provider): skip storage changeset writes when routed to static files (#21468) 2026-01-27 10:34:44 +00:00
37 changed files with 353 additions and 318 deletions

View File

@@ -44,3 +44,24 @@ jobs:
--exclude 'op-reth' \
--exclude 'reth' \
-E 'binary(e2e_testsuite)'
rocksdb:
name: e2e-rocksdb
runs-on: depot-ubuntu-latest-4
env:
RUST_BACKTRACE: 1
timeout-minutes: 60
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: taiki-e/install-action@nextest
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Run RocksDB e2e tests
run: |
cargo nextest run \
--locked --features "edge" \
-p reth-e2e-test-utils \
-E 'binary(rocksdb)'

View File

@@ -125,7 +125,10 @@ pub async fn setup_engine_with_chain_import(
db.clone(),
chain_spec.clone(),
reth_provider::providers::StaticFileProvider::read_write(static_files_path.clone())?,
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path).build().unwrap(),
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path)
.with_default_tables()
.build()
.unwrap(),
)?;
// Initialize genesis if needed
@@ -328,6 +331,7 @@ mod tests {
reth_provider::providers::StaticFileProvider::read_write(static_files_path.clone())
.unwrap(),
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path.clone())
.with_default_tables()
.build()
.unwrap(),
)
@@ -392,6 +396,7 @@ mod tests {
reth_provider::providers::StaticFileProvider::read_only(static_files_path, false)
.unwrap(),
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path)
.with_default_tables()
.build()
.unwrap(),
)
@@ -490,7 +495,10 @@ mod tests {
db.clone(),
chain_spec.clone(),
reth_provider::providers::StaticFileProvider::read_write(static_files_path).unwrap(),
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path).build().unwrap(),
reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path)
.with_default_tables()
.build()
.unwrap(),
)
.expect("failed to create provider factory");

View File

@@ -10,11 +10,10 @@ use jsonrpsee::core::client::ClientT;
use reth_chainspec::{ChainSpec, ChainSpecBuilder, MAINNET};
use reth_db::tables;
use reth_e2e_test_utils::{transaction::TransactionTestContext, wallet, E2ETestSetupBuilder};
use reth_node_builder::NodeConfig;
use reth_node_core::args::RocksDbArgs;
use reth_node_ethereum::EthereumNode;
use reth_payload_builder::EthPayloadBuilderAttributes;
use reth_provider::RocksDBProviderFactory;
use reth_provider::{RocksDBProviderFactory, StorageSettings};
use std::{sync::Arc, time::Duration};
const ROCKSDB_POLL_TIMEOUT: Duration = Duration::from_secs(60);
@@ -97,16 +96,24 @@ fn test_attributes_generator(timestamp: u64) -> EthPayloadBuilderAttributes {
EthPayloadBuilderAttributes::new(B256::ZERO, attributes)
}
/// Enables `RocksDB` for `TransactionHashNumbers` table.
///
/// Note: Static file changesets are disabled because `persistence_threshold(0)` causes
/// a race where the static file writer expects sequential block numbers but receives
/// them out of order, resulting in `UnexpectedStaticFileBlockNumber` errors.
fn with_rocksdb_enabled<C>(mut config: NodeConfig<C>) -> NodeConfig<C> {
config.rocksdb = RocksDbArgs { tx_hash: true, ..Default::default() };
config.static_files.storage_changesets = false;
config.static_files.account_changesets = false;
config
/// Verifies that `RocksDB` CLI defaults match `StorageSettings::base()`.
#[test]
fn test_rocksdb_defaults_match_storage_settings() {
let args = RocksDbArgs::default();
let settings = StorageSettings::base();
assert_eq!(
args.tx_hash, settings.transaction_hash_numbers_in_rocksdb,
"tx_hash default should match StorageSettings::base()"
);
assert_eq!(
args.storages_history, settings.storages_history_in_rocksdb,
"storages_history default should match StorageSettings::base()"
);
assert_eq!(
args.account_history, settings.account_history_in_rocksdb,
"account_history default should match StorageSettings::base()"
);
}
/// Smoke test: node boots with `RocksDB` routing enabled.
@@ -118,7 +125,6 @@ async fn test_rocksdb_node_startup() -> Result<()> {
let (nodes, _tasks, _wallet) =
E2ETestSetupBuilder::<EthereumNode, _>::new(1, chain_spec, test_attributes_generator)
.with_node_config_modifier(with_rocksdb_enabled)
.build()
.await?;
@@ -146,7 +152,6 @@ async fn test_rocksdb_block_mining() -> Result<()> {
let (mut nodes, _tasks, _wallet) =
E2ETestSetupBuilder::<EthereumNode, _>::new(1, chain_spec, test_attributes_generator)
.with_node_config_modifier(with_rocksdb_enabled)
.build()
.await?;
@@ -203,7 +208,6 @@ async fn test_rocksdb_transaction_queries() -> Result<()> {
chain_spec.clone(),
test_attributes_generator,
)
.with_node_config_modifier(with_rocksdb_enabled)
.with_tree_config_modifier(|config| config.with_persistence_threshold(0))
.build()
.await?;
@@ -270,7 +274,6 @@ async fn test_rocksdb_multi_tx_same_block() -> Result<()> {
chain_spec.clone(),
test_attributes_generator,
)
.with_node_config_modifier(with_rocksdb_enabled)
.with_tree_config_modifier(|config| config.with_persistence_threshold(0))
.build()
.await?;
@@ -338,7 +341,6 @@ async fn test_rocksdb_txs_across_blocks() -> Result<()> {
chain_spec.clone(),
test_attributes_generator,
)
.with_node_config_modifier(with_rocksdb_enabled)
.with_tree_config_modifier(|config| config.with_persistence_threshold(0))
.build()
.await?;
@@ -423,7 +425,6 @@ async fn test_rocksdb_pending_tx_not_in_storage() -> Result<()> {
chain_spec.clone(),
test_attributes_generator,
)
.with_node_config_modifier(with_rocksdb_enabled)
.with_tree_config_modifier(|config| config.with_persistence_threshold(0))
.build()
.await?;

View File

@@ -1,13 +1,27 @@
//! clap [Args](clap::Args) for `RocksDB` table routing configuration
use clap::{ArgAction, Args};
use reth_storage_api::StorageSettings;
/// Default value for `RocksDB` routing flags.
/// Default value for `tx_hash` routing flag.
///
/// When the `edge` feature is enabled, defaults to `true` to enable edge storage features.
/// Otherwise defaults to `false` for legacy behavior.
const fn default_rocksdb_flag() -> bool {
cfg!(feature = "edge")
/// Derived from [`StorageSettings::base()`] to ensure CLI defaults match storage defaults.
const fn default_tx_hash_in_rocksdb() -> bool {
StorageSettings::base().transaction_hash_numbers_in_rocksdb
}
/// Default value for `storages_history` routing flag.
///
/// Derived from [`StorageSettings::base()`] to ensure CLI defaults match storage defaults.
const fn default_storages_history_in_rocksdb() -> bool {
StorageSettings::base().storages_history_in_rocksdb
}
/// Default value for `account_history` routing flag.
///
/// Derived from [`StorageSettings::base()`] to ensure CLI defaults match storage defaults.
const fn default_account_history_in_rocksdb() -> bool {
StorageSettings::base().account_history_in_rocksdb
}
/// Parameters for `RocksDB` table routing configuration.
@@ -28,21 +42,21 @@ pub struct RocksDbArgs {
///
/// This is a genesis-initialization-only flag: changing it after genesis requires a re-sync.
/// Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
#[arg(long = "rocksdb.tx-hash", default_value_t = default_rocksdb_flag(), action = ArgAction::Set)]
#[arg(long = "rocksdb.tx-hash", default_value_t = default_tx_hash_in_rocksdb(), action = ArgAction::Set)]
pub tx_hash: bool,
/// Route storages history tables to `RocksDB` instead of MDBX.
///
/// This is a genesis-initialization-only flag: changing it after genesis requires a re-sync.
/// Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
#[arg(long = "rocksdb.storages-history", default_value_t = default_rocksdb_flag(), action = ArgAction::Set)]
/// Defaults to `false`.
#[arg(long = "rocksdb.storages-history", default_value_t = default_storages_history_in_rocksdb(), action = ArgAction::Set)]
pub storages_history: bool,
/// Route account history tables to `RocksDB` instead of MDBX.
///
/// This is a genesis-initialization-only flag: changing it after genesis requires a re-sync.
/// Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
#[arg(long = "rocksdb.account-history", default_value_t = default_rocksdb_flag(), action = ArgAction::Set)]
/// Defaults to `false`.
#[arg(long = "rocksdb.account-history", default_value_t = default_account_history_in_rocksdb(), action = ArgAction::Set)]
pub account_history: bool,
}
@@ -50,9 +64,9 @@ impl Default for RocksDbArgs {
fn default() -> Self {
Self {
all: false,
tx_hash: default_rocksdb_flag(),
storages_history: default_rocksdb_flag(),
account_history: default_rocksdb_flag(),
tx_hash: default_tx_hash_in_rocksdb(),
storages_history: default_storages_history_in_rocksdb(),
account_history: default_account_history_in_rocksdb(),
}
}
}
@@ -106,7 +120,25 @@ mod tests {
fn test_parse_all_flag() {
let args = CommandParser::<RocksDbArgs>::parse_from(["reth", "--rocksdb.all"]).args;
assert!(args.all);
assert_eq!(args.tx_hash, default_rocksdb_flag());
assert_eq!(args.tx_hash, default_tx_hash_in_rocksdb());
}
#[test]
fn test_defaults_match_storage_settings() {
let args = RocksDbArgs::default();
let settings = StorageSettings::base();
assert_eq!(
args.tx_hash, settings.transaction_hash_numbers_in_rocksdb,
"tx_hash default should match StorageSettings::base()"
);
assert_eq!(
args.storages_history, settings.storages_history_in_rocksdb,
"storages_history default should match StorageSettings::base()"
);
assert_eq!(
args.account_history, settings.account_history_in_rocksdb,
"account_history default should match StorageSettings::base()"
);
}
#[test]

View File

@@ -63,9 +63,9 @@ impl StorageSettings {
transaction_senders_in_static_files: true,
account_changesets_in_static_files: true,
storage_changesets_in_static_files: true,
storages_history_in_rocksdb: false,
storages_history_in_rocksdb: true,
transaction_hash_numbers_in_rocksdb: true,
account_history_in_rocksdb: false,
account_history_in_rocksdb: true,
}
}

View File

@@ -6,7 +6,12 @@ use alloy_primitives::{keccak256, map::HashMap, Address, B256, U256};
use reth_chainspec::EthChainSpec;
use reth_codecs::Compact;
use reth_config::config::EtlConfig;
use reth_db_api::{tables, transaction::DbTxMut, DatabaseError};
use reth_db_api::{
models::{storage_sharded_key::StorageShardedKey, ShardedKey},
tables,
transaction::DbTxMut,
BlockNumberList, DatabaseError,
};
use reth_etl::Collector;
use reth_execution_errors::StateRootError;
use reth_primitives_traits::{
@@ -14,11 +19,11 @@ use reth_primitives_traits::{
};
use reth_provider::{
errors::provider::ProviderResult, providers::StaticFileWriter, BlockHashReader, BlockNumReader,
BundleStateInit, ChainSpecProvider, DBProvider, DatabaseProviderFactory, ExecutionOutcome,
HashingWriter, HeaderProvider, HistoryWriter, MetadataProvider, MetadataWriter,
OriginalValuesKnown, ProviderError, RevertsInit, StageCheckpointReader, StageCheckpointWriter,
StateWriteConfig, StateWriter, StaticFileProviderFactory, StorageSettings,
StorageSettingsCache, TrieWriter,
BundleStateInit, ChainSpecProvider, DBProvider, DatabaseProviderFactory, EitherWriter,
ExecutionOutcome, HashingWriter, HeaderProvider, HistoryWriter, MetadataProvider,
MetadataWriter, NodePrimitivesProvider, OriginalValuesKnown, ProviderError, RevertsInit,
RocksDBProviderFactory, StageCheckpointReader, StageCheckpointWriter, StateWriteConfig,
StateWriter, StaticFileProviderFactory, StorageSettings, StorageSettingsCache, TrieWriter,
};
use reth_stages_types::{StageCheckpoint, StageId};
use reth_static_file_types::StaticFileSegment;
@@ -103,6 +108,9 @@ where
+ TrieWriter
+ MetadataWriter
+ ChainSpecProvider
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider
+ AsRef<PF::ProviderRW>,
PF::ChainSpec: EthChainSpec<Header = <PF::Primitives as NodePrimitives>::BlockHeader>,
{
@@ -138,6 +146,9 @@ where
+ TrieWriter
+ MetadataWriter
+ ChainSpecProvider
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider
+ AsRef<PF::ProviderRW>,
PF::ChainSpec: EthChainSpec<Header = <PF::Primitives as NodePrimitives>::BlockHeader>,
{
@@ -386,37 +397,64 @@ where
}
/// Inserts history indices for genesis accounts and storage.
///
/// Writes to either MDBX or `RocksDB` based on storage settings configuration,
/// using [`EitherWriter`] to abstract over the storage backend.
pub fn insert_genesis_history<'a, 'b, Provider>(
provider: &Provider,
alloc: impl Iterator<Item = (&'a Address, &'b GenesisAccount)> + Clone,
) -> ProviderResult<()>
where
Provider: DBProvider<Tx: DbTxMut> + HistoryWriter + ChainSpecProvider,
Provider: DBProvider<Tx: DbTxMut>
+ HistoryWriter
+ ChainSpecProvider
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider,
{
let genesis_block_number = provider.chain_spec().genesis_header().number();
insert_history(provider, alloc, genesis_block_number)
}
/// Inserts history indices for genesis accounts and storage.
///
/// Writes to either MDBX or `RocksDB` based on storage settings configuration,
/// using [`EitherWriter`] to abstract over the storage backend.
pub fn insert_history<'a, 'b, Provider>(
provider: &Provider,
alloc: impl Iterator<Item = (&'a Address, &'b GenesisAccount)> + Clone,
block: u64,
) -> ProviderResult<()>
where
Provider: DBProvider<Tx: DbTxMut> + HistoryWriter,
Provider: DBProvider<Tx: DbTxMut>
+ HistoryWriter
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider,
{
let account_transitions = alloc.clone().map(|(addr, _)| (*addr, [block]));
provider.insert_account_history_index(account_transitions)?;
provider.with_rocksdb_batch(|batch| {
let mut writer = EitherWriter::new_accounts_history(provider, batch)?;
let list = BlockNumberList::new([block]).expect("single block always fits");
for (addr, _) in alloc.clone() {
writer.upsert_account_history(ShardedKey::last(*addr), &list)?;
}
trace!(target: "reth::cli", "Inserted account history");
Ok(((), writer.into_raw_rocksdb_batch()))
})?;
trace!(target: "reth::cli", "Inserted account history");
let storage_transitions = alloc
.filter_map(|(addr, account)| account.storage.as_ref().map(|storage| (addr, storage)))
.flat_map(|(addr, storage)| storage.keys().map(|key| ((*addr, *key), [block])));
provider.insert_storage_history_index(storage_transitions)?;
trace!(target: "reth::cli", "Inserted storage history");
provider.with_rocksdb_batch(|batch| {
let mut writer = EitherWriter::new_storages_history(provider, batch)?;
let list = BlockNumberList::new([block]).expect("single block always fits");
for (addr, account) in alloc {
if let Some(storage) = &account.storage {
for key in storage.keys() {
writer.upsert_storage_history(StorageShardedKey::last(*addr, *key), &list)?;
}
}
}
trace!(target: "reth::cli", "Inserted storage history");
Ok(((), writer.into_raw_rocksdb_batch()))
})?;
Ok(())
}
@@ -492,6 +530,9 @@ where
+ HashingWriter
+ TrieWriter
+ StateWriter
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider
+ AsRef<Provider>,
{
if etl_config.file_size == 0 {
@@ -628,6 +669,9 @@ where
+ HashingWriter
+ HistoryWriter
+ StateWriter
+ StorageSettingsCache
+ RocksDBProviderFactory
+ NodePrimitivesProvider
+ AsRef<Provider>,
{
let accounts_len = collector.len();
@@ -888,27 +932,59 @@ mod tests {
let factory = create_test_provider_factory_with_chain_spec(chain_spec);
init_genesis(&factory).unwrap();
let provider = factory.provider().unwrap();
let expected_accounts = vec![
(ShardedKey::new(address_with_balance, u64::MAX), IntegerList::new([0]).unwrap()),
(ShardedKey::new(address_with_storage, u64::MAX), IntegerList::new([0]).unwrap()),
];
let expected_storages = vec![(
StorageShardedKey::new(address_with_storage, storage_key, u64::MAX),
IntegerList::new([0]).unwrap(),
)];
let tx = provider.tx_ref();
let collect_from_mdbx = |factory: &ProviderFactory<MockNodeTypesWithDB>| {
let provider = factory.provider().unwrap();
let tx = provider.tx_ref();
(
collect_table_entries::<Arc<DatabaseEnv>, tables::AccountsHistory>(tx).unwrap(),
collect_table_entries::<Arc<DatabaseEnv>, tables::StoragesHistory>(tx).unwrap(),
)
};
assert_eq!(
collect_table_entries::<Arc<DatabaseEnv>, tables::AccountsHistory>(tx)
.expect("failed to collect"),
vec![
(ShardedKey::new(address_with_balance, u64::MAX), IntegerList::new([0]).unwrap()),
(ShardedKey::new(address_with_storage, u64::MAX), IntegerList::new([0]).unwrap())
],
);
#[cfg(feature = "edge")]
{
let settings = factory.cached_storage_settings();
let rocksdb = factory.rocksdb_provider();
assert_eq!(
collect_table_entries::<Arc<DatabaseEnv>, tables::StoragesHistory>(tx)
.expect("failed to collect"),
vec![(
StorageShardedKey::new(address_with_storage, storage_key, u64::MAX),
IntegerList::new([0]).unwrap()
)],
);
let collect_rocksdb = |rocksdb: &reth_provider::providers::RocksDBProvider| {
(
rocksdb
.iter::<tables::AccountsHistory>()
.unwrap()
.collect::<Result<Vec<_>, _>>()
.unwrap(),
rocksdb
.iter::<tables::StoragesHistory>()
.unwrap()
.collect::<Result<Vec<_>, _>>()
.unwrap(),
)
};
let (accounts, storages) = if settings.account_history_in_rocksdb {
collect_rocksdb(&rocksdb)
} else {
collect_from_mdbx(&factory)
};
assert_eq!(accounts, expected_accounts);
assert_eq!(storages, expected_storages);
}
#[cfg(not(feature = "edge"))]
{
let (accounts, storages) = collect_from_mdbx(&factory);
assert_eq!(accounts, expected_accounts);
assert_eq!(storages, expected_storages);
}
}
#[test]

View File

@@ -627,6 +627,7 @@ impl<TX: DbTx + DbTxMut + 'static, N: NodeTypesForProvider> DatabaseProvider<TX,
StateWriteConfig {
write_receipts: !sf_ctx.write_receipts,
write_account_changesets: !sf_ctx.write_account_changesets,
write_storage_changesets: !sf_ctx.write_storage_changesets,
},
)?;
timings.write_state += start.elapsed();
@@ -1358,7 +1359,7 @@ impl<TX: DbTx, N: NodeTypes> StorageChangeSetReader for DatabaseProvider<TX, N>
self.tx
.cursor_dup_read::<tables::StorageChangeSets>()?
.walk_range(storage_range)?
.map(|result| -> ProviderResult<_> { Ok(result?) })
.map(|r| r.map_err(Into::into))
.collect()
}
}
@@ -1391,7 +1392,7 @@ impl<TX: DbTx, N: NodeTypes> StorageChangeSetReader for DatabaseProvider<TX, N>
self.tx
.cursor_dup_read::<tables::StorageChangeSets>()?
.walk_range(BlockNumberAddress::range(range))?
.map(|result| -> ProviderResult<_> { Ok(result?) })
.map(|r| r.map_err(Into::into))
.collect()
}
}
@@ -1448,32 +1449,15 @@ impl<TX: DbTx, N: NodeTypes> ChangeSetReader for DatabaseProvider<TX, N> {
&self,
range: impl core::ops::RangeBounds<BlockNumber>,
) -> ProviderResult<Vec<(BlockNumber, AccountBeforeTx)>> {
let range = to_range(range);
let mut changesets = Vec::new();
if self.cached_storage_settings().account_changesets_in_static_files &&
let Some(highest) = self
.static_file_provider
.get_highest_static_file_block(StaticFileSegment::AccountChangeSets)
{
let static_end = range.end.min(highest + 1);
if range.start < static_end {
for block in range.start..static_end {
let block_changesets = self.account_block_changeset(block)?;
for changeset in block_changesets {
changesets.push((block, changeset));
}
}
}
if self.cached_storage_settings().account_changesets_in_static_files {
self.static_file_provider.account_changesets_range(range)
} else {
// Fetch from database for blocks not in static files
let mut cursor = self.tx.cursor_read::<tables::AccountChangeSets>()?;
for entry in cursor.walk_range(range)? {
let (block_num, account_before) = entry?;
changesets.push((block_num, account_before));
}
self.tx
.cursor_read::<tables::AccountChangeSets>()?
.walk_range(to_range(range))?
.map(|r| r.map_err(Into::into))
.collect()
}
Ok(changesets)
}
fn account_changeset_count(&self) -> ProviderResult<usize> {
@@ -2304,52 +2288,55 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider> StateWriter
config: StateWriteConfig,
) -> ProviderResult<()> {
// Write storage changes
tracing::trace!("Writing storage changes");
let mut storages_cursor = self.tx_ref().cursor_dup_write::<tables::PlainStorageState>()?;
for (block_index, mut storage_changes) in reverts.storage.into_iter().enumerate() {
let block_number = first_block + block_index as BlockNumber;
if config.write_storage_changesets {
tracing::trace!("Writing storage changes");
let mut storages_cursor =
self.tx_ref().cursor_dup_write::<tables::PlainStorageState>()?;
for (block_index, mut storage_changes) in reverts.storage.into_iter().enumerate() {
let block_number = first_block + block_index as BlockNumber;
tracing::trace!(block_number, "Writing block change");
// sort changes by address.
storage_changes.par_sort_unstable_by_key(|a| a.address);
let total_changes =
storage_changes.iter().map(|change| change.storage_revert.len()).sum();
let mut changeset = Vec::with_capacity(total_changes);
for PlainStorageRevert { address, wiped, storage_revert } in storage_changes {
let mut storage = storage_revert
.into_iter()
.map(|(k, v)| (B256::new(k.to_be_bytes()), v))
.collect::<Vec<_>>();
// sort storage slots by key.
storage.par_sort_unstable_by_key(|a| a.0);
tracing::trace!(block_number, "Writing block change");
// sort changes by address.
storage_changes.par_sort_unstable_by_key(|a| a.address);
let total_changes =
storage_changes.iter().map(|change| change.storage_revert.len()).sum();
let mut changeset = Vec::with_capacity(total_changes);
for PlainStorageRevert { address, wiped, storage_revert } in storage_changes {
let mut storage = storage_revert
.into_iter()
.map(|(k, v)| (B256::new(k.to_be_bytes()), v))
.collect::<Vec<_>>();
// sort storage slots by key.
storage.par_sort_unstable_by_key(|a| a.0);
// If we are writing the primary storage wipe transition, the pre-existing plain
// storage state has to be taken from the database and written to storage history.
// See [StorageWipe::Primary] for more details.
//
// TODO(mediocregopher): This could be rewritten in a way which doesn't require
// collecting wiped entries into a Vec like this, see
// `write_storage_trie_changesets`.
let mut wiped_storage = Vec::new();
if wiped {
tracing::trace!(?address, "Wiping storage");
if let Some((_, entry)) = storages_cursor.seek_exact(address)? {
wiped_storage.push((entry.key, entry.value));
while let Some(entry) = storages_cursor.next_dup_val()? {
wiped_storage.push((entry.key, entry.value))
// If we are writing the primary storage wipe transition, the pre-existing plain
// storage state has to be taken from the database and written to storage
// history. See [StorageWipe::Primary] for more details.
//
// TODO(mediocregopher): This could be rewritten in a way which doesn't require
// collecting wiped entries into a Vec like this, see
// `write_storage_trie_changesets`.
let mut wiped_storage = Vec::new();
if wiped {
tracing::trace!(?address, "Wiping storage");
if let Some((_, entry)) = storages_cursor.seek_exact(address)? {
wiped_storage.push((entry.key, entry.value));
while let Some(entry) = storages_cursor.next_dup_val()? {
wiped_storage.push((entry.key, entry.value))
}
}
}
tracing::trace!(?address, ?storage, "Writing storage reverts");
for (key, value) in StorageRevertsIter::new(storage, wiped_storage) {
changeset.push(StorageBeforeTx { address, key, value });
}
}
tracing::trace!(?address, ?storage, "Writing storage reverts");
for (key, value) in StorageRevertsIter::new(storage, wiped_storage) {
changeset.push(StorageBeforeTx { address, key, value });
}
let mut storage_changesets_writer =
EitherWriter::new_storage_changesets(self, block_number)?;
storage_changesets_writer.append_storage_changeset(block_number, changeset)?;
}
let mut storage_changesets_writer =
EitherWriter::new_storage_changesets(self, block_number)?;
storage_changesets_writer.append_storage_changeset(block_number, changeset)?;
}
if !config.write_account_changesets {
@@ -3389,8 +3376,15 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider> BlockWriter
// Use pre-computed transitions for history indices since static file
// writes aren't visible until commit.
self.insert_account_history_index(account_transitions)?;
self.insert_storage_history_index(storage_transitions)?;
// Skip MDBX history index writes when RocksDB is configured for history
// (history will be read from RocksDB via healing/stages instead).
let storage_settings = self.cached_storage_settings();
if !storage_settings.account_history_in_rocksdb {
self.insert_account_history_index(account_transitions)?;
}
if !storage_settings.storages_history_in_rocksdb {
self.insert_storage_history_index(storage_transitions)?;
}
durations_recorder.record_relative(metrics::Action::InsertHistoryIndices);
// Update pipeline progress

View File

@@ -615,13 +615,13 @@ impl<N: NodePrimitives> StaticFileProvider<N> {
let block_number = block.recovered_block().number();
let reverts = block.execution_outcome().state.reverts.to_plain_state_reverts();
for account_block_reverts in reverts.accounts {
let changeset = account_block_reverts
.into_iter()
.map(|(address, info)| AccountBeforeTx { address, info: info.map(Into::into) })
.collect::<Vec<_>>();
w.append_account_changeset(changeset, block_number)?;
}
let changeset: Vec<_> = reverts
.accounts
.into_iter()
.flatten()
.map(|(address, info)| AccountBeforeTx { address, info: info.map(Into::into) })
.collect();
w.append_account_changeset(changeset, block_number)?;
}
Ok(())
}
@@ -636,21 +636,21 @@ impl<N: NodePrimitives> StaticFileProvider<N> {
let block_number = block.recovered_block().number();
let reverts = block.execution_outcome().state.reverts.to_plain_state_reverts();
for storage_block_reverts in reverts.storage {
let changeset = storage_block_reverts
.into_iter()
.flat_map(|revert| {
revert.storage_revert.into_iter().map(move |(key, revert_to_slot)| {
StorageBeforeTx {
address: revert.address,
key: B256::new(key.to_be_bytes()),
value: revert_to_slot.to_previous_value(),
}
})
let changeset: Vec<_> = reverts
.storage
.into_iter()
.flatten()
.flat_map(|revert| {
revert.storage_revert.into_iter().map(move |(key, revert_to_slot)| {
StorageBeforeTx {
address: revert.address,
key: B256::new(key.to_be_bytes()),
value: revert_to_slot.to_previous_value(),
}
})
.collect::<Vec<_>>();
w.append_storage_changeset(changeset, block_number)?;
}
})
.collect();
w.append_storage_changeset(changeset, block_number)?;
}
Ok(())
}

View File

@@ -136,10 +136,16 @@ pub struct StateWriteConfig {
pub write_receipts: bool,
/// Whether to write account changesets.
pub write_account_changesets: bool,
/// Whether to write storage changesets.
pub write_storage_changesets: bool,
}
impl Default for StateWriteConfig {
fn default() -> Self {
Self { write_receipts: true, write_account_changesets: true }
Self {
write_receipts: true,
write_account_changesets: true,
write_storage_changesets: true,
}
}
}

View File

@@ -1,6 +1,6 @@
//! Traits and default implementations related to retrieval of blinded trie nodes.
use alloy_primitives::{map::HashMap, Bytes, B256};
use alloy_primitives::{Bytes, B256};
use reth_execution_errors::SparseTrieError;
use reth_trie_common::{Nibbles, TrieMask};
@@ -35,21 +35,6 @@ pub struct RevealedNode {
pub trait TrieNodeProvider {
/// Retrieve trie node by path.
fn trie_node(&self, path: &Nibbles) -> Result<Option<RevealedNode>, SparseTrieError>;
/// Batch retrieve trie nodes by paths. Default: sequential fallback.
fn trie_nodes_batch(
&self,
paths: &[Nibbles],
) -> Result<HashMap<Nibbles, RevealedNode>, SparseTrieError> {
let mut result = HashMap::default();
result.reserve(paths.len());
for path in paths {
if let Some(node) = self.trie_node(path)? {
result.insert(path.clone(), node);
}
}
Ok(result)
}
}
/// Default trie node provider factory that creates [`DefaultTrieNodeProviderFactory`].

View File

@@ -1,6 +1,6 @@
use super::{Proof, StorageProof};
use crate::{hashed_cursor::HashedCursorFactory, trie_cursor::TrieCursorFactory};
use alloy_primitives::{map::{B256Set, HashMap, HashSet}, B256};
use alloy_primitives::{map::HashSet, B256};
use reth_execution_errors::{SparseTrieError, SparseTrieErrorKind};
use reth_trie_common::{MultiProofTargets, Nibbles};
use reth_trie_sparse::provider::{
@@ -94,48 +94,6 @@ where
);
Ok(node.map(|node| RevealedNode { node, tree_mask, hash_mask }))
}
fn trie_nodes_batch(
&self,
paths: &[Nibbles],
) -> Result<HashMap<Nibbles, RevealedNode>, SparseTrieError> {
if paths.is_empty() {
return Ok(HashMap::default());
}
let start = enabled!(target: "trie::proof::blinded", Level::TRACE).then(Instant::now);
let targets: MultiProofTargets =
paths.iter().map(|p| (pad_path_to_key(p), HashSet::default())).collect();
let mut proof = Proof::new(&self.trie_cursor_factory, &self.hashed_cursor_factory)
.with_branch_node_masks(true)
.multiproof(targets)
.map_err(|error| SparseTrieErrorKind::Other(Box::new(error)))?;
let mut account_subtree = proof.account_subtree.into_inner();
let mut result = HashMap::default();
result.reserve(paths.len());
for path in paths {
if let Some(node) = account_subtree.remove(path) {
let masks = proof.branch_node_masks.remove(path);
let hash_mask = masks.map(|m| m.hash_mask);
let tree_mask = masks.map(|m| m.tree_mask);
result.insert(path.clone(), RevealedNode { node, tree_mask, hash_mask });
}
}
trace!(
target: "trie::proof::blinded",
elapsed = ?start.unwrap().elapsed(),
paths_count = paths.len(),
results_count = result.len(),
"Batch blinded nodes for account trie"
);
Ok(result)
}
}
/// Blinded provider for retrieving storage trie nodes by path.
@@ -190,50 +148,4 @@ where
);
Ok(node.map(|node| RevealedNode { node, tree_mask, hash_mask }))
}
fn trie_nodes_batch(
&self,
paths: &[Nibbles],
) -> Result<HashMap<Nibbles, RevealedNode>, SparseTrieError> {
if paths.is_empty() {
return Ok(HashMap::default());
}
let start = enabled!(target: "trie::proof::blinded", Level::TRACE).then(Instant::now);
let targets: B256Set = paths.iter().map(pad_path_to_key).collect();
let mut proof = StorageProof::new_hashed(
&self.trie_cursor_factory,
&self.hashed_cursor_factory,
self.account,
)
.with_branch_node_masks(true)
.storage_multiproof(targets)
.map_err(|error| SparseTrieErrorKind::Other(Box::new(error)))?;
let mut subtree = proof.subtree.into_inner();
let mut result = HashMap::default();
result.reserve(paths.len());
for path in paths {
if let Some(node) = subtree.remove(path) {
let masks = proof.branch_node_masks.remove(path);
let hash_mask = masks.map(|m| m.hash_mask);
let tree_mask = masks.map(|m| m.tree_mask);
result.insert(path.clone(), RevealedNode { node, tree_mask, hash_mask });
}
}
trace!(
target: "trie::proof::blinded",
account = ?self.account,
elapsed = ?start.unwrap().elapsed(),
paths_count = paths.len(),
results_count = result.len(),
"Batch blinded nodes for storage trie"
);
Ok(result)
}
}

View File

@@ -184,7 +184,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -192,7 +192,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -919,7 +919,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -927,7 +927,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -175,7 +175,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -183,7 +183,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -173,7 +173,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -181,7 +181,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -184,7 +184,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -192,7 +192,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -919,7 +919,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -927,7 +927,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -175,7 +175,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -183,7 +183,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -168,7 +168,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -176,7 +176,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]

View File

@@ -173,7 +173,7 @@ RocksDB:
--rocksdb.storages-history <STORAGES_HISTORY>
Route storages history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]
@@ -181,7 +181,7 @@ RocksDB:
--rocksdb.account-history <ACCOUNT_HISTORY>
Route account history tables to `RocksDB` instead of MDBX.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise.
This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `false`.
[default: false]
[possible values: true, false]