Code de chaîne (chain code)
Le code de chaîne est une donnée auxiliaire de 32 octets utilisée dans la dérivation HD (BIP-32). Combiné à une clé, il permet de générer les clés filles. Sans lui, impossible de dériver la chaîne suivante. C'est un secret aussi sensible que la clé elle-même.
Rôle dans BIP-32
Le code de chaîne (chain code) est une variable cryptographique de 32 octets qui sert de « sel » dans la fonction de dérivation HD spécifiée par le BIP-32. Sans lui, la dérivation d'une clé enfant serait soit triviale (publique liée à la parente d'une manière exploitable), soit impossible. Il transforme la dérivation en HMAC-SHA512 dont le résultat est imprévisible sauf à connaître à la fois la clé parente et le code de chaîne.
Mécanisme de dérivation
| Mode | Entrée HMAC | Caractéristique | |------|-------------|------------------| | Non hardened (normal) | (chain_code, pubkey ∥ i) | Permet la dérivation à partir de la xpub seule | | Hardened (i ≥ 2³¹) | (chain_code, 0x00 ∥ privkey ∥ i) | Nécessite la privkey, plus sûr |
L'output HMAC-SHA512 de 64 octets est scindé : les 32 premiers octets servent à dériver la clé enfant, les 32 derniers deviennent le chain code de l'enfant. C'est ainsi que la chaîne se propage à travers tout l'arbre.
Sensibilité comparable à la clé
Une erreur fréquente : croire que le code de chaîne est moins sensible que la clé. C'est inexact. Un attaquant qui possède :
- La pubkey enfant + le chain code enfant + une clé enfant fuitée
- Peut remonter à la clé privée parente (attaque connue sur dérivation non-hardened)
C'est pourquoi les dérivations sensibles utilisent toujours des indices hardened, qui cassent ce lien.
Sérialisation dans la xpub/xprv
Une clé étendue (xprv/xpub) embarque toujours le chain code (32 octets) à côté de la clé (33 octets) :
version (4) ∥ depth (1) ∥ parent_fingerprint (4) ∥ index (4) ∥ chain_code (32) ∥ key (33)
Total : 78 octets, encodés en Base58Check pour produire la chaîne xprv... ou xpub.... Le chain code est donc toujours transporté avec la clé : on ne peut pas avoir une xpub sans son chain code.
Confusion possible avec d'autres concepts
| Terme | Signification | |-------|---------------| | Chain code (BIP-32) | Donnée 32 octets pour dériver | | Chaintip | Dernier bloc d'une blockchain | | Blockchain | Chaîne de blocs | | Side chain | Blockchain auxiliaire |
Ne pas confondre : le « chain » dans « chain code » fait référence à la chaîne de dérivation, pas à la blockchain.
Importance pratique
Pour un wallet HD, le chain code est l'élément qui permet :
- De restaurer un wallet depuis une seed (dérivation déterministe)
- De partager la xpub avec un watch-only sans donner la privkey
- De faire du multisig en partageant uniquement les xpubs des cosignataires
- De séparer ses comptes (chain code différent par account hardened)
À retenir
Le chain code est un secret aussi précieux que la clé elle-même. Il est embarqué dans toute clé étendue et conditionne la sécurité de la dérivation HD. Le perdre ou le fuiter sans précaution peut donner à un attaquant des informations exploitables, surtout en dérivation non-hardened.
Termes lies
- BIP-32BIP-32 définit les wallets HD : dérivation hiérarchique déterministe à partir d'une seed. Pierre angulaire des wallets modernes. Permet des arbres de clés sans nouvelles sauvegardes.
- Wallet HD (Hierarchical Deterministic)Un wallet HD génère toutes ses clés depuis une seed unique selon une hiérarchie déterministe (BIP-32). Une seule sauvegarde (12 ou 24 mots) suffit pour récupérer toutes les adresses. Standard de l'industrie depuis ~2014. Il a rendu obsolètes les wallets non déterministes type Bitcoin Core 0.x.
- Dérivation HDLa dérivation HD (Hierarchical Deterministic) génère un arbre de clés à partir d'une seed unique (BIP-32). Elle suit un chemin standardisé (BIP-44/49/84/86). Elle permet de gérer milliers d'adresses sans nouvelle sauvegarde. C'est la technologie qui sauve les utilisateurs de la fastidieuse gestion par adresse.
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.