pub struct Witness { /* private fields */ }Expand description
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
in that format. You can convert between this type and Vec<Vec<u8>> by using Witness::from_slice
and Witness::to_vec.
For serialization and deserialization performance it is stored internally as a single Vec,
saving some allocations.
Implementations§
Source§impl Witness
impl Witness
Sourcepub fn p2wpkh(signature: &Signature, pubkey: &PublicKey) -> Witness
pub fn p2wpkh(signature: &Signature, pubkey: &PublicKey) -> Witness
Creates a witness required to spend a P2WPKH output.
The witness will be made up of the DER encoded signature + sighash_type followed by the serialized public key. Also useful for spending a P2SH-P2WPKH output.
It is expected that pubkey is related to the secret key used to create signature.
Sourcepub fn p2tr_key_spend(signature: &Signature) -> Witness
pub fn p2tr_key_spend(signature: &Signature) -> Witness
Creates a witness required to do a key path spend of a P2TR output.
Sourcepub fn from_slice<T>(slice: &[T]) -> Witness
pub fn from_slice<T>(slice: &[T]) -> Witness
Creates a Witness object from a slice of bytes slices where each slice is a witness item.
Sourcepub fn to_vec(&self) -> Vec<Vec<u8>>
pub fn to_vec(&self) -> Vec<Vec<u8>>
Convenience method to create an array of byte-arrays from this witness.
Sourcepub fn size(&self) -> usize
pub fn size(&self) -> usize
Returns the number of bytes this witness contributes to a transactions total size.
Sourcepub fn push<T>(&mut self, new_element: T)
pub fn push<T>(&mut self, new_element: T)
Push a new element on the witness, requires an allocation.
Sourcepub fn push_ecdsa_signature(&mut self, signature: &Signature)
pub fn push_ecdsa_signature(&mut self, signature: &Signature)
Pushes, as a new element on the witness, an ECDSA signature.
Pushes the DER encoded signature + sighash_type, requires an allocation.
Sourcepub fn second_to_last(&self) -> Option<&[u8]>
pub fn second_to_last(&self) -> Option<&[u8]>
Returns the second-to-last element in the witness, if any.
Sourcepub fn third_to_last(&self) -> Option<&[u8]>
pub fn third_to_last(&self) -> Option<&[u8]>
Returns the third-to-last element in the witness, if any.
Sourcepub fn tapscript(&self) -> Option<&Script>
👎Deprecated: use taproot_leaf_script and check leaf version, if applicable
pub fn tapscript(&self) -> Option<&Script>
taproot_leaf_script and check leaf version, if applicableGet leaf script following BIP341 rules regarding accounting for an annex.
This method is broken: it’s called tapscript but it’s actually returning a leaf script.
We’re not going to fix it because someone might be relying on it thinking leaf script and
tapscript are the same thing (they are not). Instead, this is deprecated and will be
removed in the next breaking release. You need to use taproot_leaf_script and if you
intended to use it as leaf script, just access the script field of the returned type. If
you intended tapscript specifically you have to check the version first and bail if it’s not
LeafVersion::TapScript.
This does not guarantee that this represents a P2TR Witness. It
merely gets the second to last or third to last element depending on
the first byte of the last element being equal to 0x50.
See Script::is_p2tr to check whether this is actually a Taproot witness.
Sourcepub fn taproot_leaf_script(&self) -> Option<LeafScript<&Script>>
pub fn taproot_leaf_script(&self) -> Option<LeafScript<&Script>>
Returns the leaf script with its version but without the merkle proof.
This does not guarantee that this represents a P2TR Witness. It
merely gets the second to last or third to last element depending on
the first byte of the last element being equal to 0x50 and the associated
version.
Sourcepub fn taproot_control_block(&self) -> Option<&[u8]>
pub fn taproot_control_block(&self) -> Option<&[u8]>
Get the taproot control block following BIP341 rules.
This does not guarantee that this represents a P2TR Witness. It
merely gets the last or second to last element depending on the first
byte of the last element being equal to 0x50.
See Script::is_p2tr to check whether this is actually a Taproot witness.
Sourcepub fn taproot_annex(&self) -> Option<&[u8]>
pub fn taproot_annex(&self) -> Option<&[u8]>
Get the taproot annex following BIP341 rules.
This does not guarantee that this represents a P2TR Witness.
See Script::is_p2tr to check whether this is actually a Taproot witness.
Sourcepub fn witness_script(&self) -> Option<&Script>
pub fn witness_script(&self) -> Option<&Script>
Get the p2wsh witness script following BIP141 rules.
This does not guarantee that this represents a P2WS Witness. See
Script::is_p2wsh to
check whether this is actually a P2WSH witness.
Trait Implementations§
Source§impl Decodable for Witness
impl Decodable for Witness
Source§impl<'de> Deserialize<'de> for Witness
Available on crate feature serde only.
impl<'de> Deserialize<'de> for Witness
serde only.Source§fn deserialize<D>(
deserializer: D,
) -> Result<Witness, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Witness, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl<'a> IntoIterator for &'a Witness
impl<'a> IntoIterator for &'a Witness
Source§impl Ord for Witness
impl Ord for Witness
Source§impl PartialOrd for Witness
impl PartialOrd for Witness
Source§impl Serialize for Witness
Available on crate feature serde only.
impl Serialize for Witness
serde only.Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Source§impl StrictDecode for Witness
impl StrictDecode for Witness
fn strict_decode(reader: &mut impl TypedRead) -> Result<Witness, DecodeError>
fn strict_read(reader: impl ReadRaw) -> Result<Self, DecodeError>
Source§impl StrictDeserialize for Witness
impl StrictDeserialize for Witness
fn from_strict_serialized<const MAX: usize>( ast_data: Confined<Vec<u8>, 0, MAX>, ) -> Result<Self, DeserializeError>
fn strict_deserialize_from_file<const MAX: usize>( path: impl AsRef<Path>, ) -> Result<Self, DeserializeError>
Source§impl StrictDumb for Witness
impl StrictDumb for Witness
fn strict_dumb() -> Witness
Source§impl StrictEncode for Witness
impl StrictEncode for Witness
fn strict_encode<W>(&self, writer: W) -> Result<W, Error>where
W: TypedWrite,
fn strict_write(&self, writer: impl WriteRaw) -> Result<(), Error>
Source§impl StrictSerialize for Witness
impl StrictSerialize for Witness
fn strict_serialized_len<const MAX: usize>(&self) -> Result<usize, Error>
fn to_strict_serialized<const MAX: usize>( &self, ) -> Result<Confined<Vec<u8>, 0, MAX>, SerializeError>
fn strict_serialize_to_file<const MAX: usize>( &self, path: impl AsRef<Path>, ) -> Result<(), SerializeError>
Source§impl StrictTuple for Witness
impl StrictTuple for Witness
const FIELD_COUNT: u8 = 1u8
fn strict_check_fields()
fn strict_type_info() -> TypeInfo<Self>
Source§impl StrictType for Witness
impl StrictType for Witness
const STRICT_LIB_NAME: &'static str = LIB_NAME_BITCOIN
fn strict_name() -> Option<TypeName>
impl Eq for Witness
impl StrictProduct for Witness
impl StructuralPartialEq for Witness
Auto Trait Implementations§
impl Freeze for Witness
impl RefUnwindSafe for Witness
impl Send for Witness
impl Sync for Witness
impl Unpin for Witness
impl UnwindSafe for Witness
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.