mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: add header AT to provider (#13030)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
This commit is contained in:
@ -17,7 +17,7 @@ reth-cli.workspace = true
|
||||
reth-ethereum-cli.workspace = true
|
||||
reth-cli-runner.workspace = true
|
||||
reth-cli-util.workspace = true
|
||||
reth-codecs = { workspace = true, optional = true }
|
||||
reth-codecs.workspace = true
|
||||
reth-config.workspace = true
|
||||
reth-consensus.workspace = true
|
||||
reth-db = { workspace = true, features = ["mdbx"] }
|
||||
@ -110,7 +110,7 @@ arbitrary = [
|
||||
"reth-prune-types/test-utils",
|
||||
"reth-stages-types/test-utils",
|
||||
"reth-trie-common/test-utils",
|
||||
"reth-codecs?/arbitrary",
|
||||
"reth-codecs/arbitrary",
|
||||
"reth-prune-types?/arbitrary",
|
||||
"reth-stages-types?/arbitrary",
|
||||
"reth-trie-common?/arbitrary",
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
use alloy_primitives::{BlockNumber, B256, U256};
|
||||
use alloy_rlp::Decodable;
|
||||
|
||||
use alloy_consensus::Header;
|
||||
use alloy_consensus::{BlockHeader, Header};
|
||||
use reth_codecs::Compact;
|
||||
use reth_node_builder::NodePrimitives;
|
||||
use reth_primitives::{SealedBlock, SealedBlockWithSenders, SealedHeader, StaticFileSegment};
|
||||
use reth_provider::{
|
||||
@ -27,26 +28,26 @@ pub(crate) fn read_header_from_file(path: PathBuf) -> Result<Header, eyre::Error
|
||||
/// first valid block.
|
||||
pub fn setup_without_evm<Provider>(
|
||||
provider_rw: &Provider,
|
||||
header: SealedHeader,
|
||||
header: SealedHeader<<Provider::Primitives as NodePrimitives>::BlockHeader>,
|
||||
total_difficulty: U256,
|
||||
) -> Result<(), eyre::Error>
|
||||
where
|
||||
Provider: StaticFileProviderFactory
|
||||
Provider: StaticFileProviderFactory<Primitives: NodePrimitives<BlockHeader = Header>>
|
||||
+ StageCheckpointWriter
|
||||
+ BlockWriter<Block: reth_node_api::Block<Header = reth_primitives::Header>>,
|
||||
+ BlockWriter<Block = <Provider::Primitives as NodePrimitives>::Block>,
|
||||
{
|
||||
info!(target: "reth::cli", "Setting up dummy EVM chain before importing state.");
|
||||
|
||||
let static_file_provider = provider_rw.static_file_provider();
|
||||
// Write EVM dummy data up to `header - 1` block
|
||||
append_dummy_chain(&static_file_provider, header.number - 1)?;
|
||||
append_dummy_chain(&static_file_provider, header.number() - 1)?;
|
||||
|
||||
info!(target: "reth::cli", "Appending first valid block.");
|
||||
|
||||
append_first_block(provider_rw, &header, total_difficulty)?;
|
||||
|
||||
for stage in StageId::ALL {
|
||||
provider_rw.save_stage_checkpoint(stage, StageCheckpoint::new(header.number))?;
|
||||
provider_rw.save_stage_checkpoint(stage, StageCheckpoint::new(header.number()))?;
|
||||
}
|
||||
|
||||
info!(target: "reth::cli", "Set up finished.");
|
||||
@ -60,12 +61,12 @@ where
|
||||
/// height.
|
||||
fn append_first_block<Provider>(
|
||||
provider_rw: &Provider,
|
||||
header: &SealedHeader,
|
||||
header: &SealedHeader<<Provider::Primitives as NodePrimitives>::BlockHeader>,
|
||||
total_difficulty: U256,
|
||||
) -> Result<(), eyre::Error>
|
||||
where
|
||||
Provider: BlockWriter<Block: reth_node_api::Block<Header = reth_primitives::Header>>
|
||||
+ StaticFileProviderFactory,
|
||||
Provider: BlockWriter<Block = <Provider::Primitives as NodePrimitives>::Block>
|
||||
+ StaticFileProviderFactory<Primitives: NodePrimitives<BlockHeader: Compact>>,
|
||||
{
|
||||
provider_rw.insert_block(
|
||||
SealedBlockWithSenders::new(SealedBlock::new(header.clone(), Default::default()), vec![])
|
||||
@ -81,9 +82,9 @@ where
|
||||
&header.hash(),
|
||||
)?;
|
||||
|
||||
sf_provider.latest_writer(StaticFileSegment::Receipts)?.increment_block(header.number)?;
|
||||
sf_provider.latest_writer(StaticFileSegment::Receipts)?.increment_block(header.number())?;
|
||||
|
||||
sf_provider.latest_writer(StaticFileSegment::Transactions)?.increment_block(header.number)?;
|
||||
sf_provider.latest_writer(StaticFileSegment::Transactions)?.increment_block(header.number())?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@ -93,7 +94,7 @@ where
|
||||
/// * Headers: It will push an empty block.
|
||||
/// * Transactions: It will not push any tx, only increments the end block range.
|
||||
/// * Receipts: It will not push any receipt, only increments the end block range.
|
||||
fn append_dummy_chain<N: NodePrimitives>(
|
||||
fn append_dummy_chain<N: NodePrimitives<BlockHeader = Header>>(
|
||||
sf_provider: &StaticFileProvider<N>,
|
||||
target_height: BlockNumber,
|
||||
) -> Result<(), eyre::Error> {
|
||||
|
||||
@ -31,6 +31,7 @@ where
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
BlockHeader = reth_primitives::Header,
|
||||
>,
|
||||
>,
|
||||
E: BlockExecutorProvider<Primitives = N::Primitives>,
|
||||
@ -143,6 +144,7 @@ fn unwind_and_copy<
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
BlockHeader = reth_primitives::Header,
|
||||
>,
|
||||
>,
|
||||
>(
|
||||
@ -186,6 +188,7 @@ where
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
BlockHeader = reth_primitives::Header,
|
||||
>,
|
||||
>,
|
||||
E: BlockExecutorProvider<Primitives = N::Primitives>,
|
||||
|
||||
@ -25,21 +25,23 @@ use reth_stages::{
|
||||
};
|
||||
use tracing::info;
|
||||
|
||||
pub(crate) async fn dump_merkle_stage<
|
||||
N: ProviderNodeTypes<
|
||||
DB = Arc<DatabaseEnv>,
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
>,
|
||||
>,
|
||||
>(
|
||||
pub(crate) async fn dump_merkle_stage<N>(
|
||||
db_tool: &DbTool<N>,
|
||||
from: BlockNumber,
|
||||
to: BlockNumber,
|
||||
output_datadir: ChainPath<DataDirPath>,
|
||||
should_run: bool,
|
||||
) -> Result<()> {
|
||||
) -> Result<()>
|
||||
where
|
||||
N: ProviderNodeTypes<
|
||||
DB = Arc<DatabaseEnv>,
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
BlockHeader = reth_primitives::Header,
|
||||
>,
|
||||
>,
|
||||
{
|
||||
let (output_db, tip_block_number) = setup(from, to, &output_datadir.db(), db_tool)?;
|
||||
|
||||
output_db.update(|tx| {
|
||||
@ -81,6 +83,7 @@ fn unwind_and_copy<
|
||||
Primitives: NodePrimitives<
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
BlockHeader = reth_primitives::Header,
|
||||
>,
|
||||
>,
|
||||
>(
|
||||
@ -161,11 +164,10 @@ fn unwind_and_copy<
|
||||
}
|
||||
|
||||
/// Try to re-execute the stage straight away
|
||||
fn dry_run<N: ProviderNodeTypes>(
|
||||
output_provider_factory: ProviderFactory<N>,
|
||||
to: u64,
|
||||
from: u64,
|
||||
) -> eyre::Result<()> {
|
||||
fn dry_run<N>(output_provider_factory: ProviderFactory<N>, to: u64, from: u64) -> eyre::Result<()>
|
||||
where
|
||||
N: ProviderNodeTypes<Primitives: NodePrimitives<BlockHeader = reth_primitives::Header>>,
|
||||
{
|
||||
info!(target: "reth::cli", "Executing stage.");
|
||||
let provider = output_provider_factory.database_provider_rw()?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user