Merge rust-bitcoin/rust-bitcoin#1651: Get rid of BadFormat error
6fb2d12373
Get rid of BadFormat error (hashmap) Pull request description: add additional variants instead. as discussed in https://github.com/rust-bitcoin/rust-bitcoin/pull/1365 ACKs for top commit: Kixunil: ACK6fb2d12373
apoelstra: ACK6fb2d12373
Tree-SHA512: 2cf9146670c372a3a482448f84a30943cd2ff2fa4e724075d67a52dba5ac0ad38f99ca2af3dd3494e13584653f2b23e913e6421328d40be52e868a107fffe03b
This commit is contained in:
commit
182fa9bd76
|
@ -280,11 +280,11 @@ impl PartialMerkleTree {
|
||||||
}
|
}
|
||||||
// there can never be more hashes provided than one for every txid
|
// there can never be more hashes provided than one for every txid
|
||||||
if self.hashes.len() as u32 > self.num_transactions {
|
if self.hashes.len() as u32 > self.num_transactions {
|
||||||
return Err(BadFormat("Proof contains more hashes than transactions".to_owned()));
|
return Err(TooManyHashes);
|
||||||
};
|
};
|
||||||
// there must be at least one bit per node in the partial tree, and at least one node per hash
|
// there must be at least one bit per node in the partial tree, and at least one node per hash
|
||||||
if self.bits.len() < self.hashes.len() {
|
if self.bits.len() < self.hashes.len() {
|
||||||
return Err(BadFormat("Proof contains less bits than hashes".to_owned()));
|
return Err(NotEnoughBits);
|
||||||
};
|
};
|
||||||
// calculate height of tree
|
// calculate height of tree
|
||||||
let mut height = 0;
|
let mut height = 0;
|
||||||
|
@ -299,11 +299,11 @@ impl PartialMerkleTree {
|
||||||
// Verify that all bits were consumed (except for the padding caused by
|
// Verify that all bits were consumed (except for the padding caused by
|
||||||
// serializing it as a byte sequence)
|
// serializing it as a byte sequence)
|
||||||
if (bits_used + 7) / 8 != (self.bits.len() as u32 + 7) / 8 {
|
if (bits_used + 7) / 8 != (self.bits.len() as u32 + 7) / 8 {
|
||||||
return Err(BadFormat("Not all bit were consumed".to_owned()));
|
return Err(NotAllBitsConsumed);
|
||||||
}
|
}
|
||||||
// Verify that all hashes were consumed
|
// Verify that all hashes were consumed
|
||||||
if hash_used != self.hashes.len() as u32 {
|
if hash_used != self.hashes.len() as u32 {
|
||||||
return Err(BadFormat("Not all hashes were consumed".to_owned()));
|
return Err(NotAllHashesConsumed);
|
||||||
}
|
}
|
||||||
Ok(TxMerkleNode::from_inner(hash_merkle_root.into_inner()))
|
Ok(TxMerkleNode::from_inner(hash_merkle_root.into_inner()))
|
||||||
}
|
}
|
||||||
|
@ -371,14 +371,14 @@ impl PartialMerkleTree {
|
||||||
indexes: &mut Vec<u32>,
|
indexes: &mut Vec<u32>,
|
||||||
) -> Result<TxMerkleNode, MerkleBlockError> {
|
) -> Result<TxMerkleNode, MerkleBlockError> {
|
||||||
if *bits_used as usize >= self.bits.len() {
|
if *bits_used as usize >= self.bits.len() {
|
||||||
return Err(BadFormat("Overflowed the bits array".to_owned()));
|
return Err(BitsArrayOverflow);
|
||||||
}
|
}
|
||||||
let parent_of_match = self.bits[*bits_used as usize];
|
let parent_of_match = self.bits[*bits_used as usize];
|
||||||
*bits_used += 1;
|
*bits_used += 1;
|
||||||
if height == 0 || !parent_of_match {
|
if height == 0 || !parent_of_match {
|
||||||
// If at height 0, or nothing interesting below, use stored hash and do not descend
|
// If at height 0, or nothing interesting below, use stored hash and do not descend
|
||||||
if *hash_used as usize >= self.hashes.len() {
|
if *hash_used as usize >= self.hashes.len() {
|
||||||
return Err(BadFormat("Overflowed the hash array".to_owned()));
|
return Err(HashesArrayOverflow);
|
||||||
}
|
}
|
||||||
let hash = self.hashes[*hash_used as usize];
|
let hash = self.hashes[*hash_used as usize];
|
||||||
*hash_used += 1;
|
*hash_used += 1;
|
||||||
|
@ -411,7 +411,7 @@ impl PartialMerkleTree {
|
||||||
if right == left {
|
if right == left {
|
||||||
// The left and right branches should never be identical, as the transaction
|
// The left and right branches should never be identical, as the transaction
|
||||||
// hashes covered by them must each be unique.
|
// hashes covered by them must each be unique.
|
||||||
return Err(BadFormat("Found identical transaction hashes".to_owned()));
|
return Err(IdenticalHashesFound);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
right = left;
|
right = left;
|
||||||
|
@ -466,8 +466,21 @@ pub enum MerkleBlockError {
|
||||||
NoTransactions,
|
NoTransactions,
|
||||||
/// There are too many transactions.
|
/// There are too many transactions.
|
||||||
TooManyTransactions,
|
TooManyTransactions,
|
||||||
/// General format error.
|
/// There are too many hashes
|
||||||
BadFormat(String),
|
TooManyHashes,
|
||||||
|
/// There must be at least one bit per node in the partial tree,
|
||||||
|
/// and at least one node per hash
|
||||||
|
NotEnoughBits,
|
||||||
|
/// Not all bits were consumed
|
||||||
|
NotAllBitsConsumed,
|
||||||
|
/// Not all hashes were consumed
|
||||||
|
NotAllHashesConsumed,
|
||||||
|
/// Overflowed the bits array
|
||||||
|
BitsArrayOverflow,
|
||||||
|
/// Overflowed the hashes array
|
||||||
|
HashesArrayOverflow,
|
||||||
|
/// The left and right branches should never be identical
|
||||||
|
IdenticalHashesFound,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for MerkleBlockError {
|
impl fmt::Display for MerkleBlockError {
|
||||||
|
@ -478,7 +491,13 @@ impl fmt::Display for MerkleBlockError {
|
||||||
MerkleRootMismatch => write!(f, "merkle header root doesn't match to the root calculated from the partial merkle tree"),
|
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"),
|
NoTransactions => write!(f, "partial merkle tree contains no transactions"),
|
||||||
TooManyTransactions => write!(f, "too many transactions"),
|
TooManyTransactions => write!(f, "too many transactions"),
|
||||||
BadFormat(ref s) => write!(f, "general format error: {}", s),
|
TooManyHashes => write!(f, "proof contains more hashes than transactions"),
|
||||||
|
NotEnoughBits => write!(f, "proof contains less bits than hashes"),
|
||||||
|
NotAllBitsConsumed => write!(f, "not all bit were consumed"),
|
||||||
|
NotAllHashesConsumed => write!(f, "not all hashes were consumed"),
|
||||||
|
BitsArrayOverflow => write!(f, "overflowed the bits array"),
|
||||||
|
HashesArrayOverflow => write!(f, "overflowed the hashes array"),
|
||||||
|
IdenticalHashesFound => write!(f, "found identical transaction hashes"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -490,7 +509,8 @@ impl std::error::Error for MerkleBlockError {
|
||||||
use self::MerkleBlockError::*;
|
use self::MerkleBlockError::*;
|
||||||
|
|
||||||
match *self {
|
match *self {
|
||||||
MerkleRootMismatch | NoTransactions | TooManyTransactions | BadFormat(_) => None,
|
MerkleRootMismatch | NoTransactions | TooManyTransactions | TooManyHashes | NotEnoughBits | NotAllBitsConsumed |
|
||||||
|
NotAllHashesConsumed | BitsArrayOverflow | HashesArrayOverflow | IdenticalHashesFound => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue