• Loïc Morel

Comprendre les chemins de dérivation d'un portefeuille Bitcoin.

Retrouvez cet article en lecture audio :



Le portefeuille déterministe hiérarchique (HD) a été l'une des plus grandes innovations sur Bitcoin. D'abord proposé dans le BIP32, puis optimisé avec le BIP39, BIP43 et BIP44, il permet à l'utilisateur de Bitcoin de ne plus avoir à réaliser une nouvelle sauvegarde pour toute nouvelle paire de clés générée, mais une unique sauvegarde pour l'ensemble des clés de son portefeuille. Aujourd'hui il représente un standard utilisé par l'extrême majorité des utilisateurs.


Comme son nom l'indique, ce type portefeuille se base sur une information unique afin de dériver tout un arbre descendant de clés. Cette information de base, c'est la graine ou "seed" en anglais.


Pour toute paire de clés donnée dans un portefeuille HD, on peut ainsi définir un chemin de dérivation indiquant d'où viennent ces clés, quel est leur chemin depuis la graine et qui sont leurs différents aïeux.


Le fonctionnement de ces chemins de dérivation est important à comprendre lorsque l'on utilise un portefeuille Bitcoin HD. Cela nous est souvent utile lorsque l'on souhaite récupérer un portefeuille suite à un problème quelconque, lorsque l'on change de logiciel de gestion, lorsque l'on met en place un portefeuille "watch-only" ou encore lorsque l'on utilise des services spéciaux comme Whirlpool.


Dans cet article vous allez découvrir comment fonctionne une dérivation de clés enfants Bitcoin et comment interpréter les notations des chemins de dérivation.



Sommaire :



Racines d'un arbre.




Structure du portefeuille HD.


Avant de pouvoir comprendre précisément ce qu'est un chemin de dérivation, il faut avoir compris comment se structure un portefeuille déterministe hiérarchique.


Comme expliqué en introduction, le portefeuille HD est basé sur une information unique qui constitue sa base : la graine. Cette graine est obtenue en appliquant la fonction PBKDF2 à la phrase mnémonique (elle même issue d'une source d'entropie) et à la passphrase.



Schéma de la dérivation d'un graine d'un portefeuille Bitcoin depuis la phrase mnémonique et la passphrase.
Schéma de la dérivation d'une graine d'un portefeuille Bitcoin depuis la phrase mnémonique et la passphrase.


Pour reconstituer cette graine en cas de perte, l'utilisateur devra donc avoir en sa possession la phrase mnémonique (phrase de 12 / 24 mots) et l'éventuelle passphrase optionnelle.


Une fois la graine obtenue, nous allons pouvoir commencer la dérivation des paires de clés, de façon hiérarchique. La première clé déterminée depuis la graine, et donc la mère de toutes les futures clés, s'appelle la clé maîtresse. Elle se trouve tout en haut de la hiérarchie de votre portefeuille. Cette clé est obtenue en passant la graine du portefeuille dans la fonction HMAC-SHA512.


Le sel utilisé est commun à l'intégralité des wallets Bitcoin, c'est la phrase : "Bitcoin seed".

Il ressortira de cette fonction un nombre de 512 bits que l'on viendra séparer en deux.


Schéma de la dérivation de la clé maîtresse d'un portefeuille Bitcoin depuis la graine.
Schéma de la dérivation de la clé maîtresse d'un portefeuille Bitcoin depuis la graine.


Comme vous pouvez le voir sur ce schéma, les 256 bits de gauche seront utilisés comme clé maîtresse, et les 256 bits de droite seront utilisés comme code de chaîne maître.


Comme vous le découvrirai plus loin dans cet article, toute paire de clé dispose d'un code de chaîne. Celui-ci est utilisé dans le processus de dérivation de paires enfants afin d'introduire simplement une source d'entropie. Sans ce code de chaîne utilisé à tous les étages de dérivation, il serait possible pour un attaquant de déterminer l'ensemble de vos clés enfants en ayant connaissance uniquement d'une de vos clé publique enfant. Encore plus grave, si une seule de vos clés privées venait à fuiter, un attaquant pourrait assez facilement déterminer toutes les autres clés privées de votre portefeuille, que ce soient les clés antérieures ou les clés postérieures. Ces codes de chaines sont donc essentiels à la sécurisation d'un portefeuille HD.


La clé maîtresse, elle, constitue notre information de base qui va nous permettre de dériver des clés enfants, puis des clés petits enfants...


Le portefeuille se décompose ainsi en plusieurs profondeurs. Si l'on fait une comparaison avec un arbre généalogique, chaque profondeur d'un portefeuille HD correspondrait à une génération.


