fix: initialize missing fields (#1448)

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
This commit is contained in:
Matthias Seitz
2023-02-19 00:25:58 +01:00
committed by GitHub
parent 82b993d8ca
commit d7456dfc2f
2 changed files with 38 additions and 26 deletions

View File

@@ -289,16 +289,33 @@ pub struct SealedHeader {
hash: BlockHash,
}
impl SealedHeader {
/// Extract raw header that can be modified.
pub fn unseal(self) -> Header {
self.header
}
/// Return header/block hash.
pub fn hash(&self) -> BlockHash {
self.hash
}
/// Return the number hash tuple.
pub fn num_hash(&self) -> (BlockNumber, BlockHash) {
(self.number, self.hash)
}
}
#[cfg(any(test, feature = "arbitrary"))]
impl proptest::arbitrary::Arbitrary for SealedHeader {
type Parameters = ();
type Strategy = proptest::strategy::BoxedStrategy<SealedHeader>;
fn arbitrary_with(_: Self::Parameters) -> Self::Strategy {
use proptest::prelude::{any, Strategy};
any::<(Header, BlockHash)>().prop_map(move |(header, _)| header.seal_slow()).boxed()
}
type Strategy = proptest::strategy::BoxedStrategy<SealedHeader>;
}
#[cfg(any(test, feature = "arbitrary"))]
@@ -308,21 +325,33 @@ impl<'a> arbitrary::Arbitrary<'a> for SealedHeader {
}
}
impl From<Block<EthersH256>> for SealedHeader {
fn from(block: Block<EthersH256>) -> Self {
let header = Header {
impl From<&Block<EthersH256>> for Header {
fn from(block: &Block<EthersH256>) -> Self {
Header {
parent_hash: block.parent_hash.0.into(),
number: block.number.unwrap().as_u64(),
gas_limit: block.gas_limit.as_u64(),
difficulty: block.difficulty.into(),
nonce: block.nonce.unwrap().to_low_u64_be(),
extra_data: block.extra_data.0.into(),
extra_data: block.extra_data.0.clone().into(),
state_root: block.state_root.0.into(),
transactions_root: block.transactions_root.0.into(),
receipts_root: block.receipts_root.0.into(),
timestamp: block.timestamp.as_u64(),
mix_hash: block.mix_hash.unwrap().0.into(),
beneficiary: block.author.unwrap().0.into(),
base_fee_per_gas: block.base_fee_per_gas.map(|fee| fee.as_u64()),
..Default::default()
};
ommers_hash: block.uncles_hash.0.into(),
gas_used: block.gas_used.as_u64(),
withdrawals_root: None,
logs_bloom: block.logs_bloom.unwrap_or_default().0.into(),
}
}
}
impl From<&Block<EthersH256>> for SealedHeader {
fn from(block: &Block<EthersH256>) -> Self {
let header = Header::from(block);
match block.hash {
Some(hash) => header.seal(hash.0.into()),
None => header.seal_slow(),
@@ -375,23 +404,6 @@ impl Deref for SealedHeader {
}
}
impl SealedHeader {
/// Extract raw header that can be modified.
pub fn unseal(self) -> Header {
self.header
}
/// Return header/block hash.
pub fn hash(&self) -> BlockHash {
self.hash
}
/// Return the number hash tuple.
pub fn num_hash(&self) -> (BlockNumber, BlockHash) {
(self.number, self.hash)
}
}
/// Represents the direction for a headers request depending on the `reverse` field of the request.
/// > The response must contain a number of block headers, of rising number when reverse is 0,
/// > falling when 1

View File

@@ -101,7 +101,7 @@ async fn init_geth() -> (CliqueGethInstance, ChainSpec) {
.clone()
.expect("clique should be configured with a genesis")
.into();
let remote_genesis = SealedHeader::from(clique.provider.remote_genesis_block().await.unwrap());
let remote_genesis = SealedHeader::from(&clique.provider.remote_genesis_block().await.unwrap());
let local_genesis = chainspec.genesis_header().seal(chainspec.genesis_hash());
assert_eq!(local_genesis, remote_genesis, "genesis blocks should match, we computed {local_genesis:#?} but geth computed {remote_genesis:#?}");