Aller au contenu
buybitcoinsmart

Glossaire / Protocole et mises à jour

Relais de blocs compacts

Aussi appelé BIP152.

Qu'est-ce que le relais de blocs compacts ?
Le relais de blocs compacts remplace l'envoi d'un nouveau bloc par une liste d'identifiants de six octets, que le nœud récepteur compare aux transactions qu'il détient déjà et reconstitue localement.

Spécifié dans BIP-152.

Deux pairs qui observent tous deux la mempool partagent déjà presque toutes les transactions du bloc suivant, donc les envoyer une seconde fois est un gaspillage. Matt Corallo a spécifié ce correctif sous le nom de BIP152 et Bitcoin Core l'a activé dans la version 0.13.0, publiée le 23 août 2016. Pour quiconque exploite un nœud chez soi, c'est la différence entre une facture de bande passante tolérable et une facture intolérable.

Comment cela fonctionne

Le relais de blocs compacts ajoute quatre messages au protocole, et le plus intéressant est cmpctblock, qui décrit un bloc sans le contenir.

Un cmpctblock porte l'en-tête de 80 octets, un nonce de 8 octets choisi par l'expéditeur, puis un identifiant court de six octets pour chaque transaction du bloc. Ces identifiants proviennent de SipHash-2-4, dont la clé dérive du SHA-256 de l'en-tête concaténé avec ce nonce. Le nonce est ce qui rend le procédé sûr : les identifiants diffèrent pour chaque bloc et chaque expéditeur, si bien que personne ne peut préparer à l'avance deux transactions dont les identifiants entrent en collision et bloquent la reconstruction sur tout le réseau d'un seul coup.

Certaines transactions circulent en entier plutôt que par identifiant. La coinbase le fait toujours, car aucun pair n'a pu la voir auparavant, et un expéditeur peut préremplir tout autre élément dont il soupçonne que le récepteur ne le détiendra pas.

La reconstruction a ensuite lieu du côté récepteur. Le nœud hache chaque transaction de sa propre mempool avec la même clé, recherche chaque identifiant court et remplit le bloc. Il conserve aussi une petite réserve supplémentaire de transactions récemment évincées et remplacées, qui rattrape celles sorties de la mempool quelques instants plus tôt. Ce qui manque encore est demandé par position avec getblocktxn, et l'expéditeur ne renvoie que ces transactions dans un message blocktxn.

Deux choses forcent un repli vers le téléchargement du bloc entier : trop de transactions manquantes pour qu'un aller-retour en vaille la peine, ou deux transactions différentes produisant le même identifiant de six octets. Six octets permettent 281 billions de valeurs, donc les collisions accidentelles sont extrêmement rares, et celles délibérées sont ce que le nonce exclut.

L'annonce se présente sous deux formes. En mode à faible bande passante, un pair annonce un nouveau bloc et attend qu'on le lui demande. En mode à haute bande passante, qu'un nœud active pour trois pairs au maximum, le cmpctblock est poussé dès l'arrivée du bloc, ce qui économise un aller-retour sur le trajet où la vitesse de propagation compte le plus.

Où cela se voit

Le relais de blocs compacts est visible dans le journal de votre propre nœud, une ligne par bloc, et le lire est le moyen le plus rapide de juger si un nœud est sain.

Bitcoin Core affiche un résumé de reconstruction indiquant combien de transactions ont été préremplies, combien venaient de la mempool, combien venaient de la réserve supplémentaire et combien ont dû être demandées. Sur une machine en fonctionnement depuis des heures, le nombre de transactions demandées est généralement nul ou proche de zéro. Sur une machine démarrée il y a dix minutes, la mempool est presque vide, presque tout doit être récupéré, et les premiers blocs arrivent lentement.

Il en découle une règle pratique pour quiconque exploite un nœud afin de vérifier son propre solde plutôt que de faire confiance à un site web : laissez-le tourner. Un nœud redémarré juste avant que vous en ayez besoin est un nœud qui télécharge des blocs entiers, et sa vue de la pointe sera en retard sur un explorateur public jusqu'à ce que la mempool se remplisse.

À ne pas confondre avec

Questions fréquentes

Le relais de blocs compacts change-t-il ce qui compte comme un bloc valide ?

Non. Il change seulement la façon dont les octets circulent entre pairs. Le nœud récepteur valide le bloc reconstitué depuis zéro selon les mêmes règles de consensus, donc un bloc arrivé de façon compacte est vérifié aussi strictement qu'un bloc téléchargé en entier.

Pourquoi mon nœud télécharge-t-il des blocs entiers après un redémarrage ?

Parce que la reconstruction exige une mempool remplie. Un nœud fraîchement démarré n'a presque rien à comparer aux identifiants courts, il doit donc demander la majeure partie de chaque bloc. La situation se corrige d'elle-même en une heure environ, à mesure que la mempool se remplit.

Termes associés

Plus de termes : Protocole et mises à jour

Lire cette page en anglais