Chaque paire parent peut ainsi générer des paires enfants, chacune des paires enfants pourra générer d'autres paires enfants, et ainsi de suite.


Toute paire de clés est composée de trois éléments :

  • Une clé privée.

  • Une clé publique.

  • Un code de chaîne.


Schéma de la structure théorique d'un portefeuille HD Bitcoin.
Schéma de la structure théorique d'un portefeuille HD Bitcoin.




Dérivation d'une paire de clés enfant.


Maintenant, voyons ensemble comment est-ce que l'on génère une paire de clés enfant, à partir d'une paire de clés parent.


Nous avons une paire parent composée de : une clé privée parent, une clé publique parent et un code de chaine parent.


Comme nous avons vu précédemment, une même paire parent peut dériver plusieurs paires enfants. Pour différencier ces différentes paires enfants de leurs sœurs, un index leur est ajouté.


Cet index est simplement un nombre d'une taille de 32 bits. Ainsi, on peut imaginer que la première paire enfant aura l'index 0, la deuxième paire enfant aura l'index 1, et ainsi de suite.


Pour dériver une paire de clé enfant, on va simplement venir concaténer (mettre bout à bout) la clé parent et l'index souhaité, puis on va passer ce nombre dans la fonction HMAC-SHA512 avec le code de chaine parent.


Schéma de la dérivation de clés enfants Bitcoin depuis une clé parent.
Schéma de la dérivation de clés enfants Bitcoin depuis une clé parent.

Il existe ainsi différentes manière de dériver une paire enfant. Si l'on utilise la clé privée parent, on aura une paire enfant "renforcée", si l'on utilise la clé publique parent, on aura une paire de clés enfant "normale".


Je ne vais pas plus détailler ce processus dans cet article puisque c'est assez complexe et nous n'en avons pas besoin pour comprendre le fonctionnement du chemin de dérivation. Si vous souhaitez en savoir plus sur le sujet de la dérivation de paires enfants, je vous conseille de lire le Tome 2 de ma série d'ebooks gratuite Bitcoin Démocratisé : cliquez ici pour le télécharger.


Pour faciliter le processus de dérivation il existe encore un autre concept que je dois vous expliquer : les clés étendues.


Une clé étendue est simplement une adjonction d'une clé avec son code de chaîne. Cela permet de disposer de toutes les informations nécessaires pour dériver des clés enfants, à savoir : la clé parent et le code de chaîne associé. Par exemple, la xpub est une clé étendue qui se trouve à une certaine profondeur dans votre portefeuille, et qui permet à elle seule de dériver toutes ses clés publiques enfants.


Schéma de la construction d'une clé étendue Bitcoin.
Schéma de la construction d'une clé étendue Bitcoin.




Chemin de dérivation.


Après avoir abordé ces points techniques, nous allons enfin pouvoir étudier la problématique principale de cet article : Qu'est-ce qu'un chemin de dérivation sur un portefeuille Bitcoin ?


Le chemin de dérivation est une notation permettant d'indiquer à un logiciel ou à un utilisateur où se trouve une paire de clés donnée au sein de l'arborescence du portefeuille.


On défini ainsi différentes profondeurs depuis la clé maîtresse. Pour la grande majorité des portefeuilles standards, cela ressemblera à cela :


Schéma d'un chemin de dérivation dans un portefeuille Bitcoin.
Schéma d'un chemin de dérivation dans un portefeuille Bitcoin.

Sur ce schéma, chaque flèche noire indique une dérivation depuis une paire de clés parent vers une paire de clés enfant.



La profondeur 0 est celle de la clé maîtresse telle que nous l'avons vue dans la première partie de cet article. Pour l'identifier dans le chemin de dérivation, nous noterons :

m/

Cette clé est indiquée simplement par la lettre "m" étant donné qu'elle est unique et qu'elle ne peut pas avoir de sœur dans le portefeuille.



La profondeur 1 est celle de l'objectif. Elle permet de définir la structure du portefeuille et d'indiquer quel standard est suivi. Cela permet de normaliser les différentes structures et d'éviter une confusion quand au standard suivi.


On va donc utiliser cette profondeur pour dériver une clé enfant à partir de la clé maîtresse. L'index de cette clé enfant indiquera quel standard la dérivation respecte. Par exemple, si le portefeuille respecte le standard BIP84, l'index sera alors 84 :

m/84'/

L'apostrophe que vous voyez à côté de l'index permet d'indiquer si la dérivation est renforcée ou normale. Si il y a une apostrophe ou un "h" à côté de l'index, alors la dérivation est renforcée. S'il n'y a que l'index sans rien d'autre, alors la dérivation est normale.



