Skip to content

Commit c13d120

Browse files
committed
fix: forbid to use pending tag
1 parent f9d8d60 commit c13d120

9 files changed

Lines changed: 139 additions & 38 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cli/commands/src/db/get.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use reth_db::{
1010
use reth_db_api::{
1111
cursor::{DbCursorRO, DbDupCursorRO},
1212
database::Database,
13+
models::CompactU256,
1314
table::{Compress, Decompress, DupSort, Table},
1415
tables,
1516
transaction::DbTx,
@@ -163,7 +164,7 @@ impl Command {
163164
.account_block_changeset(key)?;
164165

165166
println!("{}", serde_json::to_string_pretty(&changesets)?);
166-
return Ok(())
167+
return Ok(());
167168
};
168169

169170
let account = tool
@@ -177,7 +178,7 @@ impl Command {
177178
error!(target: "reth::cli", "No content for the given table key.");
178179
}
179180

180-
return Ok(())
181+
return Ok(());
181182
}
182183

183184
let content = tool.provider_factory.static_file_provider().find_static_file(
@@ -200,10 +201,13 @@ impl Command {
200201
match segment {
201202
StaticFileSegment::Headers => {
202203
let header = HeaderTy::<N>::decompress(content[0].as_slice())?;
203-
let block_hash = BlockHash::decompress(content[1].as_slice())?;
204+
let total_difficulty =
205+
CompactU256::decompress(content[1].as_slice())?;
206+
let block_hash = BlockHash::decompress(content[2].as_slice())?;
204207
println!(
205-
"Header\n{}\n\nBlockHash\n{}",
208+
"Header\n{}\n\nTotalDifficulty\n{}\n\nBlockHash\n{}",
206209
serde_json::to_string_pretty(&header)?,
210+
total_difficulty.0,
207211
serde_json::to_string_pretty(&block_hash)?
208212
);
209213
}

crates/rpc/rpc-convert/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ dyn-clone.workspace = true
3737
# serialization
3838
serde = { workspace = true, features = ["derive"] }
3939

40+
# tracing
41+
tracing.workspace = true
42+
4043
[dev-dependencies]
4144
serde_json.workspace = true
4245

crates/rpc/rpc-convert/src/custom_header.rs

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use alloy_network::primitives::HeaderResponse;
44
use alloy_primitives::{BlockHash, U256};
5+
use tracing::info;
56

67
/// Custom RPC header that extends the standard header with additional fields
78
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
@@ -163,28 +164,6 @@ where
163164
// RpcObject is automatically implemented via blanket impl for types that implement Serialize +
164165
// Deserialize
165166

166-
impl<H> reth_rpc_traits::FromConsensusHeader<H> for CustomRpcHeader<H>
167-
where
168-
H: reth_primitives_traits::BlockHeader + Clone,
169-
{
170-
fn from_consensus_header(
171-
header: reth_primitives_traits::SealedHeader<H>,
172-
block_size: usize,
173-
) -> Self {
174-
let header_hash = header.hash();
175-
let consensus_header = header.into_header();
176-
let milli_timestamp = Some(U256::from(calculate_millisecond_timestamp(&consensus_header)));
177-
178-
Self {
179-
hash: header_hash,
180-
inner: consensus_header,
181-
total_difficulty: None,
182-
size: Some(U256::from(block_size)),
183-
milli_timestamp,
184-
}
185-
}
186-
}
187-
188167
/// Type alias for the standard Ethereum custom header
189168
pub type EthereumCustomHeader = CustomRpcHeader<alloy_consensus::Header>;
190169

@@ -202,6 +181,7 @@ where
202181
block_size: usize,
203182
td: Option<alloy_primitives::U256>,
204183
) -> CustomRpcHeader<H> {
184+
info!("td in CustomHeaderConverter convert_header: {:?}", td);
205185
let header_hash = header.hash();
206186
let consensus_header = header.into_header();
207187
let milli_timestamp = Some(U256::from(calculate_millisecond_timestamp(&consensus_header)));

crates/rpc/rpc-convert/src/transaction.rs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Compatibility functions for rpc `Transaction` type.
22
use crate::{
3-
RpcHeader, RpcReceipt, RpcTransaction, RpcTxReq, RpcTypes, SignableTxRequest, TryIntoTxEnv,
3+
calculate_millisecond_timestamp, RpcHeader, RpcReceipt, RpcTransaction, RpcTxReq, RpcTypes,
4+
SignableTxRequest, TryIntoTxEnv,
45
};
56
use alloy_consensus::{error::ValueError, transaction::Recovered};
67
use alloy_primitives::{Address, U256};
@@ -12,7 +13,7 @@ use reth_primitives_traits::{
1213
BlockTy, HeaderTy, NodePrimitives, SealedBlock, SealedHeader, SealedHeaderFor, TransactionMeta,
1314
TxTy,
1415
};
15-
use reth_rpc_traits::{FromConsensusHeader, FromConsensusTx, TryIntoSimTx, TxInfoMapper};
16+
use reth_rpc_traits::{FromConsensusTx, TryIntoSimTx, TxInfoMapper};
1617
use std::{error::Error, fmt, fmt::Debug, marker::PhantomData};
1718

1819
/// Input for [`RpcConvert::convert_receipts`].
@@ -77,9 +78,37 @@ where
7778
&self,
7879
header: SealedHeader<Consensus>,
7980
block_size: usize,
80-
_td: Option<U256>,
81+
td: Option<U256>,
8182
) -> Rpc {
82-
Rpc::from_consensus_header(header, block_size)
83+
Rpc::from_consensus_header(header, block_size, td)
84+
}
85+
}
86+
87+
/// Conversion trait for obtaining RPC header from a consensus header.
88+
pub trait FromConsensusHeader<T> {
89+
/// Takes a consensus header and converts it into `self`.
90+
fn from_consensus_header(header: SealedHeader<T>, block_size: usize, td: Option<U256>) -> Self;
91+
}
92+
93+
impl FromConsensusHeader<alloy_consensus::Header>
94+
for crate::CustomRpcHeader<alloy_consensus::Header>
95+
{
96+
fn from_consensus_header(
97+
header: SealedHeader<alloy_consensus::Header>,
98+
block_size: usize,
99+
td: Option<U256>,
100+
) -> Self {
101+
let header_hash = header.hash();
102+
let consensus_header = header.into_header();
103+
let milli_timestamp = Some(U256::from(calculate_millisecond_timestamp(&consensus_header)));
104+
105+
Self {
106+
hash: header_hash,
107+
inner: consensus_header,
108+
total_difficulty: td,
109+
size: Some(U256::from(block_size)),
110+
milli_timestamp,
111+
}
83112
}
84113
}
85114

crates/rpc/rpc-eth-api/src/core.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ where
512512
full: bool,
513513
) -> RpcResult<Option<RpcBlock<T::NetworkTypes>>> {
514514
trace!(target: "rpc::eth", ?number, ?full, "Serving eth_getBlockByNumber");
515+
check_pending_tag(&number)?;
515516
Ok(EthBlocks::rpc_block(self, number.into(), full).await?)
516517
}
517518

@@ -527,6 +528,7 @@ where
527528
number: BlockNumberOrTag,
528529
) -> RpcResult<Option<U256>> {
529530
trace!(target: "rpc::eth", ?number, "Serving eth_getBlockTransactionCountByNumber");
531+
check_pending_tag(&number)?;
530532
Ok(EthBlocks::block_transaction_count(self, number.into()).await?.map(U256::from))
531533
}
532534

@@ -547,6 +549,7 @@ where
547549
number: BlockNumberOrTag,
548550
) -> RpcResult<Option<U256>> {
549551
trace!(target: "rpc::eth", ?number, "Serving eth_getUncleCountByBlockNumber");
552+
check_pending_tag(&number)?;
550553

551554
if let Some(block) = self.block_by_number(number, false).await? {
552555
Ok(Some(U256::from(block.uncles.len())))
@@ -581,6 +584,7 @@ where
581584
index: Index,
582585
) -> RpcResult<Option<RpcBlock<T::NetworkTypes>>> {
583586
trace!(target: "rpc::eth", ?number, ?index, "Serving eth_getUncleByBlockNumberAndIndex");
587+
check_pending_tag(&number)?;
584588
Ok(EthBlocks::ommer_by_block_and_index(self, number.into(), index).await?)
585589
}
586590

@@ -640,6 +644,7 @@ where
640644
index: Index,
641645
) -> RpcResult<Option<Bytes>> {
642646
trace!(target: "rpc::eth", ?number, ?index, "Serving eth_getRawTransactionByBlockNumberAndIndex");
647+
check_pending_tag(&number)?;
643648
Ok(EthTransactions::raw_transaction_by_block_and_tx_index(
644649
self,
645650
number.into(),
@@ -655,6 +660,7 @@ where
655660
index: Index,
656661
) -> RpcResult<Option<RpcTransaction<T::NetworkTypes>>> {
657662
trace!(target: "rpc::eth", ?number, ?index, "Serving eth_getTransactionByBlockNumberAndIndex");
663+
check_pending_tag(&number)?;
658664
Ok(EthTransactions::transaction_by_block_and_tx_index(self, number.into(), index.into())
659665
.await?)
660666
}
@@ -674,6 +680,7 @@ where
674680
number: BlockNumberOrTag,
675681
) -> RpcResult<Option<Vec<RpcTransaction<T::NetworkTypes>>>> {
676682
trace!(target: "rpc::eth", ?number, "Serving eth_getTransactionsByBlockNumber");
683+
check_pending_tag(&number)?;
677684
Ok(EthTransactions::transactions_by_block_id(self, number.into()).await?)
678685
}
679686

@@ -759,6 +766,7 @@ where
759766
block_number: BlockNumberOrTag,
760767
) -> RpcResult<Option<RpcHeader<T::NetworkTypes>>> {
761768
trace!(target: "rpc::eth", ?block_number, "Serving eth_getHeaderByNumber");
769+
check_pending_tag(&block_number)?;
762770
Ok(EthBlocks::rpc_block_header(self, block_number.into()).await?)
763771
}
764772

@@ -889,6 +897,7 @@ where
889897
reward_percentiles: Option<Vec<f64>>,
890898
) -> RpcResult<FeeHistory> {
891899
trace!(target: "rpc::eth", ?block_count, ?newest_block, ?reward_percentiles, "Serving eth_feeHistory");
900+
check_pending_tag(&newest_block)?;
892901
Ok(EthFees::fee_history(self, block_count.to(), newest_block, reward_percentiles).await?)
893902
}
894903

@@ -1010,3 +1019,12 @@ where
10101019
Ok(bal.map(|b: BlockAccessList| alloy_rlp::encode(b).into()))
10111020
}
10121021
}
1022+
1023+
/// Helper function to check if `BlockNumberOrTag` is pending and return error if so
1024+
fn check_pending_tag(block_number: &BlockNumberOrTag) -> RpcResult<()> {
1025+
if matches!(block_number, BlockNumberOrTag::Pending) {
1026+
Err(internal_rpc_err("Unsupported pending tag"))
1027+
} else {
1028+
Ok(())
1029+
}
1030+
}

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,11 +626,18 @@ impl<N: ProviderNodeTypes> HeaderProvider for ProviderFactory<N> {
626626
type Header = HeaderTy<N>;
627627

628628
fn header(&self, block_hash: BlockHash) -> ProviderResult<Option<Self::Header>> {
629+
info!("HeaderProvider ProviderFactory header, block_hash: {:?}", block_hash);
629630
self.provider()?.header(block_hash)
630631
}
631632

632633
fn header_by_number(&self, num: BlockNumber) -> ProviderResult<Option<Self::Header>> {
633-
self.caught_up_static_file_provider()?.header_by_number(num)
634+
info!("HeaderProvider ProviderFactory header_by_number, num: {:?}", num);
635+
self.static_file_provider.get_with_static_file_or_database(
636+
StaticFileSegment::Headers,
637+
num,
638+
|static_file| static_file.header_by_number(num),
639+
|| self.provider()?.header_by_number(num),
640+
)
634641
}
635642

636643
fn headers_range(
@@ -644,7 +651,13 @@ impl<N: ProviderNodeTypes> HeaderProvider for ProviderFactory<N> {
644651
&self,
645652
number: BlockNumber,
646653
) -> ProviderResult<Option<SealedHeader<Self::Header>>> {
647-
self.caught_up_static_file_provider()?.sealed_header(number)
654+
info!("ProviderFactory sealed_header, number: {:?}", number);
655+
self.static_file_provider.get_with_static_file_or_database(
656+
StaticFileSegment::Headers,
657+
number,
658+
|static_file| static_file.sealed_header(number),
659+
|| self.provider()?.sealed_header(number),
660+
)
648661
}
649662

650663
fn sealed_headers_range(
@@ -665,7 +678,13 @@ impl<N: ProviderNodeTypes> HeaderProvider for ProviderFactory<N> {
665678

666679
impl<N: ProviderNodeTypes> BlockHashReader for ProviderFactory<N> {
667680
fn block_hash(&self, number: u64) -> ProviderResult<Option<B256>> {
668-
self.caught_up_static_file_provider()?.block_hash(number)
681+
info!("BlockHashReader block_hash, number: {:?}", number);
682+
self.static_file_provider.get_with_static_file_or_database(
683+
StaticFileSegment::Headers,
684+
number,
685+
|static_file| static_file.block_hash(number),
686+
|| self.provider()?.block_hash(number),
687+
)
669688
}
670689

671690
fn canonical_hashes_range(

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ use std::{
8181
path::PathBuf,
8282
sync::Arc,
8383
};
84-
use tracing::{debug, instrument, trace};
84+
use tracing::{debug, info, instrument, trace};
8585

8686
/// Determines the commit order for database operations.
8787
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
@@ -1708,6 +1708,7 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> HeaderProvider for DatabasePro
17081708
type Header = HeaderTy<N>;
17091709

17101710
fn header(&self, block_hash: BlockHash) -> ProviderResult<Option<Self::Header>> {
1711+
info!("HeaderProvider DatabaseProvider header, block_hash: {:?}", block_hash);
17111712
if let Some(num) = self.block_number(block_hash)? {
17121713
Ok(self.header_by_number(num)?)
17131714
} else {
@@ -1716,7 +1717,13 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> HeaderProvider for DatabasePro
17161717
}
17171718

17181719
fn header_by_number(&self, num: BlockNumber) -> ProviderResult<Option<Self::Header>> {
1719-
self.static_file_provider.header_by_number(num)
1720+
info!("HeaderProvider DatabaseProvider header_by_number, num: {:?}", num);
1721+
self.static_file_provider.get_with_static_file_or_database(
1722+
StaticFileSegment::Headers,
1723+
num,
1724+
|static_file| static_file.header_by_number(num),
1725+
|| Ok(self.tx.get::<tables::Headers<Self::Header>>(num)?),
1726+
)
17201727
}
17211728

17221729
fn headers_range(
@@ -1730,7 +1737,22 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> HeaderProvider for DatabasePro
17301737
&self,
17311738
number: BlockNumber,
17321739
) -> ProviderResult<Option<SealedHeader<Self::Header>>> {
1733-
self.static_file_provider.sealed_header(number)
1740+
info!("SealedHeader DatabaseProvider sealed_header, number: {:?}", number);
1741+
self.static_file_provider.get_with_static_file_or_database(
1742+
StaticFileSegment::Headers,
1743+
number,
1744+
|static_file| static_file.sealed_header(number),
1745+
|| {
1746+
if let Some(header) = self.header_by_number(number)? {
1747+
let hash = self
1748+
.block_hash(number)?
1749+
.ok_or_else(|| ProviderError::HeaderNotFound(number.into()))?;
1750+
Ok(Some(SealedHeader::new(header, hash)))
1751+
} else {
1752+
Ok(None)
1753+
}
1754+
},
1755+
)
17341756
}
17351757

17361758
fn sealed_headers_while(

0 commit comments

Comments
 (0)