Les wallets Bitcoin sont des applications qui permettent de gérer les clés privées et les adresses Bitcoin.
Posséder un wallet permet d'envoyer et de recevoir des bitcoins, ainsi que de consulter son solde.
Dans ce tutoriel, nous allons apprendre à créer un wallet Bitcoin en Python,
à générer une seed phrase et une clé privée à partir de celle-ci,
ce qui permet de restaurer un wallet en cas de perte des clés.
Nous verrons également comment interagir avec la blockchain Bitcoin pour effectuer une première transaction.
Pour suivre ce tutoriel, vous aurez besoin d'installer les libraries bit, bip32utils et mnemonic. Vous pouvez les installer en utilisant pip :
pip install bit bip32utils mnemonic
Une seed phrase est une série de mots qui permet de générer une clé privée. Elle est utilisée pour restaurer un wallet en cas de perte de clés. Nous allons premièrement générer la seed phrase, puis nous créérons le wallet via celle-ci.
Il est très important de conserver votre seed phrase en lieu sûr et hors ligne. C'est le principe du stockage à froid (cold storage).
Voici un exemple de code pour générer une seed phrase en python :
from mnemonic import Mnemonic
import bip32utils
from bit import PrivateKey, PrivateKeyTestnet
mnemo = Mnemonic("english")
# 256 bits pour 24 mots de récupération
mnemonic_phrase = mnemo.generate(strength=256)
print("Seed phrase:", mnemonic_phrase)
Une fois cela fait, on peut alors convertir la seed phrase en une seed cryptographique, puis en clé maîtresse BIP32.
seed = mnemo.to_seed(mnemonic_phrase, passphrase="")
bip32_root_key_obj = bip32utils.BIP32Key.fromEntropy(seed)
BIP32 est une spécification qui permet de générer une hiérarchie de clés à partir d'une seed cryptographique unique. Cette spécification est utilisée pour créer un wallet déterministe hiérarchique (HD Wallet), capable de générer des clés filles à partir de la clé maîtresse facilitant ainsi la gestion et la récupération des clés.
Ce processus est similaire à celui utilisé par les wallets matériels (hard-wallets) comme les Ledger !
Pour en savoir plus sur les HD Wallets, vous pouvez consulter ce cours proposé par Ledger.
Cette clé maîtresse BIP32 est donc le point de départ pour dériver une série de clés filles.
Dérivation de la première clé fille :
bip32_child_key_obj = (
bip32_root_key_obj
.ChildKey(44 + bip32utils.BIP32_HARDEN) # 44'
.ChildKey(0 + bip32utils.BIP32_HARDEN) # 0'
.ChildKey(0 + bip32utils.BIP32_HARDEN) # 0'
.ChildKey(0) # 0
.ChildKey(0) # 0
)
Cette manipulation permet de dériver une clé fille en utilisant la clé maîtresse BIP32. On utilise le chemin de dérivation m/44'/0'/0'/0/0 pour obtenir la clé fille, car il suit le standard BIP44 qui est largement utilisé par les wallets Bitcoin.
On peut alors obtenir la clé privée au format WIF (Wallet Import Format) de cette clé fille :
private_key_wif = bip32_child_key_obj.WalletImportFormat()
print("Private key WIF:", private_key_wif)
Et voilà, vous avez généré une seed phrase et une clé privée à partir de celle-ci !
Maintenant que nous avons notre clé privée WIF ainsi que nos mots de récupération, nous pouvons créer un wallet Bitcoin en utilisant la library bit :
bit_private_key = PrivateKey(private_key_wif)
Et c'est tout ! Vous avez maintenant un wallet Bitcoin fonctionnel manipulable via du code python.
Si vous souhaitez tester le wallet avec des faux bitcoins via le testnet Bitcoin, vous pouvez utiliser la classe PrivateKeyTestnet à la place de PrivateKey.
Vous pouvez print les informations utiles telles que la clé privée, la clé publique qui fera office d'adresse de reception de votre wallet, et le solde de votre wallet en différentes devises :
print("Private Key (WIF):", bit_private_key.to_wif())
print("Public Key:", bit_private_key.address)
print(f"Balance: {bit_private_key.get_balance('satoshi')} SATS soit {bit_private_key.get_balance('usd')}$")
Pour effectuer une transaction, il suffit d'utiliser la méthode send de l'objet PrivateKey :
destination = "ADRESSE_DE_DESTINATION"
amount = "MONTANT_A_ENVOYER_EN_SATOSHIS"
tx_hash = bit_private_key.send([(destination, amount, 'satoshi')])
print(f"Transaction Hash: {tx_hash}")
Remplacez ADRESSE_DE_DESTINATION par l'adresse Bitcoin du destinataire, et MONTANT_A_ENVOYER_EN_SATOSHIS par le montant à envoyer en satoshis (1 BTC = 100 000 000 satoshis).
Si vous tentez d'envoyer plus de bitcoins que vous n'en avez, la transaction sera rejetée et le script lèvera une exception.
Et voilà, vous avez effectué votre première transaction Bitcoin !
Vous pouvez vérifier la transaction sur un explorateur de blocs tel que Blockchain.com en utilisant le hash de la transaction stocké dans la variable tx_hash.
Si vous avez malencontreusement perdu votre clé privée, vous pouvez la récupérer en utilisant votre seed phrase. Il suffit de re-utiliser le code précédent mais en fournissant votre seed plutot que de la générer.
mnemo = Mnemonic("english")
seed = mnemo.to_seed("VOTRE_SEED_PHRASE", passphrase="")
bip32_root_key_obj = bip32utils.BIP32Key.fromEntropy(seed)
bip32_child_key_obj = (
bip32_root_key_obj
.ChildKey(44 + bip32utils.BIP32_HARDEN) # 44'
.ChildKey(0 + bip32utils.BIP32_HARDEN) # 0'
.ChildKey(0 + bip32utils.BIP32_HARDEN) # 0'
.ChildKey(0) # 0
.ChildKey(0) # 0
)
private_key_wif = bip32_child_key_obj.WalletImportFormat()
print("Private key WIF (from seed phrase):", private_key_wif)
Remplacez VOTRE_SEED_PHRASE par votre seed phrase, lancez le script et vous retrouverez votre clé privée !
Dans ce tutoriel, nous avons appris à créer un wallet Bitcoin en Python, à générer une seed phrase et une clé privée à partir de celle-ci, et à effectuer une première transaction en utilisant le wallet créé.
Nous avons également vu comment récupérer une clé privée à partir de la seed phrase, ce qui permet de restaurer le wallet en cas de perte de clés.
Vous savez maintenant comment créer un wallet Bitcoin en Python et comment interagir avec la blockchain via du code.
Si vous avez des questions ou des retours, n'hésitez pas à m'en faire part en m'envoyant un message sur LinkedIn ou par mail à j.pascualramon.etude@gmail.com.
Merci d'avoir suivi ce tutoriel qui est le premier que je publie.
À bientôt !
Jules PASCUAL-RAMON
Développeur Web chez ISEE-U