fn validate(self, block_hash: BlockHash) -> BlockSourceResult<Self::T> {
let pow_valid_block_hash = self.header
- .validate_pow(&self.header.target())
- .or_else(|e| Err(BlockSourceError::persistent(e)))?;
+ .validate_pow(self.header.target())
+ .map_err(BlockSourceError::persistent)?;
if pow_valid_block_hash != block_hash {
return Err(BlockSourceError::persistent("invalid block hash"));
};
let pow_valid_block_hash = header
- .validate_pow(&header.target())
- .or_else(|e| Err(BlockSourceError::persistent(e)))?;
+ .validate_pow(header.target())
+ .map_err(BlockSourceError::persistent)?;
if pow_valid_block_hash != block_hash {
return Err(BlockSourceError::persistent("invalid block hash"));
if let Network::Bitcoin = network {
if self.height % 2016 == 0 {
- let previous_work = previous_header.header.work();
- if work > (previous_work << 2) || work < (previous_work >> 2) {
+ let target = self.header.target();
+ let previous_target = previous_header.header.target();
+ let min_target = previous_target.min_difficulty_transition_threshold();
+ let max_target = previous_target.max_difficulty_transition_threshold();
+ if target > max_target || target < min_target {
return Err(BlockSourceError::persistent("invalid difficulty transition"))
}
} else if self.header.bits != previous_header.header.bits {
use crate::*;
use crate::test_utils::Blockchain;
use super::*;
- use bitcoin::util::uint::Uint256;
#[tokio::test]
async fn poll_empty_chain() {
// Invalidate the tip by changing its target.
chain.blocks.last_mut().unwrap().header.bits =
- BlockHeader::compact_target_from_u256(&Uint256::from_be_bytes([0; 32]));
+ bitcoin::Target::from_be_bytes([0x01; 32]).to_compact_lossy();
let poller = ChainPoller::new(&chain, Network::Bitcoin);
match poller.poll_chain_tip(best_known_chain_tip).await {