From 3a9b5526b33690ebb53fce0498e4430aa01fc654 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Wed, 24 May 2023 13:46:06 +1000 Subject: [PATCH 1/3] Move BlockHash From impls Move the `From` impls on `BlockHash` to below the `BlockHash` impl block. Code move only, no other changes. --- bitcoin/src/blockdata/block.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index b496787a..1db06b51 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -337,6 +337,22 @@ impl Block { } } +impl From
for BlockHash { + fn from(header: Header) -> BlockHash { header.block_hash() } +} + +impl From<&Header> for BlockHash { + fn from(header: &Header) -> BlockHash { header.block_hash() } +} + +impl From for BlockHash { + fn from(block: Block) -> BlockHash { block.block_hash() } +} + +impl From<&Block> for BlockHash { + fn from(block: &Block) -> BlockHash { block.block_hash() } +} + /// An error when looking up a BIP34 block height. #[derive(Debug, Clone, PartialEq, Eq)] #[non_exhaustive] @@ -375,22 +391,6 @@ impl std::error::Error for Bip34Error { } } -impl From
for BlockHash { - fn from(header: Header) -> BlockHash { header.block_hash() } -} - -impl From<&Header> for BlockHash { - fn from(header: &Header) -> BlockHash { header.block_hash() } -} - -impl From for BlockHash { - fn from(block: Block) -> BlockHash { block.block_hash() } -} - -impl From<&Block> for BlockHash { - fn from(block: &Block) -> BlockHash { block.block_hash() } -} - #[cfg(test)] mod tests { use hashes::hex::FromHex; From 74154c22940754943c9fd659a871a7833cb6fb77 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Wed, 24 May 2023 13:50:53 +1000 Subject: [PATCH 2/3] Add block::ValidationError Add a `ValidationError` to the `block` module and remove the two variants out of `crate::Error`. This error is only used by the `validate_pow` function, a specific error better serves our purposes. --- bitcoin/src/blockdata/block.rs | 42 +++++++++++++++++++++++++++++----- bitcoin/src/error.rs | 7 ------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index 1db06b51..dcacffec 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -16,7 +16,6 @@ use super::Weight; use crate::blockdata::script; use crate::blockdata::transaction::Transaction; use crate::consensus::{encode, Decodable, Encodable}; -use crate::error::Error::{self, BlockBadProofOfWork, BlockBadTarget}; pub use crate::hash_types::BlockHash; use crate::hash_types::{TxMerkleNode, WitnessCommitment, WitnessMerkleNode, Wtxid}; use crate::internal_macros::impl_consensus_encoding; @@ -72,16 +71,16 @@ impl Header { pub fn difficulty_float(&self) -> f64 { self.target().difficulty_float() } /// Checks that the proof-of-work for the block is valid, returning the block hash. - pub fn validate_pow(&self, required_target: Target) -> Result { + pub fn validate_pow(&self, required_target: Target) -> Result { let target = self.target(); if target != required_target { - return Err(BlockBadTarget); + return Err(ValidationError::BadTarget); } let block_hash = self.block_hash(); if target.is_met_by(block_hash) { Ok(block_hash) } else { - Err(BlockBadProofOfWork) + Err(ValidationError::BadProofOfWork) } } @@ -391,6 +390,37 @@ impl std::error::Error for Bip34Error { } } +/// A block validation error. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ValidationError { + /// The header hash is not below the target. + BadProofOfWork, + /// The `target` field of a block header did not match the expected difficulty. + BadTarget, +} + +impl fmt::Display for ValidationError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use ValidationError::*; + + match *self { + BadProofOfWork => f.write_str("block target correct but not attained"), + BadTarget => f.write_str("block target incorrect"), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for ValidationError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + use self::ValidationError::*; + + match *self { + BadProofOfWork | BadTarget => None, + } + } +} + #[cfg(test)] mod tests { use hashes::hex::FromHex; @@ -528,7 +558,7 @@ mod tests { // test with zero target match some_header.validate_pow(Target::ZERO) { - Err(BlockBadTarget) => (), + Err(ValidationError::BadTarget) => (), _ => panic!("unexpected result from validate_pow"), } @@ -536,7 +566,7 @@ mod tests { let mut invalid_header: Header = some_header; invalid_header.version.0 += 1; match invalid_header.validate_pow(invalid_header.target()) { - Err(BlockBadProofOfWork) => (), + Err(ValidationError::BadProofOfWork) => (), _ => panic!("unexpected result from validate_pow"), } } diff --git a/bitcoin/src/error.rs b/bitcoin/src/error.rs index 0dbc6199..08570de5 100644 --- a/bitcoin/src/error.rs +++ b/bitcoin/src/error.rs @@ -16,18 +16,12 @@ pub use crate::parse::ParseIntError; pub enum Error { /// Encoding error Encode(encode::Error), - /// The header hash is not below the target - BlockBadProofOfWork, - /// The `target` field of a block header did not match the expected difficulty - BlockBadTarget, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { Error::Encode(ref e) => write_err!(f, "encoding error"; e), - Error::BlockBadProofOfWork => f.write_str("block target correct but not attained"), - Error::BlockBadTarget => f.write_str("block target incorrect"), } } } @@ -39,7 +33,6 @@ impl std::error::Error for Error { match self { Encode(e) => Some(e), - BlockBadProofOfWork | BlockBadTarget => None, } } } From 0f74eb68762865b7612dfc6656701b753deccf77 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Wed, 24 May 2023 13:54:24 +1000 Subject: [PATCH 3/3] Remove the unused crate::Error The `crate::Error` type is now unused, remove it. --- bitcoin/src/error.rs | 38 -------------------------------------- bitcoin/src/lib.rs | 1 - 2 files changed, 39 deletions(-) diff --git a/bitcoin/src/error.rs b/bitcoin/src/error.rs index 08570de5..0536c72f 100644 --- a/bitcoin/src/error.rs +++ b/bitcoin/src/error.rs @@ -2,46 +2,8 @@ //! Contains error types and other error handling tools. -use core::fmt; - -use internals::write_err; - -use crate::consensus::encode; pub use crate::parse::ParseIntError; -/// A general error code, other errors should implement conversions to/from this -/// if appropriate. -#[derive(Debug)] -#[non_exhaustive] -pub enum Error { - /// Encoding error - Encode(encode::Error), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::Encode(ref e) => write_err!(f, "encoding error"; e), - } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for Error { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - use self::Error::*; - - match self { - Encode(e) => Some(e), - } - } -} - -#[doc(hidden)] -impl From for Error { - fn from(e: encode::Error) -> Error { Error::Encode(e) } -} - /// Impls std::error::Error for the specified type with appropriate attributes, possibly returning /// source. macro_rules! impl_std_error { diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs index c8cec516..b12b11bb 100644 --- a/bitcoin/src/lib.rs +++ b/bitcoin/src/lib.rs @@ -134,7 +134,6 @@ pub use crate::blockdata::{constants, opcodes}; pub use crate::consensus::encode::VarInt; pub use crate::crypto::key::{self, PrivateKey, PublicKey}; pub use crate::crypto::{ecdsa, sighash}; -pub use crate::error::Error; pub use crate::hash_types::{ BlockHash, PubkeyHash, ScriptHash, Txid, WPubkeyHash, WScriptHash, Wtxid, };