73 lines
2.8 KiB
Rust
73 lines
2.8 KiB
Rust
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
//! Bitcoin transactions.
|
|
//!
|
|
//! A transaction describes a transfer of money. It consumes previously-unspent
|
|
//! transaction outputs and produces new ones, satisfying the condition to spend
|
|
//! the old outputs (typically a digital signature with a specific key must be
|
|
//! provided) and defining the condition to spend the new ones. The use of digital
|
|
//! signatures ensures that coins cannot be spent by unauthorized parties.
|
|
//!
|
|
//! This module provides the structures and functions needed to support transactions.
|
|
|
|
use core::fmt;
|
|
|
|
use hashes::sha256d;
|
|
|
|
hashes::hash_newtype! {
|
|
/// A bitcoin transaction hash/transaction ID.
|
|
///
|
|
/// For compatibility with the existing Bitcoin infrastructure and historical and current
|
|
/// versions of the Bitcoin Core software itself, this and other [`sha256d::Hash`] types, are
|
|
/// serialized in reverse byte order when converted to a hex string via [`std::fmt::Display`]
|
|
/// trait operations.
|
|
///
|
|
/// See [`hashes::Hash::DISPLAY_BACKWARD`] for more details.
|
|
pub struct Txid(sha256d::Hash);
|
|
|
|
/// A bitcoin witness transaction ID.
|
|
pub struct Wtxid(sha256d::Hash);
|
|
}
|
|
|
|
impl Txid {
|
|
/// The `Txid` used in a coinbase prevout.
|
|
///
|
|
/// This is used as the "txid" of the dummy input of a coinbase transaction. This is not a real
|
|
/// TXID and should not be used in any other contexts. See `OutPoint::COINBASE_PREVOUT`.
|
|
pub const COINBASE_PREVOUT: Self = Self::from_byte_array([0; 32]);
|
|
}
|
|
|
|
impl Wtxid {
|
|
/// The `Wtxid` of a coinbase transaction.
|
|
///
|
|
/// This is used as the wTXID for the coinbase transaction when constructing blocks (in the
|
|
/// witness commitment tree) since the coinbase transaction contains a commitment to all
|
|
/// transactions' wTXIDs but naturally cannot commit to its own.
|
|
pub const COINBASE: Self = Self::from_byte_array([0; 32]);
|
|
}
|
|
|
|
/// The transaction version.
|
|
///
|
|
/// Currently, as specified by [BIP-68], only version 1 and 2 are considered standard.
|
|
///
|
|
/// Standardness of the inner `i32` is not an invariant because you are free to create transactions
|
|
/// of any version, transactions with non-standard version numbers will not be relayed by the
|
|
/// Bitcoin network.
|
|
///
|
|
/// [BIP-68]: https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki
|
|
#[derive(Copy, PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)]
|
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
|
pub struct Version(pub i32);
|
|
|
|
impl Version {
|
|
/// The original Bitcoin transaction version (pre-BIP-68).
|
|
pub const ONE: Self = Self(1);
|
|
|
|
/// The second Bitcoin transaction version (post-BIP-68).
|
|
pub const TWO: Self = Self(2);
|
|
}
|
|
|
|
impl fmt::Display for Version {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) }
|
|
}
|