Merge rust-bitcoin/rust-bitcoin#3780: Use uniform capitalisation of SegWit in rustdocs

e56f461916 Make capitalization of SegWit uniform in strings (Jamil Lambert, PhD)
3520e832ac Make capitalization of SegWit uniform in rustdocs (Jamil Lambert, PhD)

Pull request description:

  Fixes #3770

  - Searched and replaced all occurrences of `//` * `segwit` (case insensitive) with `//` * `SegWit`
  - Searched and replaced all occurrences of `"` * `segwit` (case insensitive) with `"` * `SegWit`

ACKs for top commit:
  apoelstra:
    ACK e56f461916b85928139950074d0df52caf4f919b; successfully ran local tests

Tree-SHA512: c56704102d8e86f26378bb302d5fdc7ea21d41fd49f55606e589ec32ff896f1adfb1960d8fb29abccfbf298b90fc357ed609d80fd0163dcb4ff01573646b02c3
This commit is contained in:
merge-script 2024-12-17 18:10:44 +00:00
commit f4069fcd61
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
18 changed files with 92 additions and 92 deletions

View File

@ -11,7 +11,7 @@ fn main() {
// This example derives root xprv from a 32-byte seed, // This example derives root xprv from a 32-byte seed,
// derives the child xprv with path m/84h/0h/0h, // derives the child xprv with path m/84h/0h/0h,
// prints out corresponding xpub, // prints out corresponding xpub,
// calculates and prints out the first receiving segwit address. // calculates and prints out the first receiving SegWit address.
// Run this example with cargo and seed(hex-encoded) argument: // Run this example with cargo and seed(hex-encoded) argument:
// cargo run --example bip32 7934c09359b234e076b9fa5a1abfd38e3dc2a9939745b7cc3c22a48d831d14bd // cargo run --example bip32 7934c09359b234e076b9fa5a1abfd38e3dc2a9939745b7cc3c22a48d831d14bd

View File

@ -13,7 +13,7 @@ use hex_lit::hex;
//run with: cargo run --example sighash //run with: cargo run --example sighash
/// Computes segwit sighash for a transaction input that spends a p2wpkh output with "witness_v0_keyhash" scriptPubKey.type /// Computes SegWit sighash for a transaction input that spends a p2wpkh output with "witness_v0_keyhash" scriptPubKey.type
/// ///
/// # Parameters /// # Parameters
/// ///
@ -45,7 +45,7 @@ fn compute_sighash_p2wpkh(raw_tx: &[u8], inp_idx: usize, value: u64) {
let sighash = cache let sighash = cache
.p2wpkh_signature_hash(inp_idx, &spk, Amount::from_sat(value), sig.sighash_type) .p2wpkh_signature_hash(inp_idx, &spk, Amount::from_sat(value), sig.sighash_type)
.expect("failed to compute sighash"); .expect("failed to compute sighash");
println!("Segwit p2wpkh sighash: {:x}", sighash); println!("SegWit p2wpkh sighash: {:x}", sighash);
let msg = secp256k1::Message::from(sighash); let msg = secp256k1::Message::from(sighash);
println!("Message is {:x}", msg); println!("Message is {:x}", msg);
let secp = secp256k1::Secp256k1::verification_only(); let secp = secp256k1::Secp256k1::verification_only();
@ -98,7 +98,7 @@ fn compute_sighash_legacy(raw_tx: &[u8], inp_idx: usize, script_pubkey_bytes_opt
} }
} }
/// Computes sighash for a segwit multisig transaction input that spends a p2wsh output with "witness_v0_scripthash" scriptPubKey.type /// Computes sighash for a SegWit multisig transaction input that spends a p2wsh output with "witness_v0_scripthash" scriptPubKey.type
/// ///
/// # Parameters /// # Parameters
/// ///
@ -132,7 +132,7 @@ fn compute_sighash_p2wsh(raw_tx: &[u8], inp_idx: usize, value: u64) {
sig.sighash_type, sig.sighash_type,
) )
.expect("failed to compute sighash"); .expect("failed to compute sighash");
println!("Segwit p2wsh sighash: {:x} ({})", sighash, sig.sighash_type); println!("SegWit p2wsh sighash: {:x} ({})", sighash, sig.sighash_type);
} }
} }

View File

