pub struct XOnlyPublicKey(/* private fields */);Expand description
An x-only public key, used for verification of Taproot signatures and serialized according to BIP-340.
§Serde support
Implements de/serialization with the serde feature enabled. We treat the byte value as a tuple
of 32 u8s for non-human-readable formats. This representation is optimal for for some formats
(e.g. bincode) however other formats may be less optimal (e.g. cbor).
§Examples
Basic usage:
use secp256k1::{rand, Secp256k1, Keypair, XOnlyPublicKey};
let secp = Secp256k1::new();
let keypair = Keypair::new(&secp, &mut rand::thread_rng());
let xonly = XOnlyPublicKey::from_keypair(&keypair);Implementations§
Source§impl XOnlyPublicKey
impl XOnlyPublicKey
Sourcepub fn cmp_fast_unstable(&self, other: &XOnlyPublicKey) -> Ordering
pub fn cmp_fast_unstable(&self, other: &XOnlyPublicKey) -> Ordering
Like cmp::Cmp but faster and with no guarantees across library versions.
The Cmp implementation for FFI types is stable but slow because it first
serializes self and other before comparing them. This function provides a faster
comparison if you know that your types come from the same library version.
Sourcepub fn eq_fast_unstable(&self, other: &XOnlyPublicKey) -> bool
pub fn eq_fast_unstable(&self, other: &XOnlyPublicKey) -> bool
Like cmp::Eq but faster and with no guarantees across library versions.
The Eq implementation for FFI types is stable but slow because it first serializes
self and other before comparing them. This function provides a faster equality
check if you know that your types come from the same library version.
Source§impl XOnlyPublicKey
impl XOnlyPublicKey
Sourcepub fn as_ptr(&self) -> *const XOnlyPublicKey
👎Deprecated since 0.25.0: Use Self::as_c_ptr if you need to access the FFI layer
pub fn as_ptr(&self) -> *const XOnlyPublicKey
Obtains a raw const pointer suitable for use with FFI functions.
Sourcepub fn as_mut_ptr(&mut self) -> *mut XOnlyPublicKey
👎Deprecated since 0.25.0: Use Self::as_mut_c_ptr if you need to access the FFI layer
pub fn as_mut_ptr(&mut self) -> *mut XOnlyPublicKey
Obtains a raw mutable pointer suitable for use with FFI functions.
Sourcepub fn from_keypair(keypair: &Keypair) -> (XOnlyPublicKey, Parity)
pub fn from_keypair(keypair: &Keypair) -> (XOnlyPublicKey, Parity)
Returns the XOnlyPublicKey (and it’s Parity) for keypair.
Sourcepub fn from_slice(data: &[u8]) -> Result<XOnlyPublicKey, Error>
pub fn from_slice(data: &[u8]) -> Result<XOnlyPublicKey, Error>
Creates a schnorr public key directly from a slice.
§Errors
Returns Error::InvalidPublicKey if the length of the data slice is not 32 bytes or the
slice does not represent a valid Secp256k1 point x coordinate.
Sourcepub fn serialize(&self) -> [u8; 32]
pub fn serialize(&self) -> [u8; 32]
Serializes the key as a byte-encoded x coordinate value (32 bytes).
Sourcepub fn add_tweak<V>(
self,
secp: &Secp256k1<V>,
tweak: &Scalar,
) -> Result<(XOnlyPublicKey, Parity), Error>where
V: Verification,
pub fn add_tweak<V>(
self,
secp: &Secp256k1<V>,
tweak: &Scalar,
) -> Result<(XOnlyPublicKey, Parity), Error>where
V: Verification,
Tweaks an XOnlyPublicKey by adding the generator multiplied with the given tweak to it.
§Returns
The newly tweaked key plus an opaque type representing the parity of the tweaked key, this
should be provided to tweak_add_check which can be used to verify a tweak more efficiently
than regenerating it and checking equality.
§Errors
If the resulting key would be invalid.
§Examples
use secp256k1::{Secp256k1, Keypair, Scalar, XOnlyPublicKey};
let secp = Secp256k1::new();
let tweak = Scalar::random();
let mut keypair = Keypair::new(&secp, &mut rand::thread_rng());
let (xonly, _parity) = keypair.x_only_public_key();
let tweaked = xonly.add_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");Sourcepub fn tweak_add_check<V>(
&self,
secp: &Secp256k1<V>,
tweaked_key: &XOnlyPublicKey,
tweaked_parity: Parity,
tweak: Scalar,
) -> boolwhere
V: Verification,
pub fn tweak_add_check<V>(
&self,
secp: &Secp256k1<V>,
tweaked_key: &XOnlyPublicKey,
tweaked_parity: Parity,
tweak: Scalar,
) -> boolwhere
V: Verification,
Verifies that a tweak produced by XOnlyPublicKey::add_tweak was computed correctly.
Should be called on the original untweaked key. Takes the tweaked key and output parity from
XOnlyPublicKey::add_tweak as input.
Currently this is not much more efficient than just recomputing the tweak and checking equality. However, in future this API will support batch verification, which is significantly faster, so it is wise to design protocols with this in mind.
§Returns
True if tweak and check is successful, false otherwise.
§Examples
use secp256k1::{Secp256k1, Keypair, Scalar};
let secp = Secp256k1::new();
let tweak = Scalar::random();
let mut keypair = Keypair::new(&secp, &mut rand::thread_rng());
let (mut public_key, _) = keypair.x_only_public_key();
let original = public_key;
let (tweaked, parity) = public_key.add_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");
assert!(original.tweak_add_check(&secp, &tweaked, parity, tweak));Sourcepub fn public_key(&self, parity: Parity) -> PublicKey
pub fn public_key(&self, parity: Parity) -> PublicKey
Returns the PublicKey for this XOnlyPublicKey.
This is equivalent to using [PublicKey::from_xonly_and_parity(self, parity)].
Trait Implementations§
Source§impl CPtr for XOnlyPublicKey
impl CPtr for XOnlyPublicKey
type Target = XOnlyPublicKey
fn as_c_ptr(&self) -> *const <XOnlyPublicKey as CPtr>::Target
fn as_mut_c_ptr(&mut self) -> *mut <XOnlyPublicKey as CPtr>::Target
Source§impl Clone for XOnlyPublicKey
impl Clone for XOnlyPublicKey
Source§fn clone(&self) -> XOnlyPublicKey
fn clone(&self) -> XOnlyPublicKey
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl ConvolveCommit<Commitment, TapretProof, TapretFirst> for XOnlyPublicKey
impl ConvolveCommit<Commitment, TapretProof, TapretFirst> for XOnlyPublicKey
Source§type Commitment = TweakedPublicKey
type Commitment = TweakedPublicKey
Self::convolve_commit
procedure.Source§type CommitError = TapretKeyError
type CommitError = TapretKeyError
Self::convolve_commit
procedure. It may also be returned from ConvolveCommitProof::verify
in case the proof data are invalid and the commitment can’t be
re-created.Source§fn convolve_commit(
&self,
supplement: &TapretPathProof,
msg: &Commitment,
) -> Result<(TweakedPublicKey, TapretProof), <XOnlyPublicKey as ConvolveCommit<Commitment, TapretProof, TapretFirst>>::CommitError>
fn convolve_commit( &self, supplement: &TapretPathProof, msg: &Commitment, ) -> Result<(TweakedPublicKey, TapretProof), <XOnlyPublicKey as ConvolveCommit<Commitment, TapretProof, TapretFirst>>::CommitError>
supplement to unparse the content of this container (self)
(“convolves” these two data together) and uses them to produce a final
Self::Commitment to the message msg. Read moreSource§impl ConvolveCommitProof<Commitment, XOnlyPublicKey, TapretFirst> for TapretProof
impl ConvolveCommitProof<Commitment, XOnlyPublicKey, TapretFirst> for TapretProof
Source§type Suppl = TapretPathProof
type Suppl = TapretPathProof
Source§fn restore_original(&self, _: &TweakedPublicKey) -> XOnlyPublicKey
fn restore_original(&self, _: &TweakedPublicKey) -> XOnlyPublicKey
self) and commitment.Source§fn extract_supplement(
&self,
) -> &<TapretProof as ConvolveCommitProof<Commitment, XOnlyPublicKey, TapretFirst>>::Suppl
fn extract_supplement( &self, ) -> &<TapretProof as ConvolveCommitProof<Commitment, XOnlyPublicKey, TapretFirst>>::Suppl
Source§fn verify(
&self,
msg: &Msg,
commitment: &<Source as ConvolveCommit<Msg, Self, Protocol>>::Commitment,
) -> Result<(), ConvolveVerifyError>where
Self: VerifyEq,
fn verify(
&self,
msg: &Msg,
commitment: &<Source as ConvolveCommit<Msg, Self, Protocol>>::Commitment,
) -> Result<(), ConvolveVerifyError>where
Self: VerifyEq,
self) against the message. Read moreSource§impl Debug for XOnlyPublicKey
impl Debug for XOnlyPublicKey
Source§impl<'de> Deserialize<'de> for XOnlyPublicKey
Available on crate feature serde only.
impl<'de> Deserialize<'de> for XOnlyPublicKey
serde only.Source§fn deserialize<D>(
d: D,
) -> Result<XOnlyPublicKey, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
d: D,
) -> Result<XOnlyPublicKey, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl Display for XOnlyPublicKey
impl Display for XOnlyPublicKey
Source§impl From<CompressedPublicKey> for XOnlyPublicKey
impl From<CompressedPublicKey> for XOnlyPublicKey
Source§fn from(pk: CompressedPublicKey) -> XOnlyPublicKey
fn from(pk: CompressedPublicKey) -> XOnlyPublicKey
Source§impl From<PublicKey> for XOnlyPublicKey
impl From<PublicKey> for XOnlyPublicKey
Source§fn from(pk: PublicKey) -> XOnlyPublicKey
fn from(pk: PublicKey) -> XOnlyPublicKey
Source§impl From<PublicKey> for XOnlyPublicKey
impl From<PublicKey> for XOnlyPublicKey
Source§fn from(src: PublicKey) -> XOnlyPublicKey
fn from(src: PublicKey) -> XOnlyPublicKey
Source§impl From<TweakedPublicKey> for XOnlyPublicKey
impl From<TweakedPublicKey> for XOnlyPublicKey
Source§fn from(pair: TweakedPublicKey) -> XOnlyPublicKey
fn from(pair: TweakedPublicKey) -> XOnlyPublicKey
Source§impl From<XOnlyPublicKey> for DescriptorPublicKey
impl From<XOnlyPublicKey> for DescriptorPublicKey
Source§fn from(key: XOnlyPublicKey) -> DescriptorPublicKey
fn from(key: XOnlyPublicKey) -> DescriptorPublicKey
Source§impl From<XOnlyPublicKey> for XOnlyPublicKey
Creates a new schnorr public key from a FFI x-only public key.
impl From<XOnlyPublicKey> for XOnlyPublicKey
Creates a new schnorr public key from a FFI x-only public key.
Source§fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey
fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey
Source§impl FromStr for XOnlyPublicKey
impl FromStr for XOnlyPublicKey
Source§impl Hash for XOnlyPublicKey
impl Hash for XOnlyPublicKey
Source§impl<Ctx> IntoDescriptorKey<Ctx> for XOnlyPublicKeywhere
Ctx: ScriptContext,
impl<Ctx> IntoDescriptorKey<Ctx> for XOnlyPublicKeywhere
Ctx: ScriptContext,
Source§fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError>
fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError>
DescriptorKey within the requested ScriptContextSource§impl LowerHex for XOnlyPublicKey
impl LowerHex for XOnlyPublicKey
Source§impl MiniscriptKey for XOnlyPublicKey
impl MiniscriptKey for XOnlyPublicKey
Source§type Sha256 = Hash
type Sha256 = Hash
bitcoin::hashes::sha256::Hash for this MiniscriptKey, used in the
sha256 fragment.Source§type Hash256 = Hash
type Hash256 = Hash
miniscript::hash256::Hash for this MiniscriptKey, used in the
hash256 fragment.Source§type Ripemd160 = Hash
type Ripemd160 = Hash
bitcoin::hashes::ripemd160::Hash for this MiniscriptKey type, used
in the ripemd160 fragment.Source§type Hash160 = Hash
type Hash160 = Hash
bitcoin::hashes::hash160::Hash for this MiniscriptKey type, used in
the hash160 fragment.Source§fn is_x_only_key(&self) -> bool
fn is_x_only_key(&self) -> bool
false.Source§fn is_uncompressed(&self) -> bool
fn is_uncompressed(&self) -> bool
false.Source§fn num_der_paths(&self) -> usize
fn num_der_paths(&self) -> usize
Source§impl Ord for XOnlyPublicKey
impl Ord for XOnlyPublicKey
Source§fn cmp(&self, other: &XOnlyPublicKey) -> Ordering
fn cmp(&self, other: &XOnlyPublicKey) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl ParseableKey for XOnlyPublicKey
impl ParseableKey for XOnlyPublicKey
Source§fn from_slice(sl: &[u8]) -> Result<XOnlyPublicKey, KeyParseError>
fn from_slice(sl: &[u8]) -> Result<XOnlyPublicKey, KeyParseError>
Source§impl PartialEq for XOnlyPublicKey
impl PartialEq for XOnlyPublicKey
Source§impl PartialOrd for XOnlyPublicKey
impl PartialOrd for XOnlyPublicKey
Source§impl Serialize for XOnlyPublicKey
Available on crate feature serde only.
impl Serialize for XOnlyPublicKey
serde only.Source§fn serialize<S>(
&self,
s: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
s: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Source§impl StrictDecode for XOnlyPublicKey
impl StrictDecode for XOnlyPublicKey
fn strict_decode( reader: &mut impl TypedRead, ) -> Result<XOnlyPublicKey, DecodeError>
fn strict_read(reader: impl ReadRaw) -> Result<Self, DecodeError>
Source§impl StrictDeserialize for XOnlyPublicKey
impl StrictDeserialize for XOnlyPublicKey
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 XOnlyPublicKey
impl StrictDumb for XOnlyPublicKey
fn strict_dumb() -> XOnlyPublicKey
Source§impl StrictEncode for XOnlyPublicKey
impl StrictEncode for XOnlyPublicKey
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 XOnlyPublicKey
impl StrictSerialize for XOnlyPublicKey
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 XOnlyPublicKey
impl StrictTuple for XOnlyPublicKey
const FIELD_COUNT: u8 = 1u8
fn strict_check_fields()
fn strict_type_info() -> TypeInfo<Self>
Source§impl StrictType for XOnlyPublicKey
impl StrictType for XOnlyPublicKey
const STRICT_LIB_NAME: &'static str = LIB_NAME_BITCOIN
fn strict_name() -> Option<TypeName>
Source§impl TapTweak for XOnlyPublicKey
impl TapTweak for XOnlyPublicKey
Source§fn tap_tweak<C>(
self,
secp: &Secp256k1<C>,
merkle_root: Option<TapNodeHash>,
) -> (TweakedPublicKey, Parity)where
C: Verification,
fn tap_tweak<C>(
self,
secp: &Secp256k1<C>,
merkle_root: Option<TapNodeHash>,
) -> (TweakedPublicKey, Parity)where
C: Verification,
Tweaks an untweaked public key with corresponding public key value and optional script tree merkle root.
This is done by using the equation Q = P + H(P|c)G, where
- Q is the tweaked public key
- P is the internal public key
- H is the hash function
- c is the commitment data
- G is the generator point
§Returns
The tweaked key and its parity.
Source§type TweakedAux = (TweakedPublicKey, Parity)
type TweakedAux = (TweakedPublicKey, Parity)
Source§type TweakedKey = TweakedPublicKey
type TweakedKey = TweakedPublicKey
Source§fn dangerous_assume_tweaked(self) -> TweakedPublicKey
fn dangerous_assume_tweaked(self) -> TweakedPublicKey
Source§impl ToPublicKey for XOnlyPublicKey
impl ToPublicKey for XOnlyPublicKey
Source§fn to_public_key(&self) -> PublicKey
fn to_public_key(&self) -> PublicKey
Source§fn to_x_only_pubkey(&self) -> XOnlyPublicKey
fn to_x_only_pubkey(&self) -> XOnlyPublicKey
Source§fn to_sha256(hash: &Hash) -> Hash
fn to_sha256(hash: &Hash) -> Hash
MiniscriptKey::Sha256 to sha256::HashSource§fn to_hash256(hash: &Hash) -> Hash
fn to_hash256(hash: &Hash) -> Hash
MiniscriptKey::Hash256 to hash256::HashSource§fn to_ripemd160(hash: &Hash) -> Hash
fn to_ripemd160(hash: &Hash) -> Hash
MiniscriptKey::Ripemd160 to ripemd160::HashSource§fn to_hash160(hash: &Hash) -> Hash
fn to_hash160(hash: &Hash) -> Hash
MiniscriptKey::Hash160 to hash160::HashSource§fn to_pubkeyhash(&self, sig_type: SigType) -> Hash
fn to_pubkeyhash(&self, sig_type: SigType) -> Hash
impl Copy for XOnlyPublicKey
impl Eq for XOnlyPublicKey
impl StrictProduct for XOnlyPublicKey
impl StructuralPartialEq for XOnlyPublicKey
Auto Trait Implementations§
impl Freeze for XOnlyPublicKey
impl RefUnwindSafe for XOnlyPublicKey
impl Send for XOnlyPublicKey
impl Sync for XOnlyPublicKey
impl Unpin for XOnlyPublicKey
impl UnwindSafe for XOnlyPublicKey
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.