abc014a079 Move rustdoc above attribute (Tobin C. Harding)
e9230019eb Implement std::error::Error::source for MerkleBlockError (Tobin C. Harding)
613f1cf2d5 Implement std::error::Error::source for bip152 (Tobin C. Harding)
a37ab82503 Add non_exhaustive to _all_ errors (Tobin C. Harding)

Pull request description:

  Do error cleanups, and add a script to help find missing `non_exhaustive` on error types

  - Patch 1: Audit the codebase and put `non_exhaustive` on all  error types.
  - Patch 2: Implement `std::error::Error::source` for `bip152::Error`
  - Patch 3: Implement `Display` and `std::error::Error::source` for `MerkleBlockError`
  - Patch 4: Move rustdocs to above attributes on one error type
  - ~Patch 5: Add a python script to `contrib` that checks the codebase for missing non exhaustive on the line above the results of regex `pub enum .*Error`~

  I removed the Python script patch, I can't be bothered working on this for now but the clean ups and `non_exhaustive` additions are useful IMO.

  ### labels
  - I added 'API break', I think the `non_exhaustive` addition requires major bump but not sure?
  - release notes mention is just for the `non_exhaustive` patch.

ACKs for top commit:
  Kixunil:
    ACK abc014a079
  apoelstra:
    ACK abc014a079

Tree-SHA512: 16ea15014eae97de7ac9cca1e9b76304aa3702a98cde577c2d71343022f840d3b33a39d2ab6d3fba0f0f1ebaa1631a0595eea1d794ba9727fe6ccfcf08e2feae
This commit is contained in:
Andrew Poelstra 2022-08-15 22:10:51 +00:00
commit 9f37fdd7d8
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
4 changed files with 46 additions and 7 deletions

View File

@ -250,9 +250,9 @@ impl Default for TxIn {
#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
pub struct Sequence(pub u32);
/// An error in creating relative lock-times.
#[derive(Clone, PartialEq, Eq, Debug)]
#[non_exhaustive]
/// An error in creating relative lock-times.
pub enum RelativeLockTimeError {
/// The input was too large
IntegerOverflow(u32)

View File

@ -20,6 +20,7 @@ use crate::{Block, BlockHash, BlockHeader, Transaction};
/// A BIP-152 error
#[derive(Clone, PartialEq, Eq, Debug, Copy, PartialOrd, Ord, Hash)]
#[non_exhaustive]
pub enum Error {
/// An unknown version number was used.
UnknownVersion,
@ -37,7 +38,16 @@ impl fmt::Display for Error {
}
#[cfg(feature = "std")]
impl error::Error for Error {}
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
use self::Error::*;
match *self {
UnknownVersion | InvalidPrefill => None,
}
}
}
/// A [PrefilledTransaction] structure is used in [HeaderAndShortIds] to
/// provide a list of a few transactions explicitly.

View File

@ -62,6 +62,7 @@ const M: u64 = 784931;
/// Errors for blockfilter.
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
/// Missing UTXO, cannot calculate script filter.
UtxoMissing(OutPoint),

View File

@ -40,6 +40,8 @@
//! assert_eq!(1, index[0]);
//! ```
use core::fmt;
use crate::prelude::*;
use crate::io;
@ -53,19 +55,45 @@ use crate::consensus::encode::{self, Decodable, Encodable};
use crate::util::merkleblock::MerkleBlockError::*;
use crate::{Block, BlockHeader};
/// An error when verifying the merkle block
/// An error when verifying the merkle block.
#[derive(Clone, PartialEq, Eq, Debug)]
#[non_exhaustive]
pub enum MerkleBlockError {
/// When header merkle root don't match to the root calculated from the partial merkle tree
/// Merkle root in the header doesn't match to the root calculated from partial merkle tree.
MerkleRootMismatch,
/// When partial merkle tree contains no transactions
/// Partial merkle tree contains no transactions.
NoTransactions,
/// When there are too many transactions
/// There are too many transactions.
TooManyTransactions,
/// General format error
/// General format error.
BadFormat(String),
}
impl fmt::Display for MerkleBlockError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::MerkleBlockError::*;
match *self {
MerkleRootMismatch => write!(f, "merkle header root doesn't match to the root calculated from the partial merkle tree"),
NoTransactions => write!(f, "partial merkle tree contains no transactions"),
TooManyTransactions => write!(f, "too many transactions"),
BadFormat(ref s) => write!(f, "general format error: {}", s),
}
}
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
impl std::error::Error for MerkleBlockError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
use self::MerkleBlockError::*;
match *self {
MerkleRootMismatch | NoTransactions | TooManyTransactions | BadFormat(_) => None,
}
}
}
/// Data structure that represents a partial merkle tree.
///
/// It represents a subset of the txid's of a known block, in a way that