@ -78,7 +78,7 @@ impl std::error::Error for UnknownAddressTypeError {
pub enum ParseError { pub enum ParseError {
/// Base58 legacy decoding error. /// Base58 legacy decoding error.
Base58(Base58Error), Base58(Base58Error),
/// Bech32 segwit decoding error. /// Bech32 SegWit decoding error.
Bech32(Bech32Error), Bech32(Bech32Error),
/// Address's network differs from required one. /// Address's network differs from required one.
NetworkValidation(NetworkValidationError), NetworkValidation(NetworkValidationError),
@ -165,7 +165,7 @@ impl std::error::Error for NetworkValidationError {}
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive] #[non_exhaustive]
pub enum Bech32Error { pub enum Bech32Error {
/// Parse segwit Bech32 error. /// Parse SegWit Bech32 error.
ParseBech32(ParseBech32Error), ParseBech32(ParseBech32Error),
/// A witness version conversion/parsing error. /// A witness version conversion/parsing error.
WitnessVersion(witness_version::TryFromError), WitnessVersion(witness_version::TryFromError),
@ -182,7 +182,7 @@ impl fmt::Display for Bech32Error {
use Bech32Error::*; use Bech32Error::*;
match *self { match *self {
ParseBech32(ref e) => write_err!(f, "segwit parsing error"; e), ParseBech32(ref e) => write_err!(f, "SegWit parsing error"; e),
WitnessVersion(ref e) => write_err!(f, "witness version conversion/parsing error"; e), WitnessVersion(ref e) => write_err!(f, "witness version conversion/parsing error"; e),
WitnessProgram(ref e) => write_err!(f, "witness program error"; e), WitnessProgram(ref e) => write_err!(f, "witness program error"; e),
UnknownHrp(ref e) => write_err!(f, "unknown hrp error"; e), UnknownHrp(ref e) => write_err!(f, "unknown hrp error"; e),

View File

@ -254,7 +254,7 @@ pub enum AddressData {
/// The script hash used to encumber outputs to this address. /// The script hash used to encumber outputs to this address.
script_hash: ScriptHash, script_hash: ScriptHash,
}, },
/// Data encoded by a Segwit address. /// Data encoded by a SegWit address.
Segwit { Segwit {
/// The witness program used to encumber outputs to this address. /// The witness program used to encumber outputs to this address.
witness_program: WitnessProgram, witness_program: WitnessProgram,
@ -421,7 +421,7 @@ impl Address {
/// Constructs a new pay-to-witness-public-key-hash (P2WPKH) [`Address`] from a public key. /// Constructs a new pay-to-witness-public-key-hash (P2WPKH) [`Address`] from a public key.
/// ///
/// This is the native segwit address type for an output redeemable with a single signature. /// This is the native SegWit address type for an output redeemable with a single signature.
pub fn p2wpkh(pk: CompressedPublicKey, hrp: impl Into<KnownHrp>) -> Self { pub fn p2wpkh(pk: CompressedPublicKey, hrp: impl Into<KnownHrp>) -> Self {
let program = WitnessProgram::p2wpkh(pk); let program = WitnessProgram::p2wpkh(pk);
Address::from_witness_program(program, hrp) Address::from_witness_program(program, hrp)
@ -430,7 +430,7 @@ impl Address {
/// Constructs a new pay-to-script-hash (P2SH) [`Address`] that embeds a /// Constructs a new pay-to-script-hash (P2SH) [`Address`] that embeds a
/// pay-to-witness-public-key-hash (P2WPKH). /// pay-to-witness-public-key-hash (P2WPKH).
/// ///
/// This is a segwit address type that looks familiar (as p2sh) to legacy clients. /// This is a SegWit address type that looks familiar (as p2sh) to legacy clients.
pub fn p2shwpkh(pk: CompressedPublicKey, network: impl Into<NetworkKind>) -> Address { pub fn p2shwpkh(pk: CompressedPublicKey, network: impl Into<NetworkKind>) -> Address {
let builder = script::Builder::new().push_int_unchecked(0).push_slice(pk.wpubkey_hash()); let builder = script::Builder::new().push_int_unchecked(0).push_slice(pk.wpubkey_hash());
let script_hash = builder.as_script().script_hash().expect("script is less than 520 bytes"); let script_hash = builder.as_script().script_hash().expect("script is less than 520 bytes");
@ -455,7 +455,7 @@ impl Address {
/// Constructs a new pay-to-script-hash (P2SH) [`Address`] that embeds a /// Constructs a new pay-to-script-hash (P2SH) [`Address`] that embeds a
/// pay-to-witness-script-hash (P2WSH). /// pay-to-witness-script-hash (P2WSH).
/// ///
/// This is a segwit address type that looks familiar (as p2sh) to legacy clients. /// This is a SegWit address type that looks familiar (as p2sh) to legacy clients.
pub fn p2shwsh( pub fn p2shwsh(
witness_script: &Script, witness_script: &Script,
network: impl Into<NetworkKind>, network: impl Into<NetworkKind>,
@ -546,7 +546,7 @@ impl Address {
} }
} }
/// Gets the witness program for this address if this is a segwit address. /// Gets the witness program for this address if this is a SegWit address.
pub fn witness_program(&self) -> Option<WitnessProgram> { pub fn witness_program(&self) -> Option<WitnessProgram> {
use AddressInner::*; use AddressInner::*;
@ -642,7 +642,7 @@ impl Address {
/// Returns true if the given pubkey is directly related to the address payload. /// Returns true if the given pubkey is directly related to the address payload.
/// ///
/// This is determined by directly comparing the address payload with either the /// This is determined by directly comparing the address payload with either the
/// hash of the given public key or the segwit redeem hash generated from the /// hash of the given public key or the SegWit redeem hash generated from the
/// given key. For Taproot addresses, the supplied key is assumed to be tweaked /// given key. For Taproot addresses, the supplied key is assumed to be tweaked
pub fn is_related_to_pubkey(&self, pubkey: PublicKey) -> bool { pub fn is_related_to_pubkey(&self, pubkey: PublicKey) -> bool {
let pubkey_hash = pubkey.pubkey_hash(); let pubkey_hash = pubkey.pubkey_hash();
@ -684,7 +684,7 @@ impl Address {
/// ///
/// - For p2sh, the payload is the script hash. /// - For p2sh, the payload is the script hash.
/// - For p2pkh, the payload is the pubkey hash. /// - For p2pkh, the payload is the pubkey hash.
/// - For segwit addresses, the payload is the witness program. /// - For SegWit addresses, the payload is the witness program.
fn payload_as_bytes(&self) -> &[u8] { fn payload_as_bytes(&self) -> &[u8] {
use AddressInner::*; use AddressInner::*;
match self.0 { match self.0 {
@ -868,18 +868,18 @@ impl<V: NetworkValidation> fmt::Debug for Address<V> {
/// Address can be parsed only with `NetworkUnchecked`. /// Address can be parsed only with `NetworkUnchecked`.
/// ///
/// Only segwit bech32 addresses prefixed with `bc`, `bcrt` or `tb` and legacy base58 addresses /// Only SegWit bech32 addresses prefixed with `bc`, `bcrt` or `tb` and legacy base58 addresses
/// prefixed with `1`, `2, `3`, `m` or `n` are supported. /// prefixed with `1`, `2, `3`, `m` or `n` are supported.
/// ///
/// # Errors /// # Errors
/// ///
/// - [`ParseError::Bech32`] if the segwit address begins with a `bc`, `bcrt` or `tb` and is not a /// - [`ParseError::Bech32`] if the SegWit address begins with a `bc`, `bcrt` or `tb` and is not a
/// valid bech32 address. /// valid bech32 address.
/// ///
/// - [`ParseError::Base58`] if the legacy address begins with a `1`, `2`, `3`, `m` or `n` and is /// - [`ParseError::Base58`] if the legacy address begins with a `1`, `2`, `3`, `m` or `n` and is
/// not a valid base58 address. /// not a valid base58 address.
/// ///
/// - [`UnknownHrpError`] if the address does not begin with one of the above segwit or /// - [`UnknownHrpError`] if the address does not begin with one of the above SegWit or
/// legacy prifixes. /// legacy prifixes.
impl FromStr for Address<NetworkUnchecked> { impl FromStr for Address<NetworkUnchecked> {
type Err = ParseError; type Err = ParseError;
@ -899,7 +899,7 @@ impl FromStr for Address<NetworkUnchecked> {
} }
} }
/// Convert a byte array of a pubkey hash into a segwit redeem hash /// Convert a byte array of a pubkey hash into a SegWit redeem hash
fn segwit_redeem_hash(pubkey_hash: PubkeyHash) -> hash160::Hash { fn segwit_redeem_hash(pubkey_hash: PubkeyHash) -> hash160::Hash {
let mut sha_engine = hash160::Hash::engine(); let mut sha_engine = hash160::Hash::engine();
sha_engine.input(&[0, 20]); sha_engine.input(&[0, 20]);
@ -1099,9 +1099,9 @@ mod tests {
Some(AddressType::P2tr), Some(AddressType::P2tr),
), ),
// Related to future extensions, addresses are valid but have no type // Related to future extensions, addresses are valid but have no type
// segwit v1 and len != 32 // SegWit v1 and len != 32
("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y", None), ("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y", None),
// segwit v2 // SegWit v2
("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", None), ("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", None),
]; ];
for (address, expected_type) in &addresses { for (address, expected_type) in &addresses {

View File

@ -190,7 +190,7 @@ pub(super) fn new_witness_program_unchecked<T: AsRef<PushBytes>>(
) -> ScriptBuf { ) -> ScriptBuf {
let program = program.as_ref(); let program = program.as_ref();
debug_assert!(program.len() >= 2 && program.len() <= 40); debug_assert!(program.len() >= 2 && program.len() <= 40);
// In segwit v0, the program must be 20 or 32 bytes long. // In SegWit v0, the program must be 20 or 32 bytes long.
debug_assert!(version != WitnessVersion::V0 || program.len() == 20 || program.len() == 32); debug_assert!(version != WitnessVersion::V0 || program.len() == 20 || program.len() == 32);
Builder::new().push_opcode(version.into()).push_slice(program).into_script() Builder::new().push_opcode(version.into()).push_slice(program).into_script()
} }

View File

@ -172,7 +172,7 @@ crate::internal_macros::define_extension_trait! {
instructions.next().is_none() instructions.next().is_none()
} }
/// Checks whether a script pubkey is a Segregated Witness (segwit) program. /// Checks whether a script pubkey is a Segregated Witness (SegWit) program.
#[inline] #[inline]
fn is_witness_program(&self) -> bool { self.witness_version().is_some() } fn is_witness_program(&self) -> bool { self.witness_version().is_some() }

View File

@ -672,7 +672,7 @@ fn script_ord() {
fn test_bitcoinconsensus() { fn test_bitcoinconsensus() {
use crate::consensus_validation::ScriptExt as _; use crate::consensus_validation::ScriptExt as _;
// a random segwit transaction from the blockchain using native segwit // a random SegWit transaction from the blockchain using native SegWit
let spent_bytes = hex!("0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d"); let spent_bytes = hex!("0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d");
let spent = Script::from_bytes(&spent_bytes); let spent = Script::from_bytes(&spent_bytes);
let spending = hex!("010000000001011f97548fbbe7a0db7588a66e18d803d0089315aa7d4cc28360b6ec50ef36718a0100000000ffffffff02df1776000000000017a9146c002a686959067f4866b8fb493ad7970290ab728757d29f0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220565d170eed95ff95027a69b313758450ba84a01224e1f7f130dda46e94d13f8602207bdd20e307f062594022f12ed5017bbf4a055a06aea91c10110a0e3bb23117fc014730440220647d2dc5b15f60bc37dc42618a370b2a1490293f9e5c8464f53ec4fe1dfe067302203598773895b4b16d37485cbe21b337f4e4b650739880098c592553add7dd4355016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000"); let spending = hex!("010000000001011f97548fbbe7a0db7588a66e18d803d0089315aa7d4cc28360b6ec50ef36718a0100000000ffffffff02df1776000000000017a9146c002a686959067f4866b8fb493ad7970290ab728757d29f0000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220565d170eed95ff95027a69b313758450ba84a01224e1f7f130dda46e94d13f8602207bdd20e307f062594022f12ed5017bbf4a055a06aea91c10110a0e3bb23117fc014730440220647d2dc5b15f60bc37dc42618a370b2a1490293f9e5c8464f53ec4fe1dfe067302203598773895b4b16d37485cbe21b337f4e4b650739880098c592553add7dd4355016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000");

View File

@ -31,7 +31,7 @@ pub const MAX_SIZE: usize = 40;
/// number, therefore we carry the version number around along with the program bytes. /// number, therefore we carry the version number around along with the program bytes.
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct WitnessProgram { pub struct WitnessProgram {
/// The segwit version associated with this witness program. /// The SegWit version associated with this witness program.
version: WitnessVersion, version: WitnessVersion,
/// The witness program (between 2 and 40 bytes). /// The witness program (between 2 and 40 bytes).
program: ArrayVec<u8, MAX_SIZE>, program: ArrayVec<u8, MAX_SIZE>,
@ -47,7 +47,7 @@ impl WitnessProgram {
return Err(InvalidLength(program_len)); return Err(InvalidLength(program_len));
} }
// Specific segwit v0 check. These addresses can never spend funds sent to them. // Specific SegWit v0 check. These addresses can never spend funds sent to them.
if version == WitnessVersion::V0 && (program_len != 20 && program_len != 32) { if version == WitnessVersion::V0 && (program_len != 20 && program_len != 32) {
return Err(InvalidSegwitV0Length(program_len)); return Err(InvalidSegwitV0Length(program_len));
} }

View File

@ -115,8 +115,8 @@ crate::internal_macros::define_extension_trait! {
Weight::from_non_witness_data_size(self.base_size().to_u64()) Weight::from_non_witness_data_size(self.base_size().to_u64())
} }
/// The weight of the TxIn when it's included in a segwit transaction (i.e., a transaction /// The weight of the TxIn when it's included in a SegWit transaction (i.e., a transaction
/// having at least one segwit input). /// having at least one SegWit input).
/// ///
/// This always takes into account the witness, even when empty, in which /// This always takes into account the witness, even when empty, in which
/// case 1WU for the witness length varint (`00`) is included. /// case 1WU for the witness length varint (`00`) is included.
@ -125,7 +125,7 @@ crate::internal_macros::define_extension_trait! {
/// might increase more than `TxIn::segwit_weight`. This happens when: /// might increase more than `TxIn::segwit_weight`. This happens when:
/// - the new input added causes the input length `VarInt` to increase its encoding length /// - the new input added causes the input length `VarInt` to increase its encoding length
/// - the new input is the first segwit input added - this will add an additional 2WU to the /// - the new input is the first segwit input added - this will add an additional 2WU to the
/// transaction weight to take into account the segwit marker /// transaction weight to take into account the SegWit marker
fn segwit_weight(&self) -> Weight { fn segwit_weight(&self) -> Weight {
Weight::from_non_witness_data_size(self.base_size().to_u64()) Weight::from_non_witness_data_size(self.base_size().to_u64())
+ Weight::from_witness_data_size(self.witness.size().to_u64()) + Weight::from_witness_data_size(self.witness.size().to_u64())
@ -220,7 +220,7 @@ pub trait TransactionExt: sealed::Sealed {
#[deprecated(since = "0.31.0", note = "use `compute_txid()` instead")] #[deprecated(since = "0.31.0", note = "use `compute_txid()` instead")]
fn txid(&self) -> Txid; fn txid(&self) -> Txid;
/// Computes the segwit version of the transaction id. /// Computes the SegWit version of the transaction id.
#[deprecated(since = "0.31.0", note = "use `compute_wtxid()` instead")] #[deprecated(since = "0.31.0", note = "use `compute_wtxid()` instead")]
fn wtxid(&self) -> Wtxid; fn wtxid(&self) -> Wtxid;
@ -234,13 +234,13 @@ pub trait TransactionExt: sealed::Sealed {
/// multiplied by three plus the with-witness consensus-serialized size. /// multiplied by three plus the with-witness consensus-serialized size.
/// ///
/// For transactions with no inputs, this function will return a value 2 less than the actual /// For transactions with no inputs, this function will return a value 2 less than the actual
/// weight of the serialized transaction. The reason is that zero-input transactions, post-segwit, /// weight of the serialized transaction. The reason is that zero-input transactions, post-SegWit,
/// cannot be unambiguously serialized; we make a choice that adds two extra bytes. For more /// cannot be unambiguously serialized; we make a choice that adds two extra bytes. For more
/// details see [BIP 141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki) /// details see [BIP 141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki)
/// which uses a "input count" of `0x00` as a `marker` for a Segwit-encoded transaction. /// which uses a "input count" of `0x00` as a `marker` for a SegWit-encoded transaction.
/// ///
/// If you need to use 0-input transactions, we strongly recommend you do so using the PSBT /// If you need to use 0-input transactions, we strongly recommend you do so using the PSBT
/// API. The unsigned transaction encoded within PSBT is always a non-segwit transaction /// API. The unsigned transaction encoded within PSBT is always a non-SegWit transaction
/// and can therefore avoid this ambiguity. /// and can therefore avoid this ambiguity.
fn weight(&self) -> Weight; fn weight(&self) -> Weight;
@ -320,7 +320,7 @@ pub trait TransactionExt: sealed::Sealed {
/// The `spent` parameter is a closure/function that looks up the output being spent by each input /// The `spent` parameter is a closure/function that looks up the output being spent by each input
/// It takes in an [`OutPoint`] and returns a [`TxOut`]. If you can't provide this, a placeholder of /// It takes in an [`OutPoint`] and returns a [`TxOut`]. If you can't provide this, a placeholder of
/// `|_| None` can be used. Without access to the previous [`TxOut`], any sigops in a redeemScript (P2SH) /// `|_| None` can be used. Without access to the previous [`TxOut`], any sigops in a redeemScript (P2SH)
/// as well as any segwit sigops will not be counted for that input. /// as well as any SegWit sigops will not be counted for that input.
fn total_sigop_cost<S>(&self, spent: S) -> usize fn total_sigop_cost<S>(&self, spent: S) -> usize
where where
S: FnMut(&OutPoint) -> Option<TxOut>; S: FnMut(&OutPoint) -> Option<TxOut>;
@ -452,12 +452,12 @@ trait TransactionExtPriv {
/// `count_p2sh_sigops` and `count_witness_sigops` respectively). /// `count_p2sh_sigops` and `count_witness_sigops` respectively).
fn count_p2pk_p2pkh_sigops(&self) -> usize; fn count_p2pk_p2pkh_sigops(&self) -> usize;
/// Does not include wrapped segwit (see `count_witness_sigops`). /// Does not include wrapped SegWit (see `count_witness_sigops`).
fn count_p2sh_sigops<S>(&self, spent: &mut S) -> usize fn count_p2sh_sigops<S>(&self, spent: &mut S) -> usize
where where
S: FnMut(&OutPoint) -> Option<TxOut>; S: FnMut(&OutPoint) -> Option<TxOut>;
/// Includes wrapped segwit (returns 0 for Taproot spends). /// Includes wrapped SegWit (returns 0 for Taproot spends).
fn count_witness_sigops<S>(&self, spent: &mut S) -> usize fn count_witness_sigops<S>(&self, spent: &mut S) -> usize
where where
S: FnMut(&OutPoint) -> Option<TxOut>; S: FnMut(&OutPoint) -> Option<TxOut>;
@ -471,7 +471,7 @@ impl TransactionExtPriv for Transaction {
fn count_p2pk_p2pkh_sigops(&self) -> usize { fn count_p2pk_p2pkh_sigops(&self) -> usize {
let mut count: usize = 0; let mut count: usize = 0;
for input in &self.input { for input in &self.input {
// 0 for p2wpkh, p2wsh, and p2sh (including wrapped segwit). // 0 for p2wpkh, p2wsh, and p2sh (including wrapped SegWit).
count = count.saturating_add(input.script_sig.count_sigops_legacy()); count = count.saturating_add(input.script_sig.count_sigops_legacy());
} }
for output in &self.output { for output in &self.output {
@ -480,7 +480,7 @@ impl TransactionExtPriv for Transaction {
count count
} }
/// Does not include wrapped segwit (see `count_witness_sigops`). /// Does not include wrapped SegWit (see `count_witness_sigops`).
fn count_p2sh_sigops<S>(&self, spent: &mut S) -> usize fn count_p2sh_sigops<S>(&self, spent: &mut S) -> usize
where where
S: FnMut(&OutPoint) -> Option<TxOut>, S: FnMut(&OutPoint) -> Option<TxOut>,
@ -505,7 +505,7 @@ impl TransactionExtPriv for Transaction {
count count
} }
/// Includes wrapped segwit (returns 0 for Taproot spends). /// Includes wrapped SegWit (returns 0 for Taproot spends).
fn count_witness_sigops<S>(&self, spent: &mut S) -> usize fn count_witness_sigops<S>(&self, spent: &mut S) -> usize
where where
S: FnMut(&OutPoint) -> Option<TxOut>, S: FnMut(&OutPoint) -> Option<TxOut>,
@ -712,7 +712,7 @@ impl Encodable for Transaction {
len += self.input.consensus_encode(w)?; len += self.input.consensus_encode(w)?;
len += self.output.consensus_encode(w)?; len += self.output.consensus_encode(w)?;
} else { } else {
// BIP-141 (segwit) transaction serialization also includes marker, flag, and witness data. // BIP-141 (SegWit) transaction serialization also includes marker, flag, and witness data.
len += SEGWIT_MARKER.consensus_encode(w)?; len += SEGWIT_MARKER.consensus_encode(w)?;
len += SEGWIT_FLAG.consensus_encode(w)?; len += SEGWIT_FLAG.consensus_encode(w)?;
len += self.input.consensus_encode(w)?; len += self.input.consensus_encode(w)?;
@ -732,7 +732,7 @@ impl Decodable for Transaction {
) -> Result<Self, encode::Error> { ) -> Result<Self, encode::Error> {
let version = Version::consensus_decode_from_finite_reader(r)?; let version = Version::consensus_decode_from_finite_reader(r)?;
let input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?; let input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
// segwit // SegWit
if input.is_empty() { if input.is_empty() {
let segwit_flag = u8::consensus_decode_from_finite_reader(r)?; let segwit_flag = u8::consensus_decode_from_finite_reader(r)?;
match segwit_flag { match segwit_flag {
@ -759,7 +759,7 @@ impl Decodable for Transaction {
// We don't support anything else // We don't support anything else
x => Err(encode::ParseError::UnsupportedSegwitFlag(x).into()), x => Err(encode::ParseError::UnsupportedSegwitFlag(x).into()),
} }
// non-segwit // non-SegWit
} else { } else {
Ok(Transaction { Ok(Transaction {
version, version,
@ -1416,7 +1416,7 @@ mod tests {
#[test] #[test]
fn txid() { fn txid() {
// segwit tx from Liquid integration tests, txid/hash from Core decoderawtransaction // SegWit tx from Liquid integration tests, txid/hash from Core decoderawtransaction
let tx_bytes = hex!( let tx_bytes = hex!(
"01000000000102ff34f95a672bb6a4f6ff4a7e90fa8c7b3be7e70ffc39bc99be3bda67942e836c00000000\ "01000000000102ff34f95a672bb6a4f6ff4a7e90fa8c7b3be7e70ffc39bc99be3bda67942e836c00000000\
23220020cde476664d3fa347b8d54ef3aee33dcb686a65ced2b5207cbf4ec5eda6b9b46e4f414d4c934ad8\ 23220020cde476664d3fa347b8d54ef3aee33dcb686a65ced2b5207cbf4ec5eda6b9b46e4f414d4c934ad8\
@ -1460,7 +1460,7 @@ mod tests {
assert_eq!(format!("{:.10x}", tx.compute_txid()), "9652aa62b0"); assert_eq!(format!("{:.10x}", tx.compute_txid()), "9652aa62b0");
assert_eq!(tx.weight(), Weight::from_wu(2718)); assert_eq!(tx.weight(), Weight::from_wu(2718));
// non-segwit tx from my mempool // non-SegWit tx from my mempool
let tx_bytes = hex!( let tx_bytes = hex!(
"01000000010c7196428403d8b0c88fcb3ee8d64f56f55c8973c9ab7dd106bb4f3527f5888d000000006a47\ "01000000010c7196428403d8b0c88fcb3ee8d64f56f55c8973c9ab7dd106bb4f3527f5888d000000006a47\
30440220503a696f55f2c00eee2ac5e65b17767cd88ed04866b5637d3c1d5d996a70656d02202c9aff698f\ 30440220503a696f55f2c00eee2ac5e65b17767cd88ed04866b5637d3c1d5d996a70656d02202c9aff698f\
@ -1551,7 +1551,7 @@ mod tests {
use crate::consensus_validation::{TransactionExt as _, TxVerifyError}; use crate::consensus_validation::{TransactionExt as _, TxVerifyError};
use crate::witness::Witness; use crate::witness::Witness;
// a random recent segwit transaction from blockchain using both old and segwit inputs // a random recent SegWit transaction from blockchain using both old and SegWit inputs
let mut spending: Transaction = deserialize(hex!("020000000001031cfbc8f54fbfa4a33a30068841371f80dbfe166211242213188428f437445c91000000006a47304402206fbcec8d2d2e740d824d3d36cc345b37d9f65d665a99f5bd5c9e8d42270a03a8022013959632492332200c2908459547bf8dbf97c65ab1a28dec377d6f1d41d3d63e012103d7279dfb90ce17fe139ba60a7c41ddf605b25e1c07a4ddcb9dfef4e7d6710f48feffffff476222484f5e35b3f0e43f65fc76e21d8be7818dd6a989c160b1e5039b7835fc00000000171600140914414d3c94af70ac7e25407b0689e0baa10c77feffffffa83d954a62568bbc99cc644c62eb7383d7c2a2563041a0aeb891a6a4055895570000000017160014795d04cc2d4f31480d9a3710993fbd80d04301dffeffffff06fef72f000000000017a91476fd7035cd26f1a32a5ab979e056713aac25796887a5000f00000000001976a914b8332d502a529571c6af4be66399cd33379071c588ac3fda0500000000001976a914fc1d692f8de10ae33295f090bea5fe49527d975c88ac522e1b00000000001976a914808406b54d1044c429ac54c0e189b0d8061667e088ac6eb68501000000001976a914dfab6085f3a8fb3e6710206a5a959313c5618f4d88acbba20000000000001976a914eb3026552d7e3f3073457d0bee5d4757de48160d88ac0002483045022100bee24b63212939d33d513e767bc79300051f7a0d433c3fcf1e0e3bf03b9eb1d70220588dc45a9ce3a939103b4459ce47500b64e23ab118dfc03c9caa7d6bfc32b9c601210354fd80328da0f9ae6eef2b3a81f74f9a6f66761fadf96f1d1d22b1fd6845876402483045022100e29c7e3a5efc10da6269e5fc20b6a1cb8beb92130cc52c67e46ef40aaa5cac5f0220644dd1b049727d991aece98a105563416e10a5ac4221abac7d16931842d5c322012103960b87412d6e169f30e12106bdf70122aabb9eb61f455518322a18b920a4dfa887d30700") let mut spending: Transaction = deserialize(hex!("020000000001031cfbc8f54fbfa4a33a30068841371f80dbfe166211242213188428f437445c91000000006a47304402206fbcec8d2d2e740d824d3d36cc345b37d9f65d665a99f5bd5c9e8d42270a03a8022013959632492332200c2908459547bf8dbf97c65ab1a28dec377d6f1d41d3d63e012103d7279dfb90ce17fe139ba60a7c41ddf605b25e1c07a4ddcb9dfef4e7d6710f48feffffff476222484f5e35b3f0e43f65fc76e21d8be7818dd6a989c160b1e5039b7835fc00000000171600140914414d3c94af70ac7e25407b0689e0baa10c77feffffffa83d954a62568bbc99cc644c62eb7383d7c2a2563041a0aeb891a6a4055895570000000017160014795d04cc2d4f31480d9a3710993fbd80d04301dffeffffff06fef72f000000000017a91476fd7035cd26f1a32a5ab979e056713aac25796887a5000f00000000001976a914b8332d502a529571c6af4be66399cd33379071c588ac3fda0500000000001976a914fc1d692f8de10ae33295f090bea5fe49527d975c88ac522e1b00000000001976a914808406b54d1044c429ac54c0e189b0d8061667e088ac6eb68501000000001976a914dfab6085f3a8fb3e6710206a5a959313c5618f4d88acbba20000000000001976a914eb3026552d7e3f3073457d0bee5d4757de48160d88ac0002483045022100bee24b63212939d33d513e767bc79300051f7a0d433c3fcf1e0e3bf03b9eb1d70220588dc45a9ce3a939103b4459ce47500b64e23ab118dfc03c9caa7d6bfc32b9c601210354fd80328da0f9ae6eef2b3a81f74f9a6f66761fadf96f1d1d22b1fd6845876402483045022100e29c7e3a5efc10da6269e5fc20b6a1cb8beb92130cc52c67e46ef40aaa5cac5f0220644dd1b049727d991aece98a105563416e10a5ac4221abac7d16931842d5c322012103960b87412d6e169f30e12106bdf70122aabb9eb61f455518322a18b920a4dfa887d30700")
.as_slice()).unwrap(); .as_slice()).unwrap();
let spent1: Transaction = deserialize(hex!("020000000001040aacd2c49f5f3c0968cfa8caf9d5761436d95385252e3abb4de8f5dcf8a582f20000000017160014bcadb2baea98af0d9a902e53a7e9adff43b191e9feffffff96cd3c93cac3db114aafe753122bd7d1afa5aa4155ae04b3256344ecca69d72001000000171600141d9984579ceb5c67ebfbfb47124f056662fe7adbfeffffffc878dd74d3a44072eae6178bb94b9253177db1a5aaa6d068eb0e4db7631762e20000000017160014df2a48cdc53dae1aba7aa71cb1f9de089d75aac3feffffffe49f99275bc8363f5f593f4eec371c51f62c34ff11cc6d8d778787d340d6896c0100000017160014229b3b297a0587e03375ab4174ef56eeb0968735feffffff03360d0f00000000001976a9149f44b06f6ee92ddbc4686f71afe528c09727a5c788ac24281b00000000001976a9140277b4f68ff20307a2a9f9b4487a38b501eb955888ac227c0000000000001976a9148020cd422f55eef8747a9d418f5441030f7c9c7788ac0247304402204aa3bd9682f9a8e101505f6358aacd1749ecf53a62b8370b97d59243b3d6984f02200384ad449870b0e6e89c92505880411285ecd41cf11e7439b973f13bad97e53901210205b392ffcb83124b1c7ce6dd594688198ef600d34500a7f3552d67947bbe392802473044022033dfd8d190a4ae36b9f60999b217c775b96eb10dee3a1ff50fb6a75325719106022005872e4e36d194e49ced2ebcf8bb9d843d842e7b7e0eb042f4028396088d292f012103c9d7cbf369410b090480de2aa15c6c73d91b9ffa7d88b90724614b70be41e98e0247304402207d952de9e59e4684efed069797e3e2d993e9f98ec8a9ccd599de43005fe3f713022076d190cc93d9513fc061b1ba565afac574e02027c9efbfa1d7b71ab8dbb21e0501210313ad44bc030cc6cb111798c2bf3d2139418d751c1e79ec4e837ce360cc03b97a024730440220029e75edb5e9413eb98d684d62a077b17fa5b7cc19349c1e8cc6c4733b7b7452022048d4b9cae594f03741029ff841e35996ef233701c1ea9aa55c301362ea2e2f68012103590657108a72feb8dc1dec022cf6a230bb23dc7aaa52f4032384853b9f8388baf9d20700") let spent1: Transaction = deserialize(hex!("020000000001040aacd2c49f5f3c0968cfa8caf9d5761436d95385252e3abb4de8f5dcf8a582f20000000017160014bcadb2baea98af0d9a902e53a7e9adff43b191e9feffffff96cd3c93cac3db114aafe753122bd7d1afa5aa4155ae04b3256344ecca69d72001000000171600141d9984579ceb5c67ebfbfb47124f056662fe7adbfeffffffc878dd74d3a44072eae6178bb94b9253177db1a5aaa6d068eb0e4db7631762e20000000017160014df2a48cdc53dae1aba7aa71cb1f9de089d75aac3feffffffe49f99275bc8363f5f593f4eec371c51f62c34ff11cc6d8d778787d340d6896c0100000017160014229b3b297a0587e03375ab4174ef56eeb0968735feffffff03360d0f00000000001976a9149f44b06f6ee92ddbc4686f71afe528c09727a5c788ac24281b00000000001976a9140277b4f68ff20307a2a9f9b4487a38b501eb955888ac227c0000000000001976a9148020cd422f55eef8747a9d418f5441030f7c9c7788ac0247304402204aa3bd9682f9a8e101505f6358aacd1749ecf53a62b8370b97d59243b3d6984f02200384ad449870b0e6e89c92505880411285ecd41cf11e7439b973f13bad97e53901210205b392ffcb83124b1c7ce6dd594688198ef600d34500a7f3552d67947bbe392802473044022033dfd8d190a4ae36b9f60999b217c775b96eb10dee3a1ff50fb6a75325719106022005872e4e36d194e49ced2ebcf8bb9d843d842e7b7e0eb042f4028396088d292f012103c9d7cbf369410b090480de2aa15c6c73d91b9ffa7d88b90724614b70be41e98e0247304402207d952de9e59e4684efed069797e3e2d993e9f98ec8a9ccd599de43005fe3f713022076d190cc93d9513fc061b1ba565afac574e02027c9efbfa1d7b71ab8dbb21e0501210313ad44bc030cc6cb111798c2bf3d2139418d751c1e79ec4e837ce360cc03b97a024730440220029e75edb5e9413eb98d684d62a077b17fa5b7cc19349c1e8cc6c4733b7b7452022048d4b9cae594f03741029ff841e35996ef233701c1ea9aa55c301362ea2e2f68012103590657108a72feb8dc1dec022cf6a230bb23dc7aaa52f4032384853b9f8388baf9d20700")
@ -1693,15 +1693,15 @@ mod tests {
fn txin_txout_weight() { fn txin_txout_weight() {
// [(is_segwit, tx_hex, expected_weight)] // [(is_segwit, tx_hex, expected_weight)]
let txs = [ let txs = [
// one segwit input (P2WPKH) // one SegWit input (P2WPKH)
(true, "020000000001018a763b78d3e17acea0625bf9e52b0dc1beb2241b2502185348ba8ff4a253176e0100000000ffffffff0280d725000000000017a914c07ed639bd46bf7087f2ae1dfde63b815a5f8b488767fda20300000000160014869ec8520fa2801c8a01bfdd2e82b19833cd0daf02473044022016243edad96b18c78b545325aaff80131689f681079fb107a67018cb7fb7830e02205520dae761d89728f73f1a7182157f6b5aecf653525855adb7ccb998c8e6143b012103b9489bde92afbcfa85129a82ffa512897105d1a27ad9806bded27e0532fc84e700000000", Weight::from_wu(565)), (true, "020000000001018a763b78d3e17acea0625bf9e52b0dc1beb2241b2502185348ba8ff4a253176e0100000000ffffffff0280d725000000000017a914c07ed639bd46bf7087f2ae1dfde63b815a5f8b488767fda20300000000160014869ec8520fa2801c8a01bfdd2e82b19833cd0daf02473044022016243edad96b18c78b545325aaff80131689f681079fb107a67018cb7fb7830e02205520dae761d89728f73f1a7182157f6b5aecf653525855adb7ccb998c8e6143b012103b9489bde92afbcfa85129a82ffa512897105d1a27ad9806bded27e0532fc84e700000000", Weight::from_wu(565)),
// one segwit input (P2WSH) // one SegWit input (P2WSH)
(true, "01000000000101a3ccad197118a2d4975fadc47b90eacfdeaf8268adfdf10ed3b4c3b7e1ad14530300000000ffffffff0200cc5501000000001976a91428ec6f21f4727bff84bb844e9697366feeb69f4d88aca2a5100d00000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220548f11130353b3a8f943d2f14260345fc7c20bde91704c9f1cbb5456355078cd0220383ed4ed39b079b618bcb279bbc1f2ca18cb028c4641cb522c9c5868c52a0dc20147304402203c332ecccb3181ca82c0600520ee51fee80d3b4a6ab110945e59475ec71e44ac0220679a11f3ca9993b04ccebda3c834876f353b065bb08f50076b25f5bb93c72ae1016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000", Weight::from_wu(766)), (true, "01000000000101a3ccad197118a2d4975fadc47b90eacfdeaf8268adfdf10ed3b4c3b7e1ad14530300000000ffffffff0200cc5501000000001976a91428ec6f21f4727bff84bb844e9697366feeb69f4d88aca2a5100d00000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220548f11130353b3a8f943d2f14260345fc7c20bde91704c9f1cbb5456355078cd0220383ed4ed39b079b618bcb279bbc1f2ca18cb028c4641cb522c9c5868c52a0dc20147304402203c332ecccb3181ca82c0600520ee51fee80d3b4a6ab110945e59475ec71e44ac0220679a11f3ca9993b04ccebda3c834876f353b065bb08f50076b25f5bb93c72ae1016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000", Weight::from_wu(766)),
// one segwit input (P2WPKH) and two legacy inputs (P2PKH) // one SegWit input (P2WPKH) and two legacy inputs (P2PKH)
(true, "010000000001036b6b6ac7e34e97c53c1cc74c99c7948af2e6aac75d8778004ae458d813456764000000006a473044022001deec7d9075109306320b3754188f81a8236d0d232b44bc69f8309115638b8f02204e17a5194a519cf994d0afeea1268740bdc10616b031a521113681cc415e815c012103488d3272a9fad78ee887f0684cb8ebcfc06d0945e1401d002e590c7338b163feffffffffc75bd7aa6424aee972789ec28ba181254ee6d8311b058d165bd045154d7660b0000000006b483045022100c8641bcbee3e4c47a00417875015d8c5d5ea918fb7e96f18c6ffe51bc555b401022074e2c46f5b1109cd79e39a9aa203eadd1d75356415e51d80928a5fb5feb0efee0121033504b4c6dfc3a5daaf7c425aead4c2dbbe4e7387ce8e6be2648805939ecf7054ffffffff494df3b205cd9430a26f8e8c0dc0bb80496fbc555a524d6ea307724bc7e60eee0100000000ffffffff026d861500000000001976a9145c54ed1360072ebaf56e87693b88482d2c6a101588ace407000000000000160014761e31e2629c6e11936f2f9888179d60a5d4c1f900000247304402201fa38a67a63e58b67b6cfffd02f59121ca1c8a1b22e1efe2573ae7e4b4f06c2b022002b9b431b58f6e36b3334fb14eaecee7d2f06967a77ef50d8d5f90dda1057f0c01210257dc6ce3b1100903306f518ee8fa113d778e403f118c080b50ce079fba40e09a00000000", Weight::from_wu(1755)), (true, "010000000001036b6b6ac7e34e97c53c1cc74c99c7948af2e6aac75d8778004ae458d813456764000000006a473044022001deec7d9075109306320b3754188f81a8236d0d232b44bc69f8309115638b8f02204e17a5194a519cf994d0afeea1268740bdc10616b031a521113681cc415e815c012103488d3272a9fad78ee887f0684cb8ebcfc06d0945e1401d002e590c7338b163feffffffffc75bd7aa6424aee972789ec28ba181254ee6d8311b058d165bd045154d7660b0000000006b483045022100c8641bcbee3e4c47a00417875015d8c5d5ea918fb7e96f18c6ffe51bc555b401022074e2c46f5b1109cd79e39a9aa203eadd1d75356415e51d80928a5fb5feb0efee0121033504b4c6dfc3a5daaf7c425aead4c2dbbe4e7387ce8e6be2648805939ecf7054ffffffff494df3b205cd9430a26f8e8c0dc0bb80496fbc555a524d6ea307724bc7e60eee0100000000ffffffff026d861500000000001976a9145c54ed1360072ebaf56e87693b88482d2c6a101588ace407000000000000160014761e31e2629c6e11936f2f9888179d60a5d4c1f900000247304402201fa38a67a63e58b67b6cfffd02f59121ca1c8a1b22e1efe2573ae7e4b4f06c2b022002b9b431b58f6e36b3334fb14eaecee7d2f06967a77ef50d8d5f90dda1057f0c01210257dc6ce3b1100903306f518ee8fa113d778e403f118c080b50ce079fba40e09a00000000", Weight::from_wu(1755)),
// three legacy inputs (P2PKH) // three legacy inputs (P2PKH)
(false, "0100000003e4d7be4314204a239d8e00691128dca7927e19a7339c7948bde56f669d27d797010000006b483045022100b988a858e2982e2daaf0755b37ad46775d6132057934877a5badc91dee2f66ff022020b967c1a2f0916007662ec609987e951baafa6d4fda23faaad70715611d6a2501210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff9e22eb1b3f24c260187d716a8a6c2a7efb5af14a30a4792a6eeac3643172379c000000006a47304402207df07f0cd30dca2cf7bed7686fa78d8a37fe9c2254dfdca2befed54e06b779790220684417b8ff9f0f6b480546a9e90ecee86a625b3ea1e4ca29b080da6bd6c5f67e01210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff1123df3bfb503b59769731da103d4371bc029f57979ebce68067768b958091a1000000006a47304402207a016023c2b0c4db9a7d4f9232fcec2193c2f119a69125ad5bcedcba56dd525e02206a734b3a321286c896759ac98ebfd9d808df47f1ce1fbfbe949891cc3134294701210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff0200c2eb0b000000001976a914e5eb3e05efad136b1405f5c2f9adb14e15a35bb488ac88cfff1b000000001976a9144846db516db3130b7a3c92253599edec6bc9630b88ac00000000", Weight::from_wu(2080)), (false, "0100000003e4d7be4314204a239d8e00691128dca7927e19a7339c7948bde56f669d27d797010000006b483045022100b988a858e2982e2daaf0755b37ad46775d6132057934877a5badc91dee2f66ff022020b967c1a2f0916007662ec609987e951baafa6d4fda23faaad70715611d6a2501210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff9e22eb1b3f24c260187d716a8a6c2a7efb5af14a30a4792a6eeac3643172379c000000006a47304402207df07f0cd30dca2cf7bed7686fa78d8a37fe9c2254dfdca2befed54e06b779790220684417b8ff9f0f6b480546a9e90ecee86a625b3ea1e4ca29b080da6bd6c5f67e01210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff1123df3bfb503b59769731da103d4371bc029f57979ebce68067768b958091a1000000006a47304402207a016023c2b0c4db9a7d4f9232fcec2193c2f119a69125ad5bcedcba56dd525e02206a734b3a321286c896759ac98ebfd9d808df47f1ce1fbfbe949891cc3134294701210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff0200c2eb0b000000001976a914e5eb3e05efad136b1405f5c2f9adb14e15a35bb488ac88cfff1b000000001976a9144846db516db3130b7a3c92253599edec6bc9630b88ac00000000", Weight::from_wu(2080)),
// one segwit input (P2TR) // one SegWit input (P2TR)
(true, "01000000000101b5cee87f1a60915c38bb0bc26aaf2b67be2b890bbc54bb4be1e40272e0d2fe0b0000000000ffffffff025529000000000000225120106daad8a5cb2e6fc74783714273bad554a148ca2d054e7a19250e9935366f3033760000000000002200205e6d83c44f57484fd2ef2a62b6d36cdcd6b3e06b661e33fd65588a28ad0dbe060141df9d1bfce71f90d68bf9e9461910b3716466bfe035c7dbabaa7791383af6c7ef405a3a1f481488a91d33cd90b098d13cb904323a3e215523aceaa04e1bb35cdb0100000000", Weight::from_wu(617)), (true, "01000000000101b5cee87f1a60915c38bb0bc26aaf2b67be2b890bbc54bb4be1e40272e0d2fe0b0000000000ffffffff025529000000000000225120106daad8a5cb2e6fc74783714273bad554a148ca2d054e7a19250e9935366f3033760000000000002200205e6d83c44f57484fd2ef2a62b6d36cdcd6b3e06b661e33fd65588a28ad0dbe060141df9d1bfce71f90d68bf9e9461910b3716466bfe035c7dbabaa7791383af6c7ef405a3a1f481488a91d33cd90b098d13cb904323a3e215523aceaa04e1bb35cdb0100000000", Weight::from_wu(617)),
// one legacy input (P2PKH) // one legacy input (P2PKH)
(false, "0100000001c336895d9fa674f8b1e294fd006b1ac8266939161600e04788c515089991b50a030000006a47304402204213769e823984b31dcb7104f2c99279e74249eacd4246dabcf2575f85b365aa02200c3ee89c84344ae326b637101a92448664a8d39a009c8ad5d147c752cbe112970121028b1b44b4903c9103c07d5a23e3c7cf7aeb0ba45ddbd2cfdce469ab197381f195fdffffff040000000000000000536a4c5058325bb7b7251cf9e36cac35d691bd37431eeea426d42cbdecca4db20794f9a4030e6cb5211fabf887642bcad98c9994430facb712da8ae5e12c9ae5ff314127d33665000bb26c0067000bb0bf00322a50c300000000000017a9145ca04fdc0a6d2f4e3f67cfeb97e438bb6287725f8750c30000000000001976a91423086a767de0143523e818d4273ddfe6d9e4bbcc88acc8465003000000001976a914c95cbacc416f757c65c942f9b6b8a20038b9b12988ac00000000", Weight::from_wu(1396)), (false, "0100000001c336895d9fa674f8b1e294fd006b1ac8266939161600e04788c515089991b50a030000006a47304402204213769e823984b31dcb7104f2c99279e74249eacd4246dabcf2575f85b365aa02200c3ee89c84344ae326b637101a92448664a8d39a009c8ad5d147c752cbe112970121028b1b44b4903c9103c07d5a23e3c7cf7aeb0ba45ddbd2cfdce469ab197381f195fdffffff040000000000000000536a4c5058325bb7b7251cf9e36cac35d691bd37431eeea426d42cbdecca4db20794f9a4030e6cb5211fabf887642bcad98c9994430facb712da8ae5e12c9ae5ff314127d33665000bb26c0067000bb0bf00322a50c300000000000017a9145ca04fdc0a6d2f4e3f67cfeb97e438bb6287725f8750c30000000000001976a91423086a767de0143523e818d4273ddfe6d9e4bbcc88acc8465003000000001976a914c95cbacc416f757c65c942f9b6b8a20038b9b12988ac00000000", Weight::from_wu(1396)),
@ -1724,7 +1724,7 @@ mod tests {
+ tx.input.iter().fold(Weight::ZERO, |sum, i| sum + txin_weight(i)) + tx.input.iter().fold(Weight::ZERO, |sum, i| sum + txin_weight(i))
+ tx.output.iter().fold(Weight::ZERO, |sum, o| sum + o.weight()); + tx.output.iter().fold(Weight::ZERO, |sum, o| sum + o.weight());
// The empty tx uses segwit serialization but a legacy tx does not. // The empty tx uses SegWit serialization but a legacy tx does not.
if !tx.uses_segwit_serialization() { if !tx.uses_segwit_serialization() {
calculated_weight -= Weight::from_wu(2); calculated_weight -= Weight::from_wu(2);
} }

View File

@ -165,7 +165,7 @@ pub enum ParseError {
NonMinimalVarInt, NonMinimalVarInt,
/// Parsing error. /// Parsing error.
ParseFailed(&'static str), ParseFailed(&'static str),
/// Unsupported Segwit flag. /// Unsupported SegWit flag.
UnsupportedSegwitFlag(u8), UnsupportedSegwitFlag(u8),
} }
@ -184,7 +184,7 @@ impl fmt::Display for ParseError {
NonMinimalVarInt => write!(f, "non-minimal varint"), NonMinimalVarInt => write!(f, "non-minimal varint"),
ParseFailed(ref s) => write!(f, "parse failed: {}", s), ParseFailed(ref s) => write!(f, "parse failed: {}", s),
UnsupportedSegwitFlag(ref swflag) => UnsupportedSegwitFlag(ref swflag) =>
write!(f, "unsupported segwit version: {}", swflag), write!(f, "unsupported SegWit version: {}", swflag),
} }
} }
} }

View File

@ -1093,14 +1093,14 @@ impl From<hex::HexToArrayError> for ParseCompressedPublicKeyError {
fn from(e: hex::HexToArrayError) -> Self { Self::Hex(e) } fn from(e: hex::HexToArrayError) -> Self { Self::Hex(e) }
} }
/// Segwit public keys must always be compressed. /// SegWit public keys must always be compressed.
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive] #[non_exhaustive]
pub struct UncompressedPublicKeyError; pub struct UncompressedPublicKeyError;
impl fmt::Display for UncompressedPublicKeyError { impl fmt::Display for UncompressedPublicKeyError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("segwit public keys must always be compressed") f.write_str("SegWit public keys must always be compressed")
} }
} }

View File

@ -51,7 +51,7 @@ hash_newtype! {
#[hash_newtype(forward)] #[hash_newtype(forward)]
pub struct LegacySighash(sha256d::Hash); pub struct LegacySighash(sha256d::Hash);
/// Hash of a transaction according to the segwit version 0 signature algorithm. /// Hash of a transaction according to the SegWit version 0 signature algorithm.
#[hash_newtype(forward)] #[hash_newtype(forward)]
pub struct SegwitV0Sighash(sha256d::Hash); pub struct SegwitV0Sighash(sha256d::Hash);
} }
@ -92,7 +92,7 @@ hashes::impl_serde_for_newtype!(TapSighash);
impl_message_from_hash!(TapSighash); impl_message_from_hash!(TapSighash);
/// Efficiently calculates signature hash message for legacy, segwit and Taproot inputs. /// Efficiently calculates signature hash message for legacy, SegWit and Taproot inputs.
#[derive(Debug)] #[derive(Debug)]
pub struct SighashCache<T: Borrow<Transaction>> { pub struct SighashCache<T: Borrow<Transaction>> {
/// Access to transaction required for transaction introspection. Moreover, type /// Access to transaction required for transaction introspection. Moreover, type
@ -100,17 +100,17 @@ pub struct SighashCache<T: Borrow<Transaction>> {
/// the latter in particular is necessary for [`SighashCache::witness_mut`]. /// the latter in particular is necessary for [`SighashCache::witness_mut`].
tx: T, tx: T,
/// Common cache for Taproot and segwit inputs, `None` for legacy inputs. /// Common cache for Taproot and SegWit inputs, `None` for legacy inputs.
common_cache: Option<CommonCache>, common_cache: Option<CommonCache>,
/// Cache for segwit v0 inputs (the result of another round of sha256 on `common_cache`). /// Cache for SegWit v0 inputs (the result of another round of sha256 on `common_cache`).
segwit_cache: Option<SegwitCache>, segwit_cache: Option<SegwitCache>,
/// Cache for Taproot v1 inputs. /// Cache for Taproot v1 inputs.
taproot_cache: Option<TaprootCache>, taproot_cache: Option<TaprootCache>,
} }
/// Common values cached between segwit and Taproot inputs. /// Common values cached between SegWit and Taproot inputs.
#[derive(Debug)] #[derive(Debug)]
struct CommonCache { struct CommonCache {
prevouts: sha256::Hash, prevouts: sha256::Hash,
@ -121,7 +121,7 @@ struct CommonCache {
outputs: sha256::Hash, outputs: sha256::Hash,
} }
/// Values cached for segwit inputs, equivalent to [`CommonCache`] plus another round of `sha256`. /// Values cached for SegWit inputs, equivalent to [`CommonCache`] plus another round of `sha256`.
#[derive(Debug)] #[derive(Debug)]
struct SegwitCache { struct SegwitCache {
prevouts: sha256d::Hash, prevouts: sha256d::Hash,
@ -859,8 +859,8 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
/// Computes the BIP143 sighash to spend a p2wpkh transaction for any flag type. /// Computes the BIP143 sighash to spend a p2wpkh transaction for any flag type.
/// ///
/// `script_pubkey` is the `scriptPubkey` (native segwit) of the spend transaction /// `script_pubkey` is the `scriptPubkey` (native SegWit) of the spend transaction
/// ([`TxOut::script_pubkey`]) or the `redeemScript` (wrapped segwit). /// ([`TxOut::script_pubkey`]) or the `redeemScript` (wrapped SegWit).
pub fn p2wpkh_signature_hash( pub fn p2wpkh_signature_hash(
&mut self, &mut self,
input_index: usize, input_index: usize,
@ -1150,9 +1150,9 @@ impl<R: BorrowMut<Transaction>> SighashCache<R> {
/// *sighasher.witness_mut(input_index).unwrap() = Witness::p2wpkh(&signature, &pk); /// *sighasher.witness_mut(input_index).unwrap() = Witness::p2wpkh(&signature, &pk);
/// ``` /// ```
/// ///
/// For full signing code see the [`segwit v0`] and [`taproot`] signing examples. /// For full signing code see the [`SegWit v0`] and [`taproot`] signing examples.
/// ///
/// [`segwit v0`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-segwit-v0.rs> /// [`SegWit v0`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-segwit-v0.rs>
/// [`taproot`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-taproot.rs> /// [`taproot`]: <https://github.com/rust-bitcoin/rust-bitcoin/blob/master/bitcoin/examples/sign-tx-taproot.rs>
pub fn witness_mut(&mut self, input_index: usize) -> Option<&mut Witness> { pub fn witness_mut(&mut self, input_index: usize) -> Option<&mut Witness> {
self.tx.borrow_mut().input.get_mut(input_index).map(|i| &mut i.witness) self.tx.borrow_mut().input.get_mut(input_index).map(|i| &mut i.witness)
@ -1273,7 +1273,7 @@ impl fmt::Display for P2wpkhError {
use P2wpkhError::*; use P2wpkhError::*;
match *self { match *self {
Sighash(ref e) => write_err!(f, "error encoding segwit v0 signing data"; e), Sighash(ref e) => write_err!(f, "error encoding SegWit v0 signing data"; e),
NotP2wpkhScript => write!(f, "script is not a script pubkey for a p2wpkh output"), NotP2wpkhScript => write!(f, "script is not a script pubkey for a p2wpkh output"),
} }
} }

View File

@ -18,7 +18,7 @@ use super::constants::{MAX_BLOCK_SIGOPS_COST, WITNESS_SCALE_FACTOR};
/// Maximum weight of a transaction for it to be relayed by most nodes on the network /// Maximum weight of a transaction for it to be relayed by most nodes on the network
pub const MAX_STANDARD_TX_WEIGHT: u32 = 400_000; pub const MAX_STANDARD_TX_WEIGHT: u32 = 400_000;
/// Minimum non-witness size for a standard transaction (1 segwit input + 1 P2WPKH output = 82 bytes) /// Minimum non-witness size for a standard transaction (1 SegWit input + 1 P2WPKH output = 82 bytes)
pub const MIN_STANDARD_TX_NONWITNESS_SIZE: u32 = 82; pub const MIN_STANDARD_TX_NONWITNESS_SIZE: u32 = 82;
/// Maximum number of sigops in a standard tx. /// Maximum number of sigops in a standard tx.

View File

@ -69,11 +69,11 @@ const PSBT_IN_PROPRIETARY: u64 = 0xFC;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Input { pub struct Input {
/// The non-witness transaction this input spends from. Should only be /// The non-witness transaction this input spends from. Should only be
/// `Option::Some` for inputs which spend non-segwit outputs or /// `Option::Some` for inputs which spend non-SegWit outputs or
/// if it is unknown whether an input spends a segwit output. /// if it is unknown whether an input spends a SegWit output.
pub non_witness_utxo: Option<Transaction>, pub non_witness_utxo: Option<Transaction>,
/// The transaction output this input spends from. Should only be /// The transaction output this input spends from. Should only be
/// `Option::Some` for inputs which spend segwit outputs, /// `Option::Some` for inputs which spend SegWit outputs,
/// including P2SH embedded ones. /// including P2SH embedded ones.
pub witness_utxo: Option<TxOut>, pub witness_utxo: Option<TxOut>,
/// A map from public keys to their corresponding signature as would be /// A map from public keys to their corresponding signature as would be

View File

@ -669,7 +669,7 @@ impl Psbt {
let utxo = self.spend_utxo(input_index)?; let utxo = self.spend_utxo(input_index)?;
let spk = utxo.script_pubkey.clone(); let spk = utxo.script_pubkey.clone();
// Anything that is not segwit and is not p2sh is `Bare`. // Anything that is not SegWit and is not p2sh is `Bare`.
if !(spk.is_witness_program() || spk.is_p2sh()) { if !(spk.is_witness_program() || spk.is_p2sh()) {
return Ok(OutputType::Bare); return Ok(OutputType::Bare);
} }
@ -897,11 +897,11 @@ pub enum OutputType {
Wpkh, Wpkh,
/// A pay-to-witness-script-hash output (P2WSH). /// A pay-to-witness-script-hash output (P2WSH).
Wsh, Wsh,
/// A nested segwit output, pay-to-witness-pubkey-hash nested in a pay-to-script-hash. /// A nested SegWit output, pay-to-witness-pubkey-hash nested in a pay-to-script-hash.
ShWpkh, ShWpkh,
/// A nested segwit output, pay-to-witness-script-hash nested in a pay-to-script-hash. /// A nested SegWit output, pay-to-witness-script-hash nested in a pay-to-script-hash.
ShWsh, ShWsh,
/// A pay-to-script-hash output excluding wrapped segwit (P2SH). /// A pay-to-script-hash output excluding wrapped SegWit (P2SH).
Sh, Sh,
/// A Taproot output (P2TR). /// A Taproot output (P2TR).
Tr, Tr,
@ -954,7 +954,7 @@ pub enum SignError {
NotEcdsa, NotEcdsa,
/// The `scriptPubkey` is not a P2WPKH script. /// The `scriptPubkey` is not a P2WPKH script.
NotWpkh, NotWpkh,
/// Sighash computation error (segwit v0 input). /// Sighash computation error (SegWit v0 input).
SegwitV0Sighash(transaction::InputsIndexError), SegwitV0Sighash(transaction::InputsIndexError),
/// Sighash computation error (p2wpkh input). /// Sighash computation error (p2wpkh input).
P2wpkhSighash(sighash::P2wpkhError), P2wpkhSighash(sighash::P2wpkhError),
@ -986,7 +986,7 @@ impl fmt::Display for SignError {
MismatchedAlgoKey => write!(f, "signing algorithm and key type does not match"), MismatchedAlgoKey => write!(f, "signing algorithm and key type does not match"),
NotEcdsa => write!(f, "attempted to ECDSA sign an non-ECDSA input"), NotEcdsa => write!(f, "attempted to ECDSA sign an non-ECDSA input"),
NotWpkh => write!(f, "the scriptPubkey is not a P2WPKH script"), NotWpkh => write!(f, "the scriptPubkey is not a P2WPKH script"),
SegwitV0Sighash(ref e) => write_err!(f, "segwit v0 sighash"; e), SegwitV0Sighash(ref e) => write_err!(f, "SegWit v0 sighash"; e),
P2wpkhSighash(ref e) => write_err!(f, "p2wpkh sighash"; e), P2wpkhSighash(ref e) => write_err!(f, "p2wpkh sighash"; e),
TaprootError(ref e) => write_err!(f, "Taproot sighash"; e), TaprootError(ref e) => write_err!(f, "Taproot sighash"; e),
UnknownOutputType => write!(f, "unable to determine the output type"), UnknownOutputType => write!(f, "unable to determine the output type"),

View File

@ -16,7 +16,7 @@ fn do_test(data: &[u8]) {
} }
let no_witness_len = bitcoin::consensus::encode::serialize(&tx).len(); let no_witness_len = bitcoin::consensus::encode::serialize(&tx).len();
// For 0-input transactions, `no_witness_len` will be incorrect because // For 0-input transactions, `no_witness_len` will be incorrect because
// we serialize as segwit even after "stripping the witnesses". We need // we serialize as SegWit even after "stripping the witnesses". We need
// to drop two bytes (i.e. eight weight). Similarly, calculated_weight is // to drop two bytes (i.e. eight weight). Similarly, calculated_weight is
// incorrect and needs 2 wu removing for the marker/flag bytes. // incorrect and needs 2 wu removing for the marker/flag bytes.
if tx.input.is_empty() { if tx.input.is_empty() {

View File

@ -48,7 +48,7 @@ use crate::witness::Witness;
/// ### Serialization notes /// ### Serialization notes
/// ///
/// If any inputs have nonempty witnesses, the entire transaction is serialized /// If any inputs have nonempty witnesses, the entire transaction is serialized
/// in the post-BIP141 Segwit format which includes a list of witnesses. If all /// in the post-BIP141 SegWit format which includes a list of witnesses. If all
/// inputs have empty witnesses, the transaction is serialized in the pre-BIP141 /// inputs have empty witnesses, the transaction is serialized in the pre-BIP141
/// format. /// format.
/// ///
@ -58,22 +58,22 @@ use crate::witness::Witness;
/// uses BIP141. (Ordinarily there is no conflict, since in PSBT transactions /// uses BIP141. (Ordinarily there is no conflict, since in PSBT transactions
/// are always unsigned and therefore their inputs have empty witnesses.) /// are always unsigned and therefore their inputs have empty witnesses.)
/// ///
/// The specific ambiguity is that Segwit uses the flag bytes `0001` where an old /// The specific ambiguity is that SegWit uses the flag bytes `0001` where an old
/// serializer would read the number of transaction inputs. The old serializer /// serializer would read the number of transaction inputs. The old serializer
/// would interpret this as "no inputs, one output", which means the transaction /// would interpret this as "no inputs, one output", which means the transaction
/// is invalid, and simply reject it. Segwit further specifies that this encoding /// is invalid, and simply reject it. SegWit further specifies that this encoding
/// should *only* be used when some input has a nonempty witness; that is, /// should *only* be used when some input has a nonempty witness; that is,
/// witness-less transactions should be encoded in the traditional format. /// witness-less transactions should be encoded in the traditional format.
/// ///
/// However, in protocols where transactions may legitimately have 0 inputs, e.g. /// However, in protocols where transactions may legitimately have 0 inputs, e.g.
/// when parties are cooperatively funding a transaction, the "00 means Segwit" /// when parties are cooperatively funding a transaction, the "00 means SegWit"
/// heuristic does not work. Since Segwit requires such a transaction be encoded /// heuristic does not work. Since SegWit requires such a transaction be encoded
/// in the original transaction format (since it has no inputs and therefore /// in the original transaction format (since it has no inputs and therefore
/// no input witnesses), a traditionally encoded transaction may have the `0001` /// no input witnesses), a traditionally encoded transaction may have the `0001`
/// Segwit flag in it, which confuses most Segwit parsers including the one in /// SegWit flag in it, which confuses most SegWit parsers including the one in
/// Bitcoin Core. /// Bitcoin Core.
/// ///
/// We therefore deviate from the spec by always using the Segwit witness encoding /// We therefore deviate from the spec by always using the SegWit witness encoding
/// for 0-input transactions, which results in unambiguously parseable transactions. /// for 0-input transactions, which results in unambiguously parseable transactions.
/// ///
/// ### A note on ordering /// ### A note on ordering
@ -150,8 +150,8 @@ impl Transaction {
/// Computes the [`Txid`]. /// Computes the [`Txid`].
/// ///
/// Hashes the transaction **excluding** the segwit data (i.e. the marker, flag bytes, and the /// Hashes the transaction **excluding** the SegWit data (i.e. the marker, flag bytes, and the
/// witness fields themselves). For non-segwit transactions which do not have any segwit data, /// witness fields themselves). For non-SegWit transactions which do not have any SegWit data,
/// this will be equal to [`Transaction::compute_wtxid()`]. /// this will be equal to [`Transaction::compute_wtxid()`].
#[doc(alias = "txid")] #[doc(alias = "txid")]
pub fn compute_txid(&self) -> Txid { pub fn compute_txid(&self) -> Txid {
@ -159,10 +159,10 @@ impl Transaction {
Txid::from_byte_array(hash.to_byte_array()) Txid::from_byte_array(hash.to_byte_array())
} }
/// Computes the segwit version of the transaction id. /// Computes the SegWit version of the transaction id.
/// ///
/// Hashes the transaction **including** all segwit data (i.e. the marker, flag bytes, and the /// Hashes the transaction **including** all SegWit data (i.e. the marker, flag bytes, and the
/// witness fields themselves). For non-segwit transactions which do not have any segwit data, /// witness fields themselves). For non-SegWit transactions which do not have any SegWit data,
/// this will be equal to [`Transaction::compute_txid()`]. /// this will be equal to [`Transaction::compute_txid()`].
#[doc(alias = "wtxid")] #[doc(alias = "wtxid")]
pub fn compute_wtxid(&self) -> Wtxid { pub fn compute_wtxid(&self) -> Wtxid {
@ -235,7 +235,7 @@ fn hash_transaction(tx: &Transaction, uses_segwit_serialization: bool) -> sha256
enc.input(&tx.version.0.to_le_bytes()); // Same as `encode::emit_i32`. enc.input(&tx.version.0.to_le_bytes()); // Same as `encode::emit_i32`.
if uses_segwit_serialization { if uses_segwit_serialization {
// BIP-141 (segwit) transaction serialization also includes marker and flag. // BIP-141 (SegWit) transaction serialization also includes marker and flag.
enc.input(&[SEGWIT_MARKER]); enc.input(&[SEGWIT_MARKER]);
enc.input(&[SEGWIT_FLAG]); enc.input(&[SEGWIT_FLAG]);
} }
@ -268,7 +268,7 @@ fn hash_transaction(tx: &Transaction, uses_segwit_serialization: bool) -> sha256
} }
if uses_segwit_serialization { if uses_segwit_serialization {
// BIP-141 (segwit) transaction serialization also includes the witness data. // BIP-141 (SegWit) transaction serialization also includes the witness data.
for input in &tx.input { for input in &tx.input {
// Same as `Encodable for Witness`. // Same as `Encodable for Witness`.
enc.input(compact_size::encode(input.witness.len()).as_slice()); enc.input(compact_size::encode(input.witness.len()).as_slice());

View File

@ -13,7 +13,7 @@ use internals::compact_size;
use crate::prelude::Vec; use crate::prelude::Vec;
/// The Witness is the data used to unlock bitcoin since the [segwit upgrade]. /// The Witness is the data used to unlock bitcoin since the [SegWit upgrade].
/// ///
/// Can be logically seen as an array of bytestrings, i.e. `Vec<Vec<u8>>`, and it is serialized on the wire /// Can be logically seen as an array of bytestrings, i.e. `Vec<Vec<u8>>`, and it is serialized on the wire
/// in that format. You can convert between this type and `Vec<Vec<u8>>` by using [`Witness::from_slice`] /// in that format. You can convert between this type and `Vec<Vec<u8>>` by using [`Witness::from_slice`]
@ -22,7 +22,7 @@ use crate::prelude::Vec;
/// 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.
/// ///
/// [segwit upgrade]: <https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki> /// [SegWit upgrade]: <https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki>
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Witness { pub struct Witness {
/// Contains the witness `Vec<Vec<u8>>` serialization. /// Contains the witness `Vec<Vec<u8>>` serialization.