#key #secret-key #public-key #signature #chia #blockchain #bls

chia-bls

BLS signature, verification and aggregation funcions for the Chia blockchain

11 releases (7 breaking)

new 0.9.0 May 23, 2024
0.7.0 Apr 24, 2024
0.6.0 Mar 21, 2024
0.3.3 Dec 16, 2023
0.2.13 Oct 30, 2023

#958 in Magic Beans

Download history 3201/week @ 2024-02-01 2862/week @ 2024-02-08 799/week @ 2024-02-15 1852/week @ 2024-02-22 2263/week @ 2024-02-29 2444/week @ 2024-03-07 1336/week @ 2024-03-14 1295/week @ 2024-03-21 1022/week @ 2024-03-28 2313/week @ 2024-04-04 2192/week @ 2024-04-11 3475/week @ 2024-04-18 3334/week @ 2024-04-25 2915/week @ 2024-05-02 6150/week @ 2024-05-09 7776/week @ 2024-05-16

20,504 downloads per month
Used in 17 crates (11 directly)

Apache-2.0

120KB
2.5K SLoC

Library providing building blocks for a Chia wallet.

BIP39 mnemonic handling:

fn entropy_to_mnemonic(entropy: &[u8; 32]) -> String
fn mnemonic_to_entropy(mnemonic: &str) -> Result<[u8; 32], Error>
fn entropy_to_seed(entropy: &[u8; 32]) -> [u8; 64]

SecretKey

impl SecretKey {
    pub fn from_seed(seed: &[u8; 64]) -> SecretKey
    pub fn from_bytes(bytes: &[u8; 32]) -> Option<SecretKey>
    pub fn to_bytes(&self) -> [u8; 32]

    pub fn public_key(&self) -> PublicKey

    pub fn derive_unhardened(&self, idx: u32) -> SecretKey
    pub fn derive_hardened(&self, idx: u32) -> SecretKey
}

PublicKey

impl PublicKey {
    pub fn from_bytes(bytes: &[u8; 48]) -> Option<PublicKey>
    pub fn to_bytes(&self) -> [u8; 48]
    pub fn derive_unhardened(&self, idx: u32) -> PublicKey
}

Unhardened Key derivation (Key can be both a secret- or public key)

fn master_to_wallet_unhardened_intermediate<Key: DerivableKey>(key: &Key) -> Key
fn master_to_wallet_unhardened<Key: DerivableKey>(key: &Key, idx: u32) -> Key

Hardened key derivation (only SecretKey)

fn master_to_wallet_hardened_intermediate(key: &SecretKey) -> SecretKey
fn master_to_wallet_hardened(key: &SecretKey, idx: u32) -> SecretKey
fn master_to_pool_singleton(key: &SecretKey, pool_wallet_idx: u32) -> SecretKey
fn master_to_pool_authentication(key: &SecretKey, pool_wallet_idx: u32, idx: u32) -> SecretKey

Signature

impl Signature {
    pub fn from_bytes(buf: &[u8; 96]) -> Option<Signature>
    pub fn to_bytes(&self) -> [u8; 96]
    pub fn aggregate(&mut self, sig: &Signature)
}

impl Default for Signature {
    fn default() -> Self
}

sign and verify (using the Augmented scheme)

pub fn sign<Msg: AsRef<[u8]>>(sk: &SecretKey, msg: Msg) -> Signature
pub fn aggregate<Sig: Borrow<Signature>, I>(sigs: I) -> Signature
    where I: IntoIterator<Item = Sig>
pub fn verify<Msg: AsRef<[u8]>>(sig: &Signature, key: &PublicKey, msg: Msg) -> bool
pub fn aggregate_verify<Pk: Borrow<PublicKey>, Msg: Borrow<[u8]>, I>(sig: &Signature, data: I) -> bool
    where I: IntoIterator<Item = (Pk, Msg)>

Dependencies

~7–14MB
~255K SLoC