P2p - À quel moment un nœud commence-t-il à télécharger des blocs dans IBD ?

Ce qui m'intéresse, c'est à quel moment le nœud commence-t-il à demander des blocs ? Est-ce pendant l'IBD ou télécharge-t-il d'abord les en-têtes de tous les pairs, crée-t-il une arborescence d'en-têtes complète et commence ensuite seulement à télécharger les blocs pour la chaîne avec la puissance cumulée la plus élevée et déplace la pointe de la chaîne active ?

Il existe deux processus différents.

Le premier est la MII. Il est divisé en deux phases (causées par la pré-synchronisation de l'en-tête). Dans un premier temps, nous sélectionnons un homologue comme homologue de synchronisation et lui envoyons une par une les requêtes getheaders. À mesure que l'horodatage des en-têtes reçus commence à se rapprocher de l'horodatage actuel, nous commençons également à envoyer des messages getheaders à d'autres pairs. Pesez les réponses avec les en-têtes correspondants, nous les validons et stockons leurs minuscules identifiants (rien n'est stocké dans l'arborescence des en-têtes de bloc pour le moment).

Ce n'est qu'après que les pairs nous ont envoyé tous les en-têtes dont ils disposent (tous les messages d'en-tête contenant moins de 2 000 objets), que nous passons à la deuxième phase.

Dans la deuxième phase, nous envoyons des messages getheaders uniquement pour les en-têtes qui font partie de la chaîne qui a suffisamment de travail cumulé. Il y a deux conditions : que le travail cumulé soit dans la journée suivant la pointe de chaîne active actuelle et supérieur à une certaine valeur prédéfinie. Étant donné que la première condition au tout premier instant est un bloc de genèse (et certains blocs de faible difficulté), elle sera facilement contournée par un homologue malveillant, cependant, la deuxième condition ne le sera pas. À ce stade, peu importe le homologue que vous demandez (qu'il s'agisse d'un homologue de synchronisation ou autre), il est seulement important que nous demandions à un homologue pour lequel nous savons qu'il a donné un en-tête.

Vous pouvez en savoir plus sur la pré-synchronisation des en-têtes dans cet article.

Le deuxième processus fonctionne, à peu près, sur les événements. Chaque fois qu'un nouvel en-tête est ajouté à l'arborescence (événement), ce processus est déclenché. Si diverses conditions nécessaires sont remplies, une demande de blocage sera envoyée à l'un des pairs considéré comme l'ayant.

Lorsqu'un nœud vient de démarrer, puisque lors de la synchronisation initiale, nous ne « parlons » qu'à un seul homologue, alors, lorsque l'homologue de synchronisation nous envoie des en-têtes, nous les validons et les mettons dans l'arborescence, les requêtes getdata pour ces blocs seront immédiatement envoyées à cet homologue de synchronisation. .

Donc non ! Nous ne stockons pas d'abord tous les en-têtes, ne créons pas une arborescence complète, puis téléchargeons les blocs. Tout se fait simultanément. Cependant, nous téléchargeons d'abord tous les en-têtes de l'arborescence pour la pré-synchronisation, avant de faire autre chose.

Pour cela et bien d’autres informations, consultez cet article.