Aller au contenu
buybitcoinsmart

Glossaire / Nœuds et logiciels

En-tête de message

Qu'est-ce que l'en-tête de message ?
L'en-tête de message de Bitcoin est une enveloppe fixe de 24 octets autour de chaque message pair-à-pair : une chaîne de démarrage de réseau, un nom de commande, une longueur de charge utile et une somme de contrôle.

Rien dans le protocole pair-à-pair ne se décrit lui-même, c'est donc l'enveloppe qui s'en charge. Ses quatre champs ne changent jamais de taille ni d'ordre, ce qui permet à un nœud de lire exactement 24 octets, de savoir combien d'autres arrivent et de couper la connexion devant tout ce qui annonce plus que les 4 000 000 octets que Bitcoin Core accepte. Vous n'en verrez jamais un, mais un en-tête mal formé est la raison pour laquelle une connexion pair-à-pair disparaît parfois sans explication.

Comment cela fonctionne

Les quatre champs de l'en-tête se lisent dans un ordre fixe, et chacun conditionne la suite.

Les octets 0 à 3 contiennent la chaîne de démarrage qui identifie le réseau. Les octets 4 à 15 contiennent la commande : un nom ASCII en minuscules complété par des octets nuls jusqu'à douze caractères, ce qui explique pourquoi chaque type de message dans bitcoin porte un nom bref et pourquoi cmpctblock, avec ses dix caractères, frôle le plafond. Les octets 16 à 19 contiennent la longueur de la charge utile sous forme d'entier non signé en petit-boutiste. Les octets 20 à 23 contiennent une somme de contrôle, les quatre premiers octets d'un double SHA-256 calculé sur la charge utile.

Placer la longueur avant la charge utile est la véritable sécurité de cette conception. Un nœud qui a consommé 24 octets sait déjà si l'expéditeur annonce quelque chose d'absurde, et Bitcoin Core refuse tout ce qui dépasse 4 000 000 octets et se déconnecte, sans allouer de mémoire tampon ni attendre des données qui pourraient ne jamais venir. Mettez la longueur après le corps et vous faites confiance à l'expéditeur pour s'arrêter.

La somme de contrôle mérite moins de considération qu'on ne lui en accorde. Quatre octets de hachage détectent un bit inversé sur une liaison défectueuse et ne servent à rien contre un pair qui ment, puisqu'un expéditeur hostile calcule simplement la somme de contrôle sur ce qu'il a choisi d'envoyer. L'intégrité dans bitcoin vient de la validation du contenu selon les règles de consensus, jamais de ce champ.

L'ensemble de la structure est facultatif dans les logiciels plus récents. Le transport en version 2 du BIP324 chiffre la connexion et remplace l'enveloppe en clair par un cadrage de longueur obscurci et un identifiant court d'un octet pour les types de messages les plus courants, si bien qu'un observateur passif ne peut plus lire les noms de commandes sur le réseau. Bitcoin Core l'a livré comme réglage facultatif dans la version 26.0 et l'a activé par défaut dans une version ultérieure.

Où le voir

Les en-têtes de message apparaissent dans les captures de paquets et dans les diagnostics d'un nœud.

Lancez Bitcoin Core avec -debug=net et le journal enregistre les types et les tailles de messages pour chaque pair, ce qui est le moyen pratique de voir ce que fait réellement une connexion. Les entrées PROCESSMESSAGE : INVALID MESSAGESTART signifient qu'un pair a envoyé des octets qui ne commençaient pas par la chaîne de démarrage de ce réseau, ce qui est presque toujours une mauvaise configuration à l'autre bout plutôt qu'une attaque. Le dissecteur bitcoin de Wireshark analyse les mêmes 24 octets pour étiqueter chaque trame.

En-tête de message vs en-tête de bloc

Un en-tête de message est un emballage de transport ; un en-tête de bloc est une donnée de consensus, et ils n'ont en commun que le mot. L'en-tête de message fait 24 octets, n'existe que le temps d'une livraison et est jeté dès que la charge utile a été lue. L'en-tête de bloc fait 80 octets, contient la version, le hachage du bloc précédent, la racine de Merkle, l'horodatage, la cible de difficulté et le nonce, et il est haché pour produire la preuve de travail qui nomme ce bloc de façon permanente. L'un est l'étiquette d'adresse sur un colis ; l'autre est ce qu'il contient.

À ne pas confondre avec

Questions fréquentes

Quelle est la taille d'un en-tête de message bitcoin ?

Exactement 24 octets : quatre pour la chaîne de démarrage du réseau, douze pour le nom de commande complété par des octets nuls, quatre pour la longueur de la charge utile et quatre pour une somme de contrôle tirée des premiers octets d'un double SHA-256 calculé sur la charge utile.

La somme de contrôle de l'en-tête de message sécurise-t-elle la connexion ?

Non. Elle détecte uniquement une corruption accidentelle. Un pair hostile recalcule la somme de contrôle sur ce qu'il envoie, donc la sécurité vient de la validation de la charge utile selon les règles de consensus, ou du transport chiffré BIP324 qui remplace entièrement l'en-tête en clair.

Termes associés

Plus de termes : Nœuds et logiciels

Lire cette page en anglais