reth_optimism_storage/
chain.rs

1use alloc::{vec, vec::Vec};
2use alloy_consensus::Header;
3use alloy_primitives::BlockNumber;
4use core::marker::PhantomData;
5use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks};
6use reth_optimism_forks::OpHardforks;
7use reth_optimism_primitives::OpTransactionSigned;
8use reth_primitives_traits::{Block, FullBlockHeader, SignedTransaction};
9use reth_storage_api::{
10    errors::ProviderResult, BlockBodyReader, BlockBodyWriter, DBProvider, ReadBodyInput,
11    StorageLocation,
12};
13
14/// Optimism storage implementation.
15#[derive(Debug, Clone, Copy)]
16pub struct OptStorage<T = OpTransactionSigned, H = Header>(PhantomData<(T, H)>);
17
18impl<Provider, T, H> BlockBodyWriter<Provider, alloy_consensus::BlockBody<T, H>>
19    for OptStorage<T, H>
20where
21    T: SignedTransaction,
22    H: FullBlockHeader,
23{
24    fn write_block_bodies(
25        &self,
26        _provider: &Provider,
27        _bodies: Vec<(u64, Option<alloy_consensus::BlockBody<T, H>>)>,
28        _write_to: StorageLocation,
29    ) -> ProviderResult<()> {
30        // noop
31        Ok(())
32    }
33
34    fn remove_block_bodies_above(
35        &self,
36        _provider: &Provider,
37        _block: BlockNumber,
38        _remove_from: StorageLocation,
39    ) -> ProviderResult<()> {
40        // noop
41        Ok(())
42    }
43}
44
45impl<Provider, T, H> BlockBodyReader<Provider> for OptStorage<T, H>
46where
47    Provider: ChainSpecProvider<ChainSpec: EthChainSpec + OpHardforks> + DBProvider,
48    T: SignedTransaction,
49    H: FullBlockHeader,
50{
51    type Block = alloy_consensus::Block<T, H>;
52
53    fn read_block_bodies(
54        &self,
55        provider: &Provider,
56        inputs: Vec<ReadBodyInput<'_, Self::Block>>,
57    ) -> ProviderResult<Vec<<Self::Block as Block>::Body>> {
58        let chain_spec = provider.chain_spec();
59
60        let mut bodies = Vec::with_capacity(inputs.len());
61
62        for (header, transactions) in inputs {
63            let mut withdrawals = None;
64            if chain_spec.is_shanghai_active_at_timestamp(header.timestamp()) {
65                // after shanghai the body should have an empty withdrawals list
66                withdrawals.replace(vec![].into());
67            }
68
69            bodies.push(alloy_consensus::BlockBody::<T, H> {
70                transactions,
71                ommers: vec![],
72                withdrawals,
73            });
74        }
75
76        Ok(bodies)
77    }
78}