From fab9343e79c8a3afd11fc4dd8813b64b5483fc43 Mon Sep 17 00:00:00 2001 From: kensato Date: Fri, 28 Feb 2025 18:09:00 +0900 Subject: [PATCH] update the key dervation examples --- bsv/hd/__init__.py | 6 ++-- examples/hd.py | 74 ++++++++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/bsv/hd/__init__.py b/bsv/hd/__init__.py index 453d8ca..cdf7f1b 100644 --- a/bsv/hd/__init__.py +++ b/bsv/hd/__init__.py @@ -1,3 +1,5 @@ -from .bip32 import Xkey, Xprv, Xpub, ckd, step_to_index, master_xprv_from_seed +from .bip32 import Xkey, Xprv, Xpub, ckd, step_to_index, master_xprv_from_seed, bip32_derive_xprv_from_mnemonic, \ + bip32_derive_xprvs_from_mnemonic, bip32_derive_xkeys_from_xkey from .bip39 import WordList, mnemonic_from_entropy, seed_from_mnemonic, validate_mnemonic -from .bip44 import derive_xkeys_from_xkey, derive_xprvs_from_mnemonic, derive_xprv_from_mnemonic +from .bip44 import derive_xkeys_from_xkey, derive_xprvs_from_mnemonic, derive_xprv_from_mnemonic, \ + bip44_derive_xprv_from_mnemonic, bip44_derive_xprvs_from_mnemonic diff --git a/examples/hd.py b/examples/hd.py index 1a81217..0287feb 100644 --- a/examples/hd.py +++ b/examples/hd.py @@ -1,41 +1,65 @@ -from typing import List +from bsv.hd import mnemonic_from_entropy, seed_from_mnemonic, master_xprv_from_seed +from bsv.hd import derive_xprvs_from_mnemonic, derive_xkeys_from_xkey +from bsv.constants import BIP32_DERIVATION_PATH, BIP44_DERIVATION_PATH -from bsv.hd import mnemonic_from_entropy, seed_from_mnemonic, master_xprv_from_seed, Xprv, derive_xprvs_from_mnemonic +# You can set custom derivation paths in your environment variables as well +# BIP32_DERIVATION_PATH = "m/" +# BIP44_DERIVATION_PATH = "m/44'/236'/0'" # -# HD derivation +# HD derivation (mnemonic, master-xpublickey, master-xprivatekey) # entropy = 'cd9b819d9c62f0027116c1849e7d497f' -# snow swing guess decide congress abuse session subway loyal view false zebra +# Generate mnemonic from entropy mnemonic: str = mnemonic_from_entropy(entropy) -print(mnemonic) +print("Mnemonic:", mnemonic) -seed: bytes = seed_from_mnemonic(mnemonic) -print(seed.hex()) - -master_xprv: Xprv = master_xprv_from_seed(seed) -print(master_xprv) +# Generate seed from mnemonic +seed = seed_from_mnemonic(mnemonic, lang='en') +print("Seed:", seed.hex()) +# Generate master keys +master_xprv = master_xprv_from_seed(seed) +master_xpub = master_xprv.xpub() +print("Master xprv:", master_xprv) +print("Master xpub:", master_xpub) print() -keys: List[Xprv] = derive_xprvs_from_mnemonic(mnemonic, path="m/44'/0'/0'", change=1, index_start=0, index_end=5) -for key in keys: - # XPriv to WIF - print(key.private_key().wif()) - key_xpub = key.xpub() +# Derive keys from mnemonic using BIP32 +keys_from_mnemonic_by_bip32 = derive_xprvs_from_mnemonic( + mnemonic, 0, 3, path=BIP32_DERIVATION_PATH, change=0 +) - # XPub to public key - print(key_xpub.public_key().hex()) +print("Keys from mnemonic by BIP32:") +print("Address 0:", keys_from_mnemonic_by_bip32[0].address()) +print("Private key 1:", keys_from_mnemonic_by_bip32[1].private_key().wif()) +print("Public key 2:", keys_from_mnemonic_by_bip32[2].public_key().hex()) +print() - # XPub to address - print(key_xpub.public_key().address(), '\n') +# Derive keys from xpub using BIP32 +keys_from_xpub_by_bip32 = derive_xkeys_from_xkey( + master_xpub, 0, 3, change=0 +) +print("Keys from xpub by BIP32:") +print("Address 0:", keys_from_xpub_by_bip32[0].address()) +print("Public key 2:", keys_from_xpub_by_bip32[2].public_key().hex()) +print() -# -# random mnemonic -# +# Derive keys from mnemonic using BIP44 +bip44_keys = derive_xprvs_from_mnemonic( + mnemonic, 0, 3, path=BIP44_DERIVATION_PATH, change=0 +) + +print("Keys from mnemonic by BIP44:") +print("Address 0:", bip44_keys[0].address()) +print("Private key 1:", bip44_keys[1].private_key().wif()) +print("Public key 2:", bip44_keys[2].public_key().hex()) print() -print(mnemonic_from_entropy()) -print(mnemonic_from_entropy(lang='en')) -print(mnemonic_from_entropy(lang='zh-cn')) + +# Loop through multiple derived keys +print("All BIP44 derived keys:") +for i, key in enumerate(bip44_keys): + print(f"Address {i}: {key.address()}") + print(f"Private key {i}: {key.private_key().wif()}") \ No newline at end of file