Struct bitcoin::key::XOnlyPublicKey
pub struct XOnlyPublicKey(_);
Expand description
An x-only public key, used for verification of schnorr 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 u8
s 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 key_pair = KeyPair::new(&secp, &mut rand::thread_rng());
let xonly = XOnlyPublicKey::from_keypair(&key_pair);
Implementations§
§impl XOnlyPublicKey
impl XOnlyPublicKey
pub 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.
pub 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.
§impl XOnlyPublicKey
impl XOnlyPublicKey
pub 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.
pub 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.
pub fn from_keypair(keypair: &KeyPair) -> (XOnlyPublicKey, Parity)
pub fn from_keypair(keypair: &KeyPair) -> (XOnlyPublicKey, Parity)
Returns the XOnlyPublicKey
(and it’s Parity
) for keypair
.
pub 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.
pub fn serialize(&self) -> [u8; 32]
pub fn serialize(&self) -> [u8; 32]
Serializes the key as a byte-encoded x coordinate value (32 bytes).
pub 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 key_pair = KeyPair::new(&secp, &mut rand::thread_rng());
let (xonly, _parity) = key_pair.x_only_public_key();
let tweaked = xonly.add_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");
pub 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 key_pair = KeyPair::new(&secp, &mut rand::thread_rng());
let (mut public_key, _) = key_pair.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));
pub 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§
§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
§impl Clone for XOnlyPublicKey
impl Clone for XOnlyPublicKey
§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 more§impl Debug for XOnlyPublicKey
impl Debug for XOnlyPublicKey
§impl<'de> Deserialize<'de> for XOnlyPublicKey
impl<'de> Deserialize<'de> for XOnlyPublicKey
§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>,
§impl Display for XOnlyPublicKey
impl Display for XOnlyPublicKey
§impl From<PublicKey> for XOnlyPublicKey
impl From<PublicKey> for XOnlyPublicKey
§fn from(src: PublicKey) -> XOnlyPublicKey
fn from(src: PublicKey) -> XOnlyPublicKey
§impl From<TweakedPublicKey> for XOnlyPublicKey
impl From<TweakedPublicKey> for XOnlyPublicKey
§fn from(pair: TweakedPublicKey) -> XOnlyPublicKey
fn from(pair: TweakedPublicKey) -> XOnlyPublicKey
§impl From<XOnlyPublicKey> for XOnlyPublicKey
impl From<XOnlyPublicKey> for XOnlyPublicKey
Creates a new schnorr public key from a FFI x-only public key.
§fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey
fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey
§impl FromStr for XOnlyPublicKey
impl FromStr for XOnlyPublicKey
§impl Hash for XOnlyPublicKey
impl Hash for XOnlyPublicKey
§impl LowerHex for XOnlyPublicKey
impl LowerHex for XOnlyPublicKey
§impl Ord for XOnlyPublicKey
impl Ord for XOnlyPublicKey
§impl PartialEq<XOnlyPublicKey> for XOnlyPublicKey
impl PartialEq<XOnlyPublicKey> for XOnlyPublicKey
§fn eq(&self, other: &XOnlyPublicKey) -> bool
fn eq(&self, other: &XOnlyPublicKey) -> bool
self
and other
values to be equal, and is used
by ==
.§impl PartialOrd<XOnlyPublicKey> for XOnlyPublicKey
impl PartialOrd<XOnlyPublicKey> for XOnlyPublicKey
§fn partial_cmp(&self, other: &XOnlyPublicKey) -> Option<Ordering>
fn partial_cmp(&self, other: &XOnlyPublicKey) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more§impl Serialize for XOnlyPublicKey
impl Serialize for XOnlyPublicKey
§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,
§impl TapTweak for XOnlyPublicKey
impl TapTweak for XOnlyPublicKey
§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.
§type TweakedAux = (TweakedPublicKey, Parity)
type TweakedAux = (TweakedPublicKey, Parity)
§type TweakedKey = TweakedPublicKey
type TweakedKey = TweakedPublicKey
§fn dangerous_assume_tweaked(self) -> TweakedPublicKey
fn dangerous_assume_tweaked(self) -> TweakedPublicKey
impl Copy for XOnlyPublicKey
impl Eq for XOnlyPublicKey
impl StructuralEq for XOnlyPublicKey
impl StructuralPartialEq for XOnlyPublicKey
Auto Trait Implementations§
impl RefUnwindSafe for XOnlyPublicKey
impl Send for XOnlyPublicKey
impl Sync for XOnlyPublicKey
impl Unpin for XOnlyPublicKey
impl UnwindSafe for XOnlyPublicKey
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.