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