Glossaire / Nœuds et logiciels
Chaîne de démarrage
Aussi appelé Network magic.
- Qu'est-ce que la chaîne de démarrage ?
- La chaîne de démarrage est le préfixe de quatre octets placé au début de chaque message du réseau bitcoin ; elle indique sur quel réseau se trouve l'expéditeur avant même que la suite soit lue.
Quatre octets empêchent les réseaux parallèles de bitcoin de se parler par accident. Le mainnet utilise f9beb4d9 et le regtest fabfb5da, et un nœud qui lit une valeur inattendue rejette le message et, le plus souvent, la connexion qui l'accompagne. Ce contrôle attrape les erreurs de configuration plutôt que les attaquants, car n'importe qui peut envoyer les quatre bons octets.
Comment cela fonctionne
La chaîne de démarrage occupe les octets zéro à trois d'un message et elle est testée avant que le nœud alloue de la mémoire pour ce qui suit.
Bitcoin Core code en dur une valeur par chaîne. Le mainnet est 0xf9beb4d9. Le testnet3 est 0x0b110907. Le testnet4, ajouté en même temps que le BIP94 dans Bitcoin Core 28.0, est 0x1c163f28. Le regtest est 0xfabfb5da. Le signet est le cas intéressant : au lieu d'une constante, ses quatre octets sont dérivés en hachant le script de défi qui définit qui peut signer les blocs de ce signet, si bien que le signet public par défaut et un signet privé que vous lancez pour vos tests refusent automatiquement de se parler.
Les valeurs n'ont pas été choisies pour être jolies. Ce sont des séquences d'octets peu susceptibles d'apparaître dans un flux de données ordinaire, afin qu'un client qui lit un flux TCP corrompu ou désynchronisé puisse avancer jusqu'à retrouver le motif et reprendre à cet endroit plutôt que de tout abandonner.
Les mêmes quatre octets sont écrits sur le disque. Dans les fichiers blk00000.dat qui contiennent les blocs bruts, chaque bloc stocké est précédé de la chaîne de démarrage de son réseau et d'une longueur de quatre octets. Ce cadrage permet à un nœud de parcourir un fichier de blocs qu'il n'a pas fini d'écrire, de localiser la frontière entre les enregistrements et de ne rejeter que la fin tronquée au lieu du fichier entier.
Où la voir
La chaîne de démarrage apparaît chaque fois que le trafic bitcoin est inspecté plutôt que simplement utilisé.
Ouvrez une capture de paquets sur le port 8333 et chaque trame de la conversation commence par f9 be b4 d9. Les analyseurs de protocole se fondent sur exactement cette signature pour étiqueter le trafic. Chaque projet qui a repris le code a modifié ces quatre octets parmi ses premiers changements, et c'est pourquoi les forks ne peuvent pas se connecter entre eux même si leurs poignées de main sont par ailleurs identiques.
Pour un utilisateur ordinaire, elle se manifeste une fois, sous la forme d'un silence peu utile. Pointez un portefeuille configuré pour le testnet vers un nœud mainnet et vous n'obtenez aucune erreur, aucun avis de rejet, aucune connexion : le nœud lit quatre octets qu'il ne reconnaît pas, rejette le message et finit par abandonner le pair. Vérifier que les deux extrémités sont sur le même réseau est la première chose à contrôler quand un nœud et un portefeuille refusent de se voir.
Chaîne de démarrage vs en-tête de message
La chaîne de démarrage est un champ ; l'en-tête de message les contient tous les quatre. Un en-tête fait 24 octets composés de la chaîne de démarrage, puis d'un nom de commande de douze octets en ASCII, puis d'une longueur de charge utile de quatre octets, puis d'une somme de contrôle de quatre octets. La chaîne de démarrage répond quel réseau, la commande répond quel type de message, la longueur répond combien d'octets lire encore. On emploie les deux noms l'un pour l'autre quand on veut dire l'en-tête, ce qui devient franchement confus dès que vous comptez des décalages d'octets dans un vidage hexadécimal.