Chapitre 03 : Les portefeuilles (wallet)

Qu’est-ce qu’un wallet ?

Un wallet est une application qui permet à un utilisateur de gérer ses fonds. Elle permet : le stockage des clés privées, la vérification des fonds sur la blockchain, la création et la signature de transactions.

Il existe deux types de wallets :

  • Non déterministes : chaque nouvelle clé privée y est stockée, elle est générée au hasard et ne dépend donc pas des autres. C’est assez compliqué à gérer et à sauvegarder, car il faut être sûr de faire les sauvegardes au bon moment, vous devriez éviter ce genre de wallet.
  • Déterministes : toutes les clés privées sont dérivées à partir d’une clé privé “maître” (appelée seed) et peuvent donc être retrouvées à partir de celle-ci.

Les wallets déterministes les plus utilisées sont ce qu’on appelle les HD wallet ou hierarchical deterministic wallet (BIP-32). Elles ont l’avantage d’avoir une structure en arbre : C’est à dire que vous allez avoir une clé parente (seed) qui va permettre de générer des clés enfants qui auront elles-mêmes des clés enfants, etc.

HD Wallet - Image par cointribune

Le gros avantage ici, c’est que vous allez pouvoir générer de nouvelles clés publiques sans avoir besoin de connaître la clé privée. Cela permet de générer des adresses pour recevoir des fonds sans avoir à utiliser votre clé privée.

Seeds & code mnemonic

La façon de créer un seeds a été standardisé par la BIP-39, elle permet de créer un seed à partir d’une séquence de mots anglais (entre 12 et 24 mots). De cette manière, vous pouvez facilement les importer/exporter entre différents wallets. Avec cette méthode, vous éviterez les erreurs de saisies qui peuvent arriver quand vous recopiez un grand nombre de chiffres.

Note : Ne choisissez pas vous-mêmes les mots… Tous les humains sont très mauvais pour choisir des choses au hasard.

Vos mots vont donc permettre de générer un root seed. Chaque clé privée que va générer votre wallet HD est dérivée de manière déterministe à partir de cette root seed. Avec un seul seed, vous pouvez ainsi de manière simple gérer toutes vos clés/adresses dans n’importe quelle Wallet HD.

La root seed va être utilisée, via HMAC-SHA512, pour générer :

  • Une clé privée maître (m) (premiers 256 bits de HMAC-SHA512).
  • Une master chain code (c) (deuxièmes 256 bits de HMAC-SHA512).

La HD wallet permet de dériver des clés enfants à partir des clés parents grâce à child key derivation (CKD) qui est une fonction qui prend :

  • Une clé privée ou publique parent.
  • Un seed appelé chain code - utilisé pour générer du hasard.
  • Un index.

Ces trois choses sont donc combinées et hashées pour produire à nouveau :

  • Une clé privée maître (m) (premiers 256 bits de HMAC-SHA512).
  • Une master chain code (c) (deuxièmes 256 bits de HMAC-SHA512).

Ce process crée une nouvelle branche. L’utilisation des index permet ensuite de générer des feuilles.

La dérivation nous permet de créer des clés à n’importe quel niveau de l’arbre. Si l’on combine la clé et le chain code, on appelle cela une clé étendue. Le gros avantage avec la clé étendue publique, c’est que l’on peut générer des nouvelles clés publiques et donc adresses, sans connaître la clé privée.

Cela nous donne deux façons de dériver une clé publique enfant : soit à partir de la clé privée enfant, soit directement à partir de la clé publique parent.