p2p : Comment fonctionne la synchronisation des blocs dans Bitcoin Core aujourd'hui


Depuis l'introduction de la synchronisation des en-têtes d'abord dans Bitcoin Core 0.10, la structure de données de la blockchain peut être considérée comme comportant les composants suivants  :

  • Le arbre d'en-tête de bloc : une structure de données arborescente, avec le bloc Genesis comme racine, contenant tous les en-têtes des forks connus de la chaîne. Cette arborescence est toujours connectée, c'est-à-dire qu'il n'est pas possible d'ajouter un en-tête à l'arborescence sauf si son parent est déjà dans l'arborescence
  • Les blocs peuvent être reçus (et demandés) dans le désordre, tant que l'en-tête correspondant existe dans l'arborescence des en-têtes. Il peut y avoir des lacunes, il n'est donc pas nécessaire qu'un bloc puisse être stocké uniquement si le parent a également son parent stocké. Bien entendu, un bloc ne peut devenir la pointe de chaîne active que s'il est entièrement validé, ce qui nécessite d'avoir vu tous les blocs qui le précèdent. Depuis l’introduction de l’élagage des fichiers de blocs dans Bitcoin Core 0.11, il est également possible de supprimer à nouveau des blocs après validation ; dans ce cas, les en-têtes correspondants sont toujours conservés dans l'arborescence

    8)

Maintenant, pour expliquer comment la synchronisation se produit, trois processus distincts régissent ces structures de données  :

/li>

p2p : Comment fonctionne la synchronisation des blocs dans Bitcoin Core aujourd'hui

que les pairs ont mais pas nous

et le changement qui en résulte du bout de chaîne actif

Dans la pratique, ils se produisent tous en parallèle, mais il est plus facile de les considérer comme une séquence.

Synchronisation des en-têtes

auxquels ils répondront par un message d' Lorsque nous sommes loin derrièreutilisation de la bande passante tous les homologues sont invités.

abord connaître tous les en-têtes intermédiaires Cela ne signifie pas qu'arrivée de leurs en-têtes parents manquants, auquel cas ils seront traités normalement.

en-tête directement lorsqu' soit parce qu' Cela également nous incitera à envoyer un getheaders en réponse pour en savoir plus sur tous les en-têtes que nous manquons

Lorsque les en-têtes arrivent, ils sont validés dans la mesure du possible. Cela inclut l'exactitude syntaxique, la preuve de travail, les ajustements de difficulté, les règles sur les horodatages (plus grands que la médiane des 11 derniers blocs, pas plus de 2 heures dans le futur) et les règles sur les numéros de version (BIP34, BIP66 et BIP65. mettre des exigences sur le numéro de version). Si un en-tête échoue à l’un de ces éléments, il est ignoré, ainsi que tous les en-têtes qui en descendent.

inondation par des tonnes d'en-têtes de faible difficulté qu'un attaquant pourrait créer. En raison de la preuve de travail, les en-têtes réels sont très difficiles à produire en masse, mais un attaquant peut construire une chaîne d'en-têtes qui a commencé quelque part très loin dans l'histoire (par exemple juste après le bloc de genèse) lorsque la difficulté était faible, ce qui pourrait finalement entraîner des problèmes de mémoire pour les nœuds s'ils les acceptaient dans leur arborescence de blocs. Historiquement, les points de contrôle étaient (entre autres) utilisés pour se prémunir contre cela, mais depuis Bitcoin Core 24.0, un autre mécanisme, plus complet, est utilisé : la pré-synchronisation des en-têtes. En bref, cela implique de télécharger les en-têtes deux fois ; une première fois pour vérifier que les en-têtes représentent réellement une quantité de travail importante (mais sans les ajouter à l'arborescence des blocs), et une deuxième fois où ils sont retéléchargés, et s'ils correspondent à ce qui a été envoyé en premier, ils sont ajoutés au bloquer l'arbre. Vous pouvez en savoir plus sur ce mécanisme dans cette réponse.

Synchronisation des blocs

nous pouvons télécharger des blocs. En général, les blocs ne sont demandés (et acceptés) que s'ils font partie d'une chaîne d'en-têtes dont la pointe a au moins autant de travail cumulé que la pointe actuellement active. Les blocs qui ne figurent pas dans notre arborescence d'en-têtes ne sont jamais acceptés (ce seraient des blocs orphelins), pas plus que les blocs sur des forks dont la chaîne d'en-tête n'a pas une quantité compétitive de travail cumulé.

inv et d' nous avons donc une idée du dernier en-tête de bloc que nous avons en communils définissent l' ou NODE_NETWORK_LIMITED pour les blocs suffisamment récents).

ils ont le bloc respectif de manière circulaire, avec une limite de 16 requêtes mais blocs non reçus par homologue. Nous ne demandons pas de blocs ayant plus de 1 024 blocs d'avance sur le meilleur conseil actuel, afin de limiter la façon dont les blocs dans le désordre peuvent être reçus (cela est important pour l'élagage). Tant qu'une demande de bloc est en attente, le même bloc n'est pas demandé à nouveau à un autre homologue pour économiser la bande passante. Si un homologue tarde trop à répondre à une demande de blocage, il est déconnecté et la demande sera envoyée ailleurs.

en-tête à l'en-tête Sinon, il est ignoré.

annoncer des blocs à utiliser directement à l'en-tête intégré dans le bloc compact en premier

Lorsqu'un bloc est traité, toutes les règles de consensus applicables sont appliquées, notamment la validité syntactique, le recalcul de la racine Merkle de la transaction, la finalité de la transaction, le BIP34 (« hauteur dans coinbase »), les engagements segwit et le poids maximum du bloc. Si ces vérifications échouent, le bloc est ignoré ou, dans certains cas, marqué comme définitivement invalide, selon le type d'erreur. Les scripts, les doubles dépenses et l’inflation ne peuvent pas encore être vérifiés.

Bloquer l'activation

nous pouvons décider quelle devrait être notre pointe de chaîne active et valider pleinement les blocs.

et qui ne sont pas (encore) marqués comme définitivement invalides.

  • ne considérez que ceux avec le travail cumulé le plus élevé.
  • et s'il y en a plusieurs, choisissez celui pour lequel les données complètes ont été reçues en premier
  • Tout d'abord, les blocs qui font partie de la chaîne active mais pas dans la chaîne sélectionnée sont déconnectés dans l'ordre inverse, puis les blocs de la sélection qui ne sont pas dans la chaîne active sont connectés dans l'ordre direct.

    La connexion implique d'effectuer une validation complète de toutes les règles de consensus, y compris la validité des scripts, les contrôles de subventions et la vérification des doubles dépenses, qui nécessitent un accès à l'ensemble UTXO. Nous maintenons uniquement l'ensemble UTXO à l'extrémité de la chaîne active, donc la connexion implique de supprimer de l'ensemble UTXO toutes les entrées du bloc et d'ajouter toutes les sorties. La déconnexion fait l'inverse, en supprimant toutes les sorties ajoutées par le bloc déconnecté et en rajoutant toutes les entrées qu'il a dépensées. Si la validation échoue ici, le bloc est marqué comme définitivement invalide, ce qui amènera probablement la logique de sélection ci-dessus à modifier son idée sur ce que devrait être la pointe de la chaîne.

    Dans le cas où l' l'annonce est envoyée avant la fin de la validation complète dans les circonstances autorisées par BIP152 (encore une fois comme moyen de réduire la latence).