feat: add header AT to provider (#13030)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
This commit is contained in:
Matthias Seitz
2024-12-02 14:24:48 +01:00
committed by GitHub
parent 519a10ae99
commit 332cce1f9b
71 changed files with 669 additions and 434 deletions

View File

@ -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",

View File

@ -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> {

View File

@ -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>,

View File

@ -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()?;