feat: add sealed_header to HeaderProvider for single headers (#2801)

This commit is contained in:
Dan Cline
2023-05-23 16:03:02 -04:00
committed by GitHub
parent c66bde6634
commit 5039122c35
6 changed files with 32 additions and 0 deletions

View File

@ -474,6 +474,10 @@ mod tests {
) -> Result<Vec<SealedHeader>> {
Ok(vec![])
}
fn sealed_header(&self, _block_number: BlockNumber) -> Result<Option<SealedHeader>> {
Ok(None)
}
}
impl WithdrawalsProvider for Provider {

View File

@ -146,6 +146,19 @@ impl<DB: Database> HeaderProvider for ShareableDatabase<DB> {
})?
.map_err(Into::into)
}
fn sealed_header(&self, number: BlockNumber) -> Result<Option<SealedHeader>> {
self.db
.view(|tx| -> Result<_> {
if let Some(header) = tx.get::<tables::Headers>(number)? {
let hash = read_header_hash(tx, number)?;
Ok(Some(header.seal(hash)))
} else {
Ok(None)
}
})?
.map_err(Into::into)
}
}
impl<DB: Database> BlockHashProvider for ShareableDatabase<DB> {

View File

@ -106,6 +106,10 @@ where
) -> Result<Vec<SealedHeader>> {
self.database.sealed_headers_range(range)
}
fn sealed_header(&self, number: BlockNumber) -> Result<Option<SealedHeader>> {
self.database.sealed_header(number)
}
}
impl<DB, Tree> BlockHashProvider for BlockchainProvider<DB, Tree>

View File

@ -151,6 +151,10 @@ impl HeaderProvider for MockEthProvider {
) -> Result<Vec<SealedHeader>> {
Ok(self.headers_range(range)?.into_iter().map(|h| h.seal_slow()).collect())
}
fn sealed_header(&self, number: BlockNumber) -> Result<Option<SealedHeader>> {
Ok(self.header_by_number(number)?.map(|h| h.seal_slow()))
}
}
impl TransactionsProvider for MockEthProvider {

View File

@ -173,6 +173,10 @@ impl HeaderProvider for NoopProvider {
) -> Result<Vec<SealedHeader>> {
Ok(vec![])
}
fn sealed_header(&self, _number: BlockNumber) -> Result<Option<SealedHeader>> {
Ok(None)
}
}
impl AccountProvider for NoopProvider {

View File

@ -39,4 +39,7 @@ pub trait HeaderProvider: Send + Sync {
&self,
range: impl RangeBounds<BlockNumber>,
) -> Result<Vec<SealedHeader>>;
/// Get a single sealed header by block number
fn sealed_header(&self, number: BlockNumber) -> Result<Option<SealedHeader>>;
}