reth_static_file/segments/
receipts.rs

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