La profondeur 2 définit le type de crypto-monnaie. Cela permet de bien différencier les branches dédiées à une crypto-monnaie, des branches dédiées à une autre crypto-monnaie sur un portefeuille "multi-coin".


L'index dédié au Bitcoin est évidemment le 0, et nous réalisons encore ici une dérivation renforcée. Si l'on continu notre exemple, nous aurons donc sur notre chemin :

m/84'/0'/


La profondeur 3 est celle des comptes. Cette profondeur nous permet de différencier et d’organiser facilement notre portefeuille en différents comptes. Ces comptes sont numérotés à partir de 0.


En réalité, les clés étendues (xpub et xprv) telles que vous les connaissez, se trouvent à ce niveau de profondeur.


Par exemple, mon premier compte sur mon portefeuille dispose d'une notation en profondeur 3 :

m/84'/0'/0'/

Cette dérivation est encore renforcée.



La profondeur 4 est celle de la chaîne. Chaque compte tel que défini en profondeur 3 disposera de deux chaînes en profondeur 4 : une chaîne externe et une chaîne interne (également appelée “change”).


La chaîne externe dérive des adresses destinées à être communiquées publiquement, c’est-à-dire les adresses que l’on nous propose lorsque l’on clique sur “recevoir” dans notre logiciel de portefeuille.


La chaîne interne dérive les adresses destinées à ne pas être échangées publiquement, c’est-à-dire principalement les adresses de change.


Ainsi, la chaîne externe aura en profondeur 4 : /0/. Et la chaîne interne aura en profondeur 4 : /1/.


Si l'on poursuit notre exemple de chemin de dérivation en désignant la chaine externe de mon compte, cela donnera :

m/84'/0'/0'/0 /

Vous remarquerez qu'à partir de cette profondeur, on ne réalise plus une dérivation endurcie mais une dérivation normale. C'est grâce à ce mécanisme que l'on est capable de dériver l'ensemble des clés publiques enfants à partir de leur xpub.


Notons que ce niveau de profondeur 4 est dédié au type de script dans le cas d’un portefeuille multisig (voir BIP48). Le niveau dédié aux chaînes est alors décalé d’une profondeur.


La profondeur 5 est celle de l’index de l’adresse. Ce niveau indique simplement le numéro de l’adresse et de sa paire de clés afin de les différencier de leurs sœurs.


Par exemple, la première adresse dispose de l’index /0/, la deuxième adresse dispose de l’index /1/…


Si l'on suit notre exemple, nous noterons le chemin de dérivation de ma première adresse :

m/84'/0'/0'/0 /0 /



Maintenant que nous savons en détail ce que représente chaque profondeur, étudions la notation de ce chemin de dérivation.


Pour noter un chemin de dérivation, chaque niveau de profondeur sera séparé d’une barre oblique / et indiquera l’index utilisé. Pour rappel, la notation apostrophe ‘ signale que la paire de clés indiquée est endurcie.


Par exemple, voici un chemin de dérivation d'une adresse Bitcoin :

m/84'/0'/0'/0 /5 /

En observant uniquement ce chemin de dérivation, on peut en déduire cela :

  • 84' indique que nous suivons le standard de dérivation du BIP84.

  • 0' indique que c'est une adresse Bitcoin.

  • 0' indique que l'on est sur le premier compte du portefeuille.

  • 0 indique que c'est une adresse externe.

  • 5 indique que c'est la sixième adresse externe de ce compte.


Parfois, vous croiserez également des chemins de dérivation de compte. Ils sont très utiles lorsque vous récupérez votre portefeuille ou lorsque vous changez de logiciel de gestion :

m/44'/0'/4'/

En observant ce chemin de dérivation d'un compte, on peut en déduire cela :

  • 44' désigne que la dérivation respecte le standard BIP44.

  • 0' désigne que l'on est sur Bitcoin.

  • 4' désigne que ce chemin pointe vers le cinquième compte du portefeuille.





Conclusion.


Nous avons pu voir le fonctionnement général d'un portefeuille HD et des chemins de dérivations. Ces notions techniques sont extrêmement importantes à comprendre si l'on souhaite être indépendant dans sa stratégie de sécurisation, et si l'on souhaite ensuite étudier des concepts plus poussés, notamment en terme d'optimisation de la confidentialité.


Cet article introduit le sujet, si vous souhaitez en apprendre plus sur le fonctionnement d'un portefeuille et sur les rouages des dérivations de paires de clés, je vous conseille de lire le Tome 2 de ma série d'ebooks gratuits Bitcoin Démocratisé : cliquez ici pour le télécharger.





Pour aller plus loin :