From 5039122c356f20d36e3d5979f0da97a2fc40ac75 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Tue, 23 May 2023 16:03:02 -0400 Subject: [PATCH] feat: add sealed_header to HeaderProvider for single headers (#2801) --- crates/consensus/common/src/validation.rs | 4 ++++ crates/storage/provider/src/providers/database.rs | 13 +++++++++++++ crates/storage/provider/src/providers/mod.rs | 4 ++++ crates/storage/provider/src/test_utils/mock.rs | 4 ++++ crates/storage/provider/src/test_utils/noop.rs | 4 ++++ crates/storage/provider/src/traits/header.rs | 3 +++ 6 files changed, 32 insertions(+) diff --git a/crates/consensus/common/src/validation.rs b/crates/consensus/common/src/validation.rs index 172d8965ba..4e6c85c291 100644 --- a/crates/consensus/common/src/validation.rs +++ b/crates/consensus/common/src/validation.rs @@ -474,6 +474,10 @@ mod tests { ) -> Result> { Ok(vec![]) } + + fn sealed_header(&self, _block_number: BlockNumber) -> Result> { + Ok(None) + } } impl WithdrawalsProvider for Provider { diff --git a/crates/storage/provider/src/providers/database.rs b/crates/storage/provider/src/providers/database.rs index 89de00d610..710e815b1e 100644 --- a/crates/storage/provider/src/providers/database.rs +++ b/crates/storage/provider/src/providers/database.rs @@ -146,6 +146,19 @@ impl HeaderProvider for ShareableDatabase { })? .map_err(Into::into) } + + fn sealed_header(&self, number: BlockNumber) -> Result> { + self.db + .view(|tx| -> Result<_> { + if let Some(header) = tx.get::(number)? { + let hash = read_header_hash(tx, number)?; + Ok(Some(header.seal(hash))) + } else { + Ok(None) + } + })? + .map_err(Into::into) + } } impl BlockHashProvider for ShareableDatabase { diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index 30f98894b8..5329898083 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -106,6 +106,10 @@ where ) -> Result> { self.database.sealed_headers_range(range) } + + fn sealed_header(&self, number: BlockNumber) -> Result> { + self.database.sealed_header(number) + } } impl BlockHashProvider for BlockchainProvider diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index 873c102040..0eff583b14 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -151,6 +151,10 @@ impl HeaderProvider for MockEthProvider { ) -> Result> { Ok(self.headers_range(range)?.into_iter().map(|h| h.seal_slow()).collect()) } + + fn sealed_header(&self, number: BlockNumber) -> Result> { + Ok(self.header_by_number(number)?.map(|h| h.seal_slow())) + } } impl TransactionsProvider for MockEthProvider { diff --git a/crates/storage/provider/src/test_utils/noop.rs b/crates/storage/provider/src/test_utils/noop.rs index cd7f5f6f21..4d494ef564 100644 --- a/crates/storage/provider/src/test_utils/noop.rs +++ b/crates/storage/provider/src/test_utils/noop.rs @@ -173,6 +173,10 @@ impl HeaderProvider for NoopProvider { ) -> Result> { Ok(vec![]) } + + fn sealed_header(&self, _number: BlockNumber) -> Result> { + Ok(None) + } } impl AccountProvider for NoopProvider { diff --git a/crates/storage/provider/src/traits/header.rs b/crates/storage/provider/src/traits/header.rs index 06fe5846c3..e3878c7f54 100644 --- a/crates/storage/provider/src/traits/header.rs +++ b/crates/storage/provider/src/traits/header.rs @@ -39,4 +39,7 @@ pub trait HeaderProvider: Send + Sync { &self, range: impl RangeBounds, ) -> Result>; + + /// Get a single sealed header by block number + fn sealed_header(&self, number: BlockNumber) -> Result>; }