Skip to content

Commit f527b5a

Browse files
authored
feat: get BlockMeta table values from static file or database (#13844)
1 parent f28c71c commit f527b5a

File tree

5 files changed

+70
-30
lines changed

5 files changed

+70
-30
lines changed

crates/storage/provider/src/providers/database/chain.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ where
2323
T: FullSignedTx,
2424
N: FullNodePrimitives<
2525
Block = reth_primitives::Block<T>,
26+
BlockHeader = alloy_consensus::Header,
2627
BlockBody = reth_primitives::BlockBody<T>,
2728
SignedTx = T,
2829
>,

crates/storage/provider/src/providers/database/mod.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,14 +562,29 @@ impl<N: ProviderNodeTypes> BlockBodyIndicesProvider for ProviderFactory<N> {
562562
&self,
563563
number: BlockNumber,
564564
) -> ProviderResult<Option<StoredBlockBodyIndices>> {
565-
self.provider()?.block_body_indices(number)
565+
self.static_file_provider.get_with_static_file_or_database(
566+
StaticFileSegment::BlockMeta,
567+
number,
568+
|static_file| static_file.block_body_indices(number),
569+
|| self.provider()?.block_body_indices(number),
570+
)
566571
}
567572

568573
fn block_body_indices_range(
569574
&self,
570575
range: RangeInclusive<BlockNumber>,
571576
) -> ProviderResult<Vec<StoredBlockBodyIndices>> {
572-
self.provider()?.block_body_indices_range(range)
577+
self.static_file_provider.get_range_with_static_file_or_database(
578+
StaticFileSegment::BlockMeta,
579+
*range.start()..*range.end() + 1,
580+
|static_file, range, _| {
581+
static_file.block_body_indices_range(range.start..=range.end.saturating_sub(1))
582+
},
583+
|range, _| {
584+
self.provider()?.block_body_indices_range(range.start..=range.end.saturating_sub(1))
585+
},
586+
|_| true,
587+
)
573588
}
574589
}
575590

crates/storage/provider/src/providers/database/provider.rs

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,14 +1574,21 @@ impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> Withdrawals
15741574
) -> ProviderResult<Option<Withdrawals>> {
15751575
if self.chain_spec.is_shanghai_active_at_timestamp(timestamp) {
15761576
if let Some(number) = self.convert_hash_or_number(id)? {
1577-
// If we are past shanghai, then all blocks should have a withdrawal list, even if
1578-
// empty
1579-
let withdrawals = self
1580-
.tx
1581-
.get::<tables::BlockWithdrawals>(number)
1582-
.map(|w| w.map(|w| w.withdrawals))?
1583-
.unwrap_or_default();
1584-
return Ok(Some(withdrawals))
1577+
return self.static_file_provider.get_with_static_file_or_database(
1578+
StaticFileSegment::BlockMeta,
1579+
number,
1580+
|static_file| static_file.withdrawals_by_block(number.into(), timestamp),
1581+
|| {
1582+
// If we are past shanghai, then all blocks should have a withdrawal list,
1583+
// even if empty
1584+
let withdrawals = self
1585+
.tx
1586+
.get::<tables::BlockWithdrawals>(number)
1587+
.map(|w| w.map(|w| w.withdrawals))?
1588+
.unwrap_or_default();
1589+
Ok(Some(withdrawals))
1590+
},
1591+
)
15851592
}
15861593
}
15871594
Ok(None)
@@ -1601,9 +1608,12 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> OmmersProvider for DatabasePro
16011608
return Ok(Some(Vec::new()))
16021609
}
16031610

1604-
let ommers =
1605-
self.tx.get::<tables::BlockOmmers<Self::Header>>(number)?.map(|o| o.ommers);
1606-
return Ok(ommers)
1611+
return self.static_file_provider.get_with_static_file_or_database(
1612+
StaticFileSegment::BlockMeta,
1613+
number,
1614+
|static_file| static_file.ommers(id),
1615+
|| Ok(self.tx.get::<tables::BlockOmmers<Self::Header>>(number)?.map(|o| o.ommers)),
1616+
)
16071617
}
16081618

16091619
Ok(None)
@@ -1614,19 +1624,27 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> BlockBodyIndicesProvider
16141624
for DatabaseProvider<TX, N>
16151625
{
16161626
fn block_body_indices(&self, num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
1617-
Ok(self.tx.get::<tables::BlockBodyIndices>(num)?)
1627+
self.static_file_provider.get_with_static_file_or_database(
1628+
StaticFileSegment::BlockMeta,
1629+
num,
1630+
|static_file| static_file.block_body_indices(num),
1631+
|| Ok(self.tx.get::<tables::BlockBodyIndices>(num)?),
1632+
)
16181633
}
16191634

16201635
fn block_body_indices_range(
16211636
&self,
16221637
range: RangeInclusive<BlockNumber>,
16231638
) -> ProviderResult<Vec<StoredBlockBodyIndices>> {
1624-
Ok(self
1625-
.tx_ref()
1626-
.cursor_read::<tables::BlockBodyIndices>()?
1627-
.walk_range(range)?
1628-
.map(|r| r.map(|(_, b)| b))
1629-
.collect::<Result<_, _>>()?)
1639+
self.static_file_provider.get_range_with_static_file_or_database(
1640+
StaticFileSegment::BlockMeta,
1641+
*range.start()..*range.end() + 1,
1642+
|static_file, range, _| {
1643+
static_file.block_body_indices_range(range.start..=range.end.saturating_sub(1))
1644+
},
1645+
|range, _| self.cursor_read_collect::<tables::BlockBodyIndices>(range),
1646+
|_| true,
1647+
)
16301648
}
16311649
}
16321650

crates/storage/provider/src/providers/static_file/manager.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use reth_chainspec::{ChainInfo, ChainSpecProvider};
1717
use reth_db::{
1818
lockfile::StorageLock,
1919
static_file::{
20-
iter_static_files, BlockHashMask, HeaderMask, HeaderWithHashMask, ReceiptMask,
21-
StaticFileCursor, TDWithHashMask, TransactionMask,
20+
iter_static_files, BlockHashMask, BodyIndicesMask, HeaderMask, HeaderWithHashMask,
21+
ReceiptMask, StaticFileCursor, TDWithHashMask, TransactionMask,
2222
},
2323
table::{Decompress, Value},
2424
tables,
@@ -1027,7 +1027,7 @@ impl<N: NodePrimitives> StaticFileProvider<N> {
10271027
"Could not find block or tx number on a range request"
10281028
);
10291029

1030-
let err = if segment.is_headers() {
1030+
let err = if segment.is_block_based() {
10311031
ProviderError::MissingStaticFileBlock(segment, number)
10321032
} else {
10331033
ProviderError::MissingStaticFileTx(segment, number)
@@ -1732,10 +1732,14 @@ impl<N: NodePrimitives> BlockBodyIndicesProvider for StaticFileProvider<N> {
17321732

17331733
fn block_body_indices_range(
17341734
&self,
1735-
_range: RangeInclusive<BlockNumber>,
1735+
range: RangeInclusive<BlockNumber>,
17361736
) -> ProviderResult<Vec<StoredBlockBodyIndices>> {
1737-
// Required data not present in static_files
1738-
Err(ProviderError::UnsupportedProvider)
1737+
self.fetch_range_with_predicate(
1738+
StaticFileSegment::BlockMeta,
1739+
*range.start()..*range.end() + 1,
1740+
|cursor, number| cursor.get_one::<BodyIndicesMask>(number.into()),
1741+
|_| true,
1742+
)
17391743
}
17401744
}
17411745

crates/storage/storage-api/src/chain.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::{DBProvider, StorageLocation};
1+
use crate::{DBProvider, OmmersProvider, StorageLocation};
2+
use alloy_consensus::Header;
23
use alloy_primitives::BlockNumber;
34
use reth_chainspec::{ChainSpecProvider, EthereumHardforks};
45
use reth_db::{
@@ -138,7 +139,9 @@ where
138139

139140
impl<Provider, T> BlockBodyReader<Provider> for EthStorage<T>
140141
where
141-
Provider: DBProvider + ChainSpecProvider<ChainSpec: EthereumHardforks>,
142+
Provider: DBProvider
143+
+ ChainSpecProvider<ChainSpec: EthereumHardforks>
144+
+ OmmersProvider<Header = Header>,
142145
T: SignedTransaction,
143146
{
144147
type Block = reth_primitives::Block<T>;
@@ -151,7 +154,6 @@ where
151154
// TODO: Ideally storage should hold its own copy of chain spec
152155
let chain_spec = provider.chain_spec();
153156

154-
let mut ommers_cursor = provider.tx_ref().cursor_read::<tables::BlockOmmers>()?;
155157
let mut withdrawals_cursor = provider.tx_ref().cursor_read::<tables::BlockWithdrawals>()?;
156158

157159
let mut bodies = Vec::with_capacity(inputs.len());
@@ -171,7 +173,7 @@ where
171173
let ommers = if chain_spec.final_paris_total_difficulty(header.number).is_some() {
172174
Vec::new()
173175
} else {
174-
ommers_cursor.seek_exact(header.number)?.map(|(_, o)| o.ommers).unwrap_or_default()
176+
provider.ommers(header.number.into())?.unwrap_or_default()
175177
};
176178

177179
bodies.push(reth_primitives::BlockBody { transactions, ommers, withdrawals });

0 commit comments

Comments
 (0)