reth_static_file/segments/
receipts.rs

1use crate::segments::Segment;
2use alloy_primitives::BlockNumber;
3use reth_codecs::Compact;
4use reth_db_api::{cursor::DbCursorRO, table::Value, tables, transaction::DbTx};
5use reth_primitives_traits::NodePrimitives;
6use reth_provider::{
7    providers::StaticFileWriter, BlockReader, DBProvider, StaticFileProviderFactory,
8};
9use reth_static_file_types::StaticFileSegment;
10use reth_storage_errors::provider::{ProviderError, ProviderResult};
11use std::ops::RangeInclusive;
12
13/// Static File segment responsible for [`StaticFileSegment::Receipts`] part of data.
14#[derive(Debug, Default)]
15pub struct Receipts;
16
17impl<Provider> Segment<Provider> for Receipts
18where
19    Provider: StaticFileProviderFactory<Primitives: NodePrimitives<Receipt: Value + Compact>>
20        + DBProvider
21        + BlockReader,
22{
23    fn segment(&self) -> StaticFileSegment {
24        StaticFileSegment::Receipts
25    }
26
27    fn copy_to_static_files(
28        &self,
29        provider: Provider,
30        block_range: RangeInclusive<BlockNumber>,
31    ) -> ProviderResult<()> {
32        let static_file_provider = provider.static_file_provider();
33        let mut static_file_writer =
34            static_file_provider.get_writer(*block_range.start(), StaticFileSegment::Receipts)?;
35
36        for block in block_range {
37            static_file_writer.increment_block(block)?;
38
39            let block_body_indices = provider
40                .block_body_indices(block)?
41                .ok_or(ProviderError::BlockBodyIndicesNotFound(block))?;
42
43            let mut receipts_cursor = provider
44                .tx_ref()
45                .cursor_read::<tables::Receipts<<Provider::Primitives as NodePrimitives>::Receipt>>(
46                )?;
47            let receipts_walker = receipts_cursor.walk_range(block_body_indices.tx_num_range())?;
48
49            static_file_writer.append_receipts(
50                receipts_walker.map(|result| result.map_err(ProviderError::from)),
51            )?;
52        }
53
54        Ok(())
55    }
56}