Struct bitcoin::key::PublicKey

source ·
pub struct PublicKey {
    pub compressed: bool,
    pub inner: PublicKey,
}
Expand description

A Bitcoin ECDSA public key

Fields§

§compressed: bool

Whether this public key should be serialized as compressed

§inner: PublicKey

The actual ECDSA key

Implementations§

source§

impl PublicKey

source

pub fn new(key: impl Into<PublicKey>) -> PublicKey

Constructs compressed ECDSA public key from the provided generic Secp256k1 public key

source

pub fn new_uncompressed(key: impl Into<PublicKey>) -> PublicKey

Constructs uncompressed (legacy) ECDSA public key from the provided generic Secp256k1 public key

source

pub fn pubkey_hash(&self) -> PubkeyHash

Returns bitcoin 160-bit hash of the public key

source

pub fn wpubkey_hash(&self) -> Option<WPubkeyHash>

Returns bitcoin 160-bit hash of the public key for witness program

source

pub fn write_into<W: Write>(&self, writer: W) -> Result<(), Error>

Write the public key into a writer

source

pub fn read_from<R: Read>(reader: R) -> Result<Self, Error>

Read the public key from a reader

This internally reads the first byte before reading the rest, so use of a BufReader is recommended.

source

pub fn to_bytes(self) -> Vec<u8>

Serialize the public key to bytes

source

pub fn to_sort_key(self) -> SortKey

Serialize the public key into a SortKey.

SortKey is not too useful by itself, but it can be used to sort a [PublicKey] slice using sort_unstable_by_key, sort_by_cached_key, sort_by_key, or any of the other *_by_key methods on slice. Pass the method into the sort method directly. (ie. PublicKey::to_sort_key)

This method of sorting is in line with Bitcoin Core’s implementation of sorting keys for output descriptors such as sortedmulti().

If every PublicKey in the slice is compressed == true then this will sort the keys in a BIP67 compliant way.

Example: Using with sort_unstable_by_key
use std::str::FromStr;
use bitcoin::PublicKey;

let pk = |s| PublicKey::from_str(s).unwrap();

let mut unsorted = [
    pk("04c4b0bbb339aa236bff38dbe6a451e111972a7909a126bc424013cba2ec33bc38e98ac269ffe028345c31ac8d0a365f29c8f7e7cfccac72f84e1acd02bc554f35"),
    pk("038f47dcd43ba6d97fc9ed2e3bba09b175a45fac55f0683e8cf771e8ced4572354"),
    pk("028bde91b10013e08949a318018fedbd896534a549a278e220169ee2a36517c7aa"),
    pk("04c4b0bbb339aa236bff38dbe6a451e111972a7909a126bc424013cba2ec33bc3816753d96001fd7cba3ce5372f5c9a0d63708183033538d07b1e532fc43aaacfa"),
    pk("032b8324c93575034047a52e9bca05a46d8347046b91a032eff07d5de8d3f2730b"),
    pk("045d753414fa292ea5b8f56e39cfb6a0287b2546231a5cb05c4b14ab4b463d171f5128148985b23eccb1e2905374873b1f09b9487f47afa6b1f2b0083ac8b4f7e8"),
    pk("0234dd69c56c36a41230d573d68adeae0030c9bc0bf26f24d3e1b64c604d293c68"),
];
let sorted = [
    // These first 4 keys are in a BIP67 compatible sorted order
    // (since they are compressed)
    pk("0234dd69c56c36a41230d573d68adeae0030c9bc0bf26f24d3e1b64c604d293c68"),
    pk("028bde91b10013e08949a318018fedbd896534a549a278e220169ee2a36517c7aa"),
    pk("032b8324c93575034047a52e9bca05a46d8347046b91a032eff07d5de8d3f2730b"),
    pk("038f47dcd43ba6d97fc9ed2e3bba09b175a45fac55f0683e8cf771e8ced4572354"),
    // Uncompressed keys are not BIP67 compliant, but are sorted
    // after compressed keys in Bitcoin Core using `sortedmulti()`
    pk("045d753414fa292ea5b8f56e39cfb6a0287b2546231a5cb05c4b14ab4b463d171f5128148985b23eccb1e2905374873b1f09b9487f47afa6b1f2b0083ac8b4f7e8"),
    pk("04c4b0bbb339aa236bff38dbe6a451e111972a7909a126bc424013cba2ec33bc3816753d96001fd7cba3ce5372f5c9a0d63708183033538d07b1e532fc43aaacfa"),
    pk("04c4b0bbb339aa236bff38dbe6a451e111972a7909a126bc424013cba2ec33bc38e98ac269ffe028345c31ac8d0a365f29c8f7e7cfccac72f84e1acd02bc554f35"),
];

unsorted.sort_unstable_by_key(|k| PublicKey::to_sort_key(*k));

assert_eq!(unsorted, sorted);
source

pub fn from_slice(data: &[u8]) -> Result<PublicKey, Error>

Deserialize a public key from a slice

source

pub fn from_private_key<C: Signing>( secp: &Secp256k1<C>, sk: &PrivateKey ) -> PublicKey

Computes the public key as supposed to be used with this secret

source

pub fn verify<C: Verification>( &self, secp: &Secp256k1<C>, msg: &Message, sig: &Signature ) -> Result<(), Error>

Checks that sig is a valid ECDSA signature for msg using this public key.

Trait Implementations§

source§

impl Clone for PublicKey

source§

fn clone(&self) -> PublicKey

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PublicKey

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for PublicKey

Available on crate feature serde only.
source§

fn deserialize<D: Deserializer<'de>>(d: D) -> Result<PublicKey, D::Error>

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for PublicKey

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<&PublicKey> for PubkeyHash

source§

fn from(key: &PublicKey) -> PubkeyHash

Converts to this type from the input type.
source§

impl From<PublicKey> for PubkeyHash

source§

fn from(key: PublicKey) -> PubkeyHash

Converts to this type from the input type.
source§

impl From<PublicKey> for PublicKey

source§

fn from(pk: PublicKey) -> PublicKey

Converts to this type from the input type.
source§

impl From<PublicKey> for XOnlyPublicKey

source§

fn from(pk: PublicKey) -> XOnlyPublicKey

Converts to this type from the input type.
source§

impl FromStr for PublicKey

§

type Err = Error

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<PublicKey, Error>

Parses a string s to return a value of this type. Read more
source§

impl Hash for PublicKey

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for PublicKey

source§

fn cmp(&self, other: &PublicKey) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for PublicKey

source§

fn eq(&self, other: &PublicKey) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for PublicKey

source§

fn partial_cmp(&self, other: &PublicKey) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl Serialize for PublicKey

Available on crate feature serde only.
source§

fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for PublicKey

source§

impl Eq for PublicKey

source§

impl StructuralEq for PublicKey

source§

impl StructuralPartialEq for PublicKey

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> DeserializeOwned for Twhere T: for<'de> Deserialize<'de>,