Wiki ZooBC
Sécurité et architecture

Instantanés et synchronisation rapide

Un nœud qui rejoint une chaîne vieille de plusieurs années n’a pas à rejouer chaque bloc depuis le bloc 0. Il suit la chaîne dorsale, télécharge le dernier instantané que nomme la dorsale, le vérifie segment par segment et auprès de ses pairs, puis n’applique que les blocs produits depuis. C’est la synchronisation rapide. À aucun moment le nœud ne croit sur parole un site web ou un pair isolé quant à l’état de la chaîne.

Les instantanés

Un instantané est l’état complet de la chaîne, chaque solde, chaque siège et chaque enregistrement, à une hauteur donnée. Tous les main_snapshot_interval blocs, soit 172 800 blocs ou environ 30 jours sur le mainnet, chaque nœud écrit un instantané de l’état tel qu’il était 760 blocs sous cette hauteur de déclenchement. (Sur le devnet : tous les 240 blocs, à 80 blocs de profondeur.) Les nœuds échelonnent ce travail sur 60 blocs au plus, mais l’instantané de chaque nœud est identique octet pour octet.

L’instantané est un unique document CBOR qui contient les tables d’état de la chaîne (57 au total), les en-têtes de bloc récents, les transactions récentes, les transactions dont la conservation est encore payée (voir payer pour conserver des données (longévité)) et les reçus publiés récemment. Il est découpé en segments de 102 400 octets, chacun nommé par son hachage SHA3-256. La liste de ces hachages, avec le hachage du fichier entier, la hauteur de référence, une expiration et le hachage de genèse de la chaîne, forme le manifeste, qu’un bloc de la dorsale publie.

Rien n’est signé à l’intérieur d’un instantané. Son autorité vient du bloc dorsal qui le nomme : un bloc cosigné par deux tiers des sièges, dont chacun a d’abord comparé le manifeste avec son propre instantané, hachage pour hachage.

Chaque nœud ne conserve que ses trois générations d’instantanés les plus récentes. Chaque instantané depuis le bloc 0 est conservé par le stockage décentralisé, et non par chaque nœud : les segments de chaque instantané sont détenus par cinq nœuds enregistrés tirés au sort (voir archive et la lecture du passé).

La synchronisation rapide, étape par étape

Un nœud tente une synchronisation rapide lorsqu’il a au moins 100 blocs de retard et qu’il détient un manifeste utilisable au-dessus de sa propre hauteur. Il doit détenir le bloc dorsal qui porte ce manifeste, avec ses signatures. Le manifeste le plus récent reste utilisable même après son expiration.

  1. Synchroniser la dorsale. Un nœud très en retard stocke un bloc dorsal dont la référence se situe au-dessus de son propre sommet lorsque ce bloc porte le seuil de signatures qui le concerne (deux tiers, ou plus de la moitié pour un bloc de repli). Il en vérifie le contenu plus tard, une fois que sa chaîne principale atteint la référence, et s’arrête avec une alarme en cas de discordance.
  2. Récupérer les segments auprès des pairs enregistrés connectés, en 16 tranches au plus, en vérifiant chaque segment par rapport au hachage qui le nomme.
  3. Vérifier le fichier entier par rapport au hachage du fichier complet indiqué dans le manifeste.
  4. Charger l’état dans une seule transaction de base de données.
  5. Recouper un échantillon avec les pairs (voir ci-dessous).
  6. Appliquer les blocs restants un par un, avec une validation complète, jusqu’au sommet.
Six étapes numérotées : chaîne dorsale (signée aux 2/3), manifeste (liste de hachages), segments venant de plusieurs pairs, chargement de l’état, échantillon recoupé avec les pairs, blocs restants jusqu’au sommet. Un instantané tous les 172 800 blocs (environ 30 jours).
Six étapes numérotées : chaîne dorsale (signée aux 2/3), manifeste (liste de hachages), segments venant de plusieurs pairs, chargement de l’état, échantillon recoupé avec les pairs, blocs restants jusqu’au sommet. Un instantané tous les 172 800 blocs (environ 30 jours).

L’attestation : vérifier l’état auprès des pairs

Des hachages concordants prouvent que les octets sont bien ceux que nomme le manifeste. Ils ne prouvent pas que ces octets constituent l’état réel. Les cosignataires de la dorsale comparent déjà chaque manifeste avec leur propre instantané ; à partir de la version 0.5.8, un nœud qui rejoint le réseau ajoute une vérification de son cru, au cas où on lui aurait remis un faux manifeste.

Après le chargement, le nœud choisit jusqu’à 8 comptes et 8 nœuds du registre dans son nouvel état. Le choix est dicté par le hachage de l’instantané lui-même, de sorte que chaque nœud qui rejoint le réseau choisit les mêmes lignes et qu’un faussaire ne peut pas savoir à l’avance lesquelles rendre cohérentes. Le nœud demande à 3 pairs enregistrés tirés au hasard le solde de chaque compte ainsi que la clé et le statut de chaque nœud à la hauteur de l’instantané. Les réponses honnêtes sur une même chaîne à une même hauteur sont identiques.

  • Au moins 2 pairs sont d’accord et aucun ne contredit : le nœud poursuit.
  • Les contradictions ne sont pas minoritaires : il élargit le sondage à 7 pairs et exige alors au moins 2 réponses concordantes et l’accord d’au moins deux tiers des pairs qui répondent.
  • Sinon, il refuse l’instantané et se rabat sur une synchronisation bloc par bloc.

Si trop peu de pairs répondent, le nœud poursuit sur la seule foi des hachages.

À partir du hachage de l’instantané, le nœud choisit 8 comptes et 8 nœuds et interroge 3 pairs. Au moins 2 concordants et aucun contradictoire : poursuivre. Contradictions non minoritaires : interroger 7 pairs ; au moins deux tiers concordants : poursuivre ; sinon refuser et se synchroniser bloc par bloc.
À partir du hachage de l’instantané, le nœud choisit 8 comptes et 8 nœuds et interroge 3 pairs. Au moins 2 concordants et aucun contradictoire : poursuivre. Contradictions non minoritaires : interroger 7 pairs ; au moins deux tiers concordants : poursuivre ; sinon refuser et se synchroniser bloc par bloc.

Pourquoi le résultat est digne de confiance

  • Le bloc dorsal qui nomme l’instantané a été cosigné par deux tiers des sièges, après que chacun eut comparé le manifeste avec son propre instantané.
  • Chaque segment, ainsi que le fichier entier, doit correspondre aux hachages du manifeste.
  • Un échantillon de l’état chargé est recoupé avec des pairs enregistrés indépendants, choisis au hasard, chaque fois qu’un nombre suffisant d’entre eux répond.
  • Chaque bloc postérieur à l’instantané est entièrement validé.
  • La dorsale elle-même peut être ancrée par l’épingle de version livrée avec la version du nœud.

Personne ne signe les instantanés à la main, aucun site web n’est cru sur parole, et rien n’est rejoué depuis le bloc 0.

Voir aussi