Merge rust-bitcoin/rust-bitcoin#1004: Clear Clippy warnings
a6efe982bd
Use write_all to write whole buffer (Tobin C. Harding)51c60b8507
Allow no is_empty method for VarInt (Tobin C. Harding)841f1f5832
Implement Default for TaprootBuilder (Tobin C. Harding)f81d4aa9bd
Remove unnecessary call to clone (Tobin C. Harding)27649ba182
Use copied instead of map to copy (Tobin C. Harding)62ccc9102c
Use iter().flatten().any() instead of if let Some (Tobin C. Harding)4b28a1bb97
Remove unneeded return statement (Tobin C. Harding)16cac3cd70
Derive Default for Witness (Tobin C. Harding)c75189841a
Remove unnecessary closure (Tobin C. Harding)dfff85352a
Ignore bytes written for sighash_single bug output (Tobin C. Harding)14c72e755b
Use contains combinator instead of manual range (Tobin C. Harding)b7d6c3e02c
Remove additional reference (Tobin C. Harding)1940b00132
Implement From instead of Into (Tobin C. Harding)fcd0f4deac
Use struct field init shorthand (Tobin C. Harding)641960f037
Use rustfmt::skip (Tobin C. Harding)3cd00e5d47
Remove unnecessary whitespace (Tobin C. Harding) Pull request description: Clear all current Clippy warnings, codebase wide. Possibly contentious patches include: - [commit](fcd0f4deac
): `fcd0f4d Use struct field init shorthand` - [commit](14c72e755b
): `14c72e7 Use contains combinator instead of manual range` - [commit](3b3c37803a
): `3b3c378 Use iter().flatten() instead of if let Some` ## Notes Please note commit `dfff8535 Ignore bytes written for sighash_single bug output` touches the same lines of code as commit `a6efe982 Use write_all to write whole buffer`. ACKs for top commit: apoelstra: ACKa6efe982bd
Kixunil: ACKa6efe982bd
Tree-SHA512: 5351a82fd3deadb8e53911c43b5a60a9517d5c57014f5fa833b79b32c0a4606ada0bcd28e06ce35d47aa74115c7cf70c27a1ba9c561a3424ac85a4f69774014d
This commit is contained in:
commit
8f81fc5aa7
|
@ -470,9 +470,9 @@ impl Script {
|
||||||
/// the current script, assuming that the script is a Tapscript.
|
/// the current script, assuming that the script is a Tapscript.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn to_v1_p2tr<C: Verification>(&self, secp: &Secp256k1<C>, internal_key: UntweakedPublicKey) -> Script {
|
pub fn to_v1_p2tr<C: Verification>(&self, secp: &Secp256k1<C>, internal_key: UntweakedPublicKey) -> Script {
|
||||||
let leaf_hash = TapLeafHash::from_script(&self, LeafVersion::TapScript);
|
let leaf_hash = TapLeafHash::from_script(self, LeafVersion::TapScript);
|
||||||
let merkle_root = TapBranchHash::from_inner(leaf_hash.into_inner());
|
let merkle_root = TapBranchHash::from_inner(leaf_hash.into_inner());
|
||||||
Script::new_v1_p2tr(&secp, internal_key, Some(merkle_root))
|
Script::new_v1_p2tr(secp, internal_key, Some(merkle_root))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns witness version of the script, if any, assuming the script is a `scriptPubkey`.
|
/// Returns witness version of the script, if any, assuming the script is a `scriptPubkey`.
|
||||||
|
@ -525,7 +525,7 @@ impl Script {
|
||||||
// special meaning. The value of the first push is called the "version byte". The following
|
// special meaning. The value of the first push is called the "version byte". The following
|
||||||
// byte vector pushed is called the "witness program".
|
// byte vector pushed is called the "witness program".
|
||||||
let script_len = self.0.len();
|
let script_len = self.0.len();
|
||||||
if script_len < 4 || script_len > 42 {
|
if !(4..=42).contains(&script_len) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
let ver_opcode = opcodes::All::from(self.0[0]); // Version 0 or PUSHNUM_1-PUSHNUM_16
|
let ver_opcode = opcodes::All::from(self.0[0]); // Version 0 or PUSHNUM_1-PUSHNUM_16
|
||||||
|
@ -877,7 +877,7 @@ impl Builder {
|
||||||
/// dedicated opcodes to push some small integers.
|
/// dedicated opcodes to push some small integers.
|
||||||
pub fn push_int(self, data: i64) -> Builder {
|
pub fn push_int(self, data: i64) -> Builder {
|
||||||
// We can special-case -1, 1-16
|
// We can special-case -1, 1-16
|
||||||
if data == -1 || (data >= 1 && data <= 16) {
|
if data == -1 || (1..=16).contains(&data) {
|
||||||
let opcode = opcodes::All::from(
|
let opcode = opcodes::All::from(
|
||||||
(data - 1 + opcodes::OP_TRUE.into_u8() as i64) as u8
|
(data - 1 + opcodes::OP_TRUE.into_u8() as i64) as u8
|
||||||
);
|
);
|
||||||
|
|
|
@ -353,7 +353,7 @@ impl Transaction {
|
||||||
// will result in the data written to the writer being hashed, however the correct
|
// will result in the data written to the writer being hashed, however the correct
|
||||||
// handling of the SIGHASH_SINGLE bug is to return the 'one array' - either implement
|
// handling of the SIGHASH_SINGLE bug is to return the 'one array' - either implement
|
||||||
// this behaviour manually or use `signature_hash()`.
|
// this behaviour manually or use `signature_hash()`.
|
||||||
writer.write(b"[not a transaction] SIGHASH_SINGLE bug")?;
|
writer.write_all(b"[not a transaction] SIGHASH_SINGLE bug")?;
|
||||||
return Ok(())
|
return Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ use serde;
|
||||||
/// For serialization and deserialization performance it is stored internally as a single `Vec`,
|
/// For serialization and deserialization performance it is stored internally as a single `Vec`,
|
||||||
/// saving some allocations.
|
/// saving some allocations.
|
||||||
///
|
///
|
||||||
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
|
#[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
|
||||||
pub struct Witness {
|
pub struct Witness {
|
||||||
/// contains the witness Vec<Vec<u8>> serialization without the initial varint indicating the
|
/// contains the witness Vec<Vec<u8>> serialization without the initial varint indicating the
|
||||||
/// number of elements (which is stored in `witness_elements`)
|
/// number of elements (which is stored in `witness_elements`)
|
||||||
|
@ -67,12 +67,12 @@ impl Decodable for Witness {
|
||||||
let element_size = element_size_varint.0 as usize;
|
let element_size = element_size_varint.0 as usize;
|
||||||
let required_len = cursor
|
let required_len = cursor
|
||||||
.checked_add(element_size)
|
.checked_add(element_size)
|
||||||
.ok_or_else(|| self::Error::OversizedVectorAllocation {
|
.ok_or(self::Error::OversizedVectorAllocation {
|
||||||
requested: usize::max_value(),
|
requested: usize::max_value(),
|
||||||
max: MAX_VEC_SIZE,
|
max: MAX_VEC_SIZE,
|
||||||
})?
|
})?
|
||||||
.checked_add(element_size_varint_len)
|
.checked_add(element_size_varint_len)
|
||||||
.ok_or_else(|| self::Error::OversizedVectorAllocation {
|
.ok_or(self::Error::OversizedVectorAllocation {
|
||||||
requested: usize::max_value(),
|
requested: usize::max_value(),
|
||||||
max: MAX_VEC_SIZE,
|
max: MAX_VEC_SIZE,
|
||||||
})?;
|
})?;
|
||||||
|
@ -218,7 +218,7 @@ impl Witness {
|
||||||
pub fn push_bitcoin_signature(&mut self, signature: &ecdsa::SerializedSignature, hash_type: EcdsaSighashType) {
|
pub fn push_bitcoin_signature(&mut self, signature: &ecdsa::SerializedSignature, hash_type: EcdsaSighashType) {
|
||||||
// Note that a maximal length ECDSA signature is 72 bytes, plus the sighash type makes 73
|
// Note that a maximal length ECDSA signature is 72 bytes, plus the sighash type makes 73
|
||||||
let mut sig = [0; 73];
|
let mut sig = [0; 73];
|
||||||
sig[..signature.len()].copy_from_slice(&signature);
|
sig[..signature.len()].copy_from_slice(signature);
|
||||||
sig[signature.len()] = hash_type as u8;
|
sig[signature.len()] = hash_type as u8;
|
||||||
self.push(&sig[..signature.len() + 1]);
|
self.push(&sig[..signature.len() + 1]);
|
||||||
}
|
}
|
||||||
|
@ -249,19 +249,6 @@ impl Witness {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Witness {
|
|
||||||
fn default() -> Self {
|
|
||||||
// from https://doc.rust-lang.org/std/vec/struct.Vec.html#method.new
|
|
||||||
// The vector will not allocate until elements are pushed onto it.
|
|
||||||
Witness {
|
|
||||||
content: Vec::new(),
|
|
||||||
witness_elements: 0,
|
|
||||||
last: 0,
|
|
||||||
second_to_last: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Iterator for Iter<'a> {
|
impl<'a> Iterator for Iter<'a> {
|
||||||
type Item = &'a [u8];
|
type Item = &'a [u8];
|
||||||
|
|
||||||
|
|
|
@ -400,6 +400,7 @@ impl_int_encodable!(i16, read_i16, emit_i16);
|
||||||
impl_int_encodable!(i32, read_i32, emit_i32);
|
impl_int_encodable!(i32, read_i32, emit_i32);
|
||||||
impl_int_encodable!(i64, read_i64, emit_i64);
|
impl_int_encodable!(i64, read_i64, emit_i64);
|
||||||
|
|
||||||
|
#[allow(clippy::len_without_is_empty)] // VarInt has on concept of 'is_empty'.
|
||||||
impl VarInt {
|
impl VarInt {
|
||||||
/// Gets the length of this VarInt when encoded.
|
/// Gets the length of this VarInt when encoded.
|
||||||
/// Returns 1 for 0..=0xFC, 3 for 0xFD..=(2^16-1), 5 for 0x10000..=(2^32-1),
|
/// Returns 1 for 0..=0xFC, 3 for 0xFD..=(2^16-1), 5 for 0x10000..=(2^32-1),
|
||||||
|
|
|
@ -238,9 +238,9 @@ impl From<u64> for ServiceFlags {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<u64> for ServiceFlags {
|
impl From<ServiceFlags> for u64 {
|
||||||
fn into(self) -> u64 {
|
fn from(flags: ServiceFlags) -> Self {
|
||||||
self.0
|
flags.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -621,7 +621,7 @@ impl Address {
|
||||||
network: Network
|
network: Network
|
||||||
) -> Address {
|
) -> Address {
|
||||||
Address {
|
Address {
|
||||||
network: network,
|
network,
|
||||||
payload: Payload::p2tr(secp, internal_key, merkle_root),
|
payload: Payload::p2tr(secp, internal_key, merkle_root),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -283,9 +283,9 @@ impl From<Vec<ChildNumber>> for DerivationPath {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<Vec<ChildNumber>> for DerivationPath {
|
impl From<DerivationPath> for Vec<ChildNumber> {
|
||||||
fn into(self) -> Vec<ChildNumber> {
|
fn from(path: DerivationPath) -> Self {
|
||||||
self.0
|
path.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ impl EcdsaSig {
|
||||||
pub fn to_vec(&self) -> Vec<u8> {
|
pub fn to_vec(&self) -> Vec<u8> {
|
||||||
// TODO: add support to serialize to a writer to SerializedSig
|
// TODO: add support to serialize to a writer to SerializedSig
|
||||||
self.sig.serialize_der()
|
self.sig.serialize_der()
|
||||||
.iter().map(|x| *x)
|
.iter().copied()
|
||||||
.chain(iter::once(self.hash_ty as u8))
|
.chain(iter::once(self.hash_ty as u8))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,7 +228,7 @@ impl FromStr for PublicKey {
|
||||||
match s.len() {
|
match s.len() {
|
||||||
66 => PublicKey::from_slice(&<[u8; 33]>::from_hex(s)?),
|
66 => PublicKey::from_slice(&<[u8; 33]>::from_hex(s)?),
|
||||||
130 => PublicKey::from_slice(&<[u8; 65]>::from_hex(s)?),
|
130 => PublicKey::from_slice(&<[u8; 65]>::from_hex(s)?),
|
||||||
len => return Err(Error::Hex(hex::Error::InvalidLength(66, len)))
|
len => Err(Error::Hex(hex::Error::InvalidLength(66, len))),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ macro_rules! impl_psbtmap_consensus_enc_dec_oding {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
#[rustfmt::skip]
|
||||||
macro_rules! impl_psbt_insert_pair {
|
macro_rules! impl_psbt_insert_pair {
|
||||||
($slf:ident.$unkeyed_name:ident <= <$raw_key:ident: _>|<$raw_value:ident: $unkeyed_value_type:ty>) => {
|
($slf:ident.$unkeyed_name:ident <= <$raw_key:ident: _>|<$raw_value:ident: $unkeyed_value_type:ty>) => {
|
||||||
if $raw_key.key.is_empty() {
|
if $raw_key.key.is_empty() {
|
||||||
|
@ -122,8 +122,7 @@ macro_rules! impl_psbt_insert_pair {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
|
||||||
macro_rules! impl_psbt_get_pair {
|
macro_rules! impl_psbt_get_pair {
|
||||||
($rv:ident.push($slf:ident.$unkeyed_name:ident, $unkeyed_typeval:ident)) => {
|
($rv:ident.push($slf:ident.$unkeyed_name:ident, $unkeyed_typeval:ident)) => {
|
||||||
if let Some(ref $unkeyed_name) = $slf.$unkeyed_name {
|
if let Some(ref $unkeyed_name) = $slf.$unkeyed_name {
|
||||||
|
|
|
@ -125,7 +125,7 @@ impl Deserialize for EcdsaSig {
|
||||||
// also has a field sighash_u32 (See BIP141). For example, when signing with non-standard
|
// also has a field sighash_u32 (See BIP141). For example, when signing with non-standard
|
||||||
// 0x05, the sighash message would have the last field as 0x05u32 while, the verification
|
// 0x05, the sighash message would have the last field as 0x05u32 while, the verification
|
||||||
// would use check the signature assuming sighash_u32 as `0x01`.
|
// would use check the signature assuming sighash_u32 as `0x01`.
|
||||||
EcdsaSig::from_slice(&bytes)
|
EcdsaSig::from_slice(bytes)
|
||||||
.map_err(|e| match e {
|
.map_err(|e| match e {
|
||||||
EcdsaSigError::EmptySignature => {
|
EcdsaSigError::EmptySignature => {
|
||||||
encode::Error::ParseFailed("Empty partial signature data")
|
encode::Error::ParseFailed("Empty partial signature data")
|
||||||
|
@ -145,7 +145,7 @@ impl Deserialize for EcdsaSig {
|
||||||
|
|
||||||
impl Serialize for KeySource {
|
impl Serialize for KeySource {
|
||||||
fn serialize(&self) -> Vec<u8> {
|
fn serialize(&self) -> Vec<u8> {
|
||||||
let mut rv: Vec<u8> = Vec::with_capacity(key_source_len(&self));
|
let mut rv: Vec<u8> = Vec::with_capacity(key_source_len(self));
|
||||||
|
|
||||||
rv.append(&mut self.0.to_bytes().to_vec());
|
rv.append(&mut self.0.to_bytes().to_vec());
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ impl Deserialize for PsbtSighashType {
|
||||||
// Taproot related ser/deser
|
// Taproot related ser/deser
|
||||||
impl Serialize for XOnlyPublicKey {
|
impl Serialize for XOnlyPublicKey {
|
||||||
fn serialize(&self) -> Vec<u8> {
|
fn serialize(&self) -> Vec<u8> {
|
||||||
XOnlyPublicKey::serialize(&self).to_vec()
|
XOnlyPublicKey::serialize(self).to_vec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ impl Serialize for schnorr::SchnorrSig {
|
||||||
|
|
||||||
impl Deserialize for schnorr::SchnorrSig {
|
impl Deserialize for schnorr::SchnorrSig {
|
||||||
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
|
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
|
||||||
schnorr::SchnorrSig::from_slice(&bytes)
|
schnorr::SchnorrSig::from_slice(bytes)
|
||||||
.map_err(|e| match e {
|
.map_err(|e| match e {
|
||||||
schnorr::SchnorrSigError::InvalidSighashType(flag) => {
|
schnorr::SchnorrSigError::InvalidSighashType(flag) => {
|
||||||
encode::Error::from(psbt::Error::NonStandardSighashType(flag as u32))
|
encode::Error::from(psbt::Error::NonStandardSighashType(flag as u32))
|
||||||
|
@ -264,7 +264,7 @@ impl Deserialize for (XOnlyPublicKey, TapLeafHash) {
|
||||||
|
|
||||||
impl Serialize for ControlBlock {
|
impl Serialize for ControlBlock {
|
||||||
fn serialize(&self) -> Vec<u8> {
|
fn serialize(&self) -> Vec<u8> {
|
||||||
ControlBlock::serialize(&self)
|
ControlBlock::serialize(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,7 +311,7 @@ impl Serialize for (Vec<TapLeafHash>, KeySource) {
|
||||||
|
|
||||||
impl Deserialize for (Vec<TapLeafHash>, KeySource) {
|
impl Deserialize for (Vec<TapLeafHash>, KeySource) {
|
||||||
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
|
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
|
||||||
let (leafhash_vec, consumed) = deserialize_partial::<Vec<TapLeafHash>>(&bytes)?;
|
let (leafhash_vec, consumed) = deserialize_partial::<Vec<TapLeafHash>>(bytes)?;
|
||||||
let key_source = KeySource::deserialize(&bytes[consumed..])?;
|
let key_source = KeySource::deserialize(&bytes[consumed..])?;
|
||||||
Ok((leafhash_vec, key_source))
|
Ok((leafhash_vec, key_source))
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,10 +109,10 @@ impl TapTweak for UntweakedPublicKey {
|
||||||
/// The tweaked key and its parity.
|
/// The tweaked key and its parity.
|
||||||
fn tap_tweak<C: Verification>(self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> (TweakedPublicKey, secp256k1::Parity) {
|
fn tap_tweak<C: Verification>(self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> (TweakedPublicKey, secp256k1::Parity) {
|
||||||
let tweak_value = TapTweakHash::from_key_and_tweak(self, merkle_root).into_inner();
|
let tweak_value = TapTweakHash::from_key_and_tweak(self, merkle_root).into_inner();
|
||||||
let mut output_key = self.clone();
|
let mut output_key = self;
|
||||||
let parity = output_key.tweak_add_assign(&secp, &tweak_value).expect("Tap tweak failed");
|
let parity = output_key.tweak_add_assign(secp, &tweak_value).expect("Tap tweak failed");
|
||||||
|
|
||||||
debug_assert!(self.tweak_add_check(&secp, &output_key, parity, tweak_value));
|
debug_assert!(self.tweak_add_check(secp, &output_key, parity, tweak_value));
|
||||||
(TweakedPublicKey(output_key), parity)
|
(TweakedPublicKey(output_key), parity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ impl TapTweak for UntweakedKeyPair {
|
||||||
fn tap_tweak<C: Verification>(mut self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> TweakedKeyPair {
|
fn tap_tweak<C: Verification>(mut self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> TweakedKeyPair {
|
||||||
let pubkey = crate::XOnlyPublicKey::from_keypair(&self);
|
let pubkey = crate::XOnlyPublicKey::from_keypair(&self);
|
||||||
let tweak_value = TapTweakHash::from_key_and_tweak(pubkey, merkle_root).into_inner();
|
let tweak_value = TapTweakHash::from_key_and_tweak(pubkey, merkle_root).into_inner();
|
||||||
self.tweak_add_assign(&secp, &tweak_value).expect("Tap tweak failed");
|
self.tweak_add_assign(secp, &tweak_value).expect("Tap tweak failed");
|
||||||
TweakedKeyPair(self)
|
TweakedKeyPair(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ impl SchnorrSig {
|
||||||
// default type
|
// default type
|
||||||
let sig = secp256k1::schnorr::Signature::from_slice(sl)
|
let sig = secp256k1::schnorr::Signature::from_slice(sl)
|
||||||
.map_err(SchnorrSigError::Secp256k1)?;
|
.map_err(SchnorrSigError::Secp256k1)?;
|
||||||
return Ok( SchnorrSig { sig, hash_ty : SchnorrSighashType::Default });
|
Ok(SchnorrSig { sig, hash_ty: SchnorrSighashType::Default })
|
||||||
},
|
},
|
||||||
65 => {
|
65 => {
|
||||||
let (hash_ty, sig) = sl.split_last().expect("Slice len checked == 65");
|
let (hash_ty, sig) = sl.split_last().expect("Slice len checked == 65");
|
||||||
|
|
|
@ -440,7 +440,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
|
||||||
.tx
|
.tx
|
||||||
.input
|
.input
|
||||||
.get(input_index)
|
.get(input_index)
|
||||||
.ok_or_else(|| Error::IndexOutOfInputsBounds {
|
.ok_or(Error::IndexOutOfInputsBounds {
|
||||||
index: input_index,
|
index: input_index,
|
||||||
inputs_size: self.tx.input.len(),
|
inputs_size: self.tx.input.len(),
|
||||||
})?;
|
})?;
|
||||||
|
@ -473,7 +473,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
|
||||||
self.tx
|
self.tx
|
||||||
.output
|
.output
|
||||||
.get(input_index)
|
.get(input_index)
|
||||||
.ok_or_else(|| Error::SingleWithoutCorrespondingOutput {
|
.ok_or(Error::SingleWithoutCorrespondingOutput {
|
||||||
index: input_index,
|
index: input_index,
|
||||||
outputs_size: self.tx.output.len(),
|
outputs_size: self.tx.output.len(),
|
||||||
})?
|
})?
|
||||||
|
@ -597,7 +597,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
|
||||||
.tx
|
.tx
|
||||||
.input
|
.input
|
||||||
.get(input_index)
|
.get(input_index)
|
||||||
.ok_or_else(|| Error::IndexOutOfInputsBounds {
|
.ok_or(Error::IndexOutOfInputsBounds {
|
||||||
index: input_index,
|
index: input_index,
|
||||||
inputs_size: self.tx.input.len(),
|
inputs_size: self.tx.input.len(),
|
||||||
})?;
|
})?;
|
||||||
|
|
|
@ -217,10 +217,10 @@ impl TaprootSpendInfo {
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let (output_key, parity) = internal_key.tap_tweak(secp, merkle_root);
|
let (output_key, parity) = internal_key.tap_tweak(secp, merkle_root);
|
||||||
Self {
|
Self {
|
||||||
internal_key: internal_key,
|
internal_key,
|
||||||
merkle_root: merkle_root,
|
merkle_root,
|
||||||
output_key_parity: parity,
|
output_key_parity: parity,
|
||||||
output_key: output_key,
|
output_key,
|
||||||
script_map: BTreeMap::new(),
|
script_map: BTreeMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -442,14 +442,7 @@ impl TaprootBuilder {
|
||||||
|
|
||||||
/// Checks if the builder has hidden nodes.
|
/// Checks if the builder has hidden nodes.
|
||||||
pub fn has_hidden_nodes(&self) -> bool {
|
pub fn has_hidden_nodes(&self) -> bool {
|
||||||
for node in &self.branch {
|
self.branch.iter().flatten().any(|node| node.has_hidden_nodes)
|
||||||
if let Some(node) = node {
|
|
||||||
if node.has_hidden_nodes {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a [`TaprootSpendInfo`] with the given internal key.
|
/// Creates a [`TaprootSpendInfo`] with the given internal key.
|
||||||
|
@ -521,6 +514,12 @@ impl TaprootBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for TaprootBuilder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Represents the node information in taproot tree.
|
/// Represents the node information in taproot tree.
|
||||||
///
|
///
|
||||||
/// Helper type used in merkle tree construction allowing one to build sparse merkle trees. The node
|
/// Helper type used in merkle tree construction allowing one to build sparse merkle trees. The node
|
||||||
|
@ -544,7 +543,7 @@ impl NodeInfo {
|
||||||
/// Creates a new [`NodeInfo`] with omitted/hidden info.
|
/// Creates a new [`NodeInfo`] with omitted/hidden info.
|
||||||
pub fn new_hidden_node(hash: sha256::Hash) -> Self {
|
pub fn new_hidden_node(hash: sha256::Hash) -> Self {
|
||||||
Self {
|
Self {
|
||||||
hash: hash,
|
hash,
|
||||||
leaves: vec![],
|
leaves: vec![],
|
||||||
has_hidden_nodes: true
|
has_hidden_nodes: true
|
||||||
}
|
}
|
||||||
|
@ -596,8 +595,8 @@ impl ScriptLeaf {
|
||||||
/// Creates an new [`ScriptLeaf`] from `script` and `ver` and no merkle branch.
|
/// Creates an new [`ScriptLeaf`] from `script` and `ver` and no merkle branch.
|
||||||
fn new(script: Script, ver: LeafVersion) -> Self {
|
fn new(script: Script, ver: LeafVersion) -> Self {
|
||||||
Self {
|
Self {
|
||||||
script: script,
|
script,
|
||||||
ver: ver,
|
ver,
|
||||||
merkle_branch: TaprootMerkleBranch(vec![]),
|
merkle_branch: TaprootMerkleBranch(vec![]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -682,7 +681,7 @@ impl TaprootMerkleBranch {
|
||||||
|
|
||||||
/// Serializes `self` as bytes.
|
/// Serializes `self` as bytes.
|
||||||
pub fn serialize(&self) -> Vec<u8> {
|
pub fn serialize(&self) -> Vec<u8> {
|
||||||
self.0.iter().map(|e| e.as_inner()).flatten().map(|x| *x).collect::<Vec<u8>>()
|
self.0.iter().flat_map(|e| e.as_inner()).copied().collect::<Vec<u8>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Appends elements to proof.
|
/// Appends elements to proof.
|
||||||
|
@ -802,7 +801,7 @@ impl ControlBlock {
|
||||||
) -> bool {
|
) -> bool {
|
||||||
// compute the script hash
|
// compute the script hash
|
||||||
// Initially the curr_hash is the leaf hash
|
// Initially the curr_hash is the leaf hash
|
||||||
let leaf_hash = TapLeafHash::from_script(&script, self.leaf_version);
|
let leaf_hash = TapLeafHash::from_script(script, self.leaf_version);
|
||||||
let mut curr_hash = TapBranchHash::from_inner(leaf_hash.into_inner());
|
let mut curr_hash = TapBranchHash::from_inner(leaf_hash.into_inner());
|
||||||
// Verify the proof
|
// Verify the proof
|
||||||
for elem in self.merkle_branch.as_inner() {
|
for elem in self.merkle_branch.as_inner() {
|
||||||
|
|
Loading…
Reference in New Issue