mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
refactor: make sender recovery explicit in provider (#5776)
This commit is contained in:
@ -161,33 +161,35 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
if block.number <= last_finalized_block {
|
||||
// check if block is canonical
|
||||
if self.is_block_hash_canonical(&block.hash)? {
|
||||
return Ok(Some(BlockStatus::Valid))
|
||||
return Ok(Some(BlockStatus::Valid));
|
||||
}
|
||||
|
||||
// check if block is inside database
|
||||
if self.externals.provider_factory.provider()?.block_number(block.hash)?.is_some() {
|
||||
return Ok(Some(BlockStatus::Valid))
|
||||
return Ok(Some(BlockStatus::Valid));
|
||||
}
|
||||
|
||||
return Err(BlockchainTreeError::PendingBlockIsFinalized {
|
||||
last_finalized: last_finalized_block,
|
||||
}
|
||||
.into())
|
||||
.into());
|
||||
}
|
||||
|
||||
// check if block is part of canonical chain
|
||||
if self.is_block_hash_canonical(&block.hash)? {
|
||||
return Ok(Some(BlockStatus::Valid))
|
||||
return Ok(Some(BlockStatus::Valid));
|
||||
}
|
||||
|
||||
// is block inside chain
|
||||
if let Some(status) = self.is_block_inside_chain(&block) {
|
||||
return Ok(Some(status))
|
||||
return Ok(Some(status));
|
||||
}
|
||||
|
||||
// check if block is disconnected
|
||||
if let Some(block) = self.state.buffered_blocks.block(block) {
|
||||
return Ok(Some(BlockStatus::Disconnected { missing_ancestor: block.parent_num_hash() }))
|
||||
return Ok(Some(BlockStatus::Disconnected {
|
||||
missing_ancestor: block.parent_num_hash(),
|
||||
}));
|
||||
}
|
||||
|
||||
Ok(None)
|
||||
@ -278,7 +280,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
|
||||
// get canonical fork.
|
||||
let canonical_fork = self.canonical_fork(chain_id)?;
|
||||
return Some(BundleStateData { state, parent_block_hashed, canonical_fork })
|
||||
return Some(BundleStateData { state, parent_block_hashed, canonical_fork });
|
||||
}
|
||||
|
||||
// check if there is canonical block
|
||||
@ -288,7 +290,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
canonical_fork: ForkBlock { number: canonical_number, hash: block_hash },
|
||||
state: BundleStateWithReceipts::default(),
|
||||
parent_block_hashed: self.canonical_chain().inner().clone(),
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
None
|
||||
@ -311,7 +313,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
// check if block parent can be found in any side chain.
|
||||
if let Some(chain_id) = self.block_indices().get_blocks_chain_id(&parent.hash) {
|
||||
// found parent in side tree, try to insert there
|
||||
return self.try_insert_block_into_side_chain(block, chain_id, block_validation_kind)
|
||||
return self.try_insert_block_into_side_chain(block, chain_id, block_validation_kind);
|
||||
}
|
||||
|
||||
// if not found, check if the parent can be found inside canonical chain.
|
||||
@ -319,7 +321,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
.is_block_hash_canonical(&parent.hash)
|
||||
.map_err(|err| InsertBlockError::new(block.block.clone(), err.into()))?
|
||||
{
|
||||
return self.try_append_canonical_chain(block, block_validation_kind)
|
||||
return self.try_append_canonical_chain(block, block_validation_kind);
|
||||
}
|
||||
|
||||
// this is another check to ensure that if the block points to a canonical block its block
|
||||
@ -335,7 +337,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
block_number: block.number,
|
||||
},
|
||||
block.block,
|
||||
))
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -412,7 +414,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
return Err(InsertBlockError::execution_error(
|
||||
BlockValidationError::BlockPreMerge { hash: block.hash }.into(),
|
||||
block.block,
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
let parent_header = provider
|
||||
@ -575,7 +577,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
} else {
|
||||
// if there is no fork block that point to other chains, break the loop.
|
||||
// it means that this fork joins to canonical block.
|
||||
break
|
||||
break;
|
||||
}
|
||||
}
|
||||
hashes
|
||||
@ -596,9 +598,9 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
// get fork block chain
|
||||
if let Some(fork_chain_id) = self.block_indices().get_blocks_chain_id(&fork.hash) {
|
||||
chain_id = fork_chain_id;
|
||||
continue
|
||||
continue;
|
||||
}
|
||||
break
|
||||
break;
|
||||
}
|
||||
(self.block_indices().canonical_hash(&fork.number) == Some(fork.hash)).then_some(fork)
|
||||
}
|
||||
@ -705,7 +707,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
pub fn buffer_block(&mut self, block: SealedBlockWithSenders) -> Result<(), InsertBlockError> {
|
||||
// validate block consensus rules
|
||||
if let Err(err) = self.validate_block(&block) {
|
||||
return Err(InsertBlockError::consensus_error(err, block.block))
|
||||
return Err(InsertBlockError::consensus_error(err, block.block));
|
||||
}
|
||||
|
||||
self.state.buffered_blocks.insert_block(block);
|
||||
@ -722,17 +724,17 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
?block,
|
||||
"Failed to validate total difficulty for block {}: {e:?}", block.header.hash
|
||||
);
|
||||
return Err(e)
|
||||
return Err(e);
|
||||
}
|
||||
|
||||
if let Err(e) = self.externals.consensus.validate_header(block) {
|
||||
error!(?block, "Failed to validate header {}: {e:?}", block.header.hash);
|
||||
return Err(e)
|
||||
return Err(e);
|
||||
}
|
||||
|
||||
if let Err(e) = self.externals.consensus.validate_block(block) {
|
||||
error!(?block, "Failed to validate block {}: {e:?}", block.header.hash);
|
||||
return Err(e)
|
||||
return Err(e);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@ -753,7 +755,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
Some(BlockStatus::Valid)
|
||||
} else {
|
||||
Some(BlockStatus::Accepted)
|
||||
}
|
||||
};
|
||||
}
|
||||
None
|
||||
}
|
||||
@ -794,7 +796,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
|
||||
// validate block consensus rules
|
||||
if let Err(err) = self.validate_block(&block) {
|
||||
return Err(InsertBlockError::consensus_error(err, block.block))
|
||||
return Err(InsertBlockError::consensus_error(err, block.block));
|
||||
}
|
||||
|
||||
Ok(InsertPayloadOk::Inserted(
|
||||
@ -963,7 +965,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
}
|
||||
|
||||
if header.is_none() && self.is_block_hash_inside_chain(*hash) {
|
||||
return Ok(None)
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
if header.is_none() {
|
||||
@ -1018,9 +1020,9 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
return Err(CanonicalError::from(BlockValidationError::BlockPreMerge {
|
||||
hash: *block_hash,
|
||||
})
|
||||
.into())
|
||||
.into());
|
||||
}
|
||||
return Ok(CanonicalOutcome::AlreadyCanonical { header })
|
||||
return Ok(CanonicalOutcome::AlreadyCanonical { header });
|
||||
}
|
||||
|
||||
let Some(chain_id) = self.block_indices().get_blocks_chain_id(block_hash) else {
|
||||
@ -1028,7 +1030,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
return Err(CanonicalError::from(BlockchainTreeError::BlockHashNotFoundInChain {
|
||||
block_hash: *block_hash,
|
||||
})
|
||||
.into())
|
||||
.into());
|
||||
};
|
||||
let chain = self.state.chains.remove(&chain_id).expect("To be present");
|
||||
|
||||
@ -1190,7 +1192,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
block_number: tip.number,
|
||||
block_hash: tip.hash,
|
||||
},
|
||||
))))
|
||||
))));
|
||||
}
|
||||
|
||||
let (blocks, state) = chain.into_inner();
|
||||
@ -1214,7 +1216,7 @@ impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
pub fn unwind(&mut self, unwind_to: BlockNumber) -> RethResult<()> {
|
||||
// nothing to be done if unwind_to is higher then the tip
|
||||
if self.block_indices().canonical_tip().number <= unwind_to {
|
||||
return Ok(())
|
||||
return Ok(());
|
||||
}
|
||||
// revert `N` blocks from current canonical chain and put them inside BlockchanTree
|
||||
let old_canon_chain = self.revert_canonical_from_database(unwind_to)?;
|
||||
@ -1343,7 +1345,12 @@ mod tests {
|
||||
genesis.header.header.state_root = EMPTY_ROOT_HASH;
|
||||
let provider = factory.provider_rw().unwrap();
|
||||
|
||||
provider.insert_block(genesis, None, None).unwrap();
|
||||
provider
|
||||
.insert_block(
|
||||
genesis.try_seal_with_senders().expect("invalid tx signature in genesis"),
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// insert first 10 blocks
|
||||
for i in 0..10 {
|
||||
@ -1454,8 +1461,9 @@ mod tests {
|
||||
let provider_rw = provider_factory.provider_rw().unwrap();
|
||||
provider_rw
|
||||
.insert_block(
|
||||
SealedBlock::new(chain_spec.sealed_genesis_header(), Default::default()),
|
||||
Some(Vec::new()),
|
||||
SealedBlock::new(chain_spec.sealed_genesis_header(), Default::default())
|
||||
.try_seal_with_senders()
|
||||
.unwrap(),
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
Reference in New Issue
Block a user