Wiki ZooBC
Sécurité et architecture

Ce contre quoi protège la preuve de participation

La preuve de participation a été conçue face à un attaquant puissant : capable de faire tourner autant de nœuds et de comptes qu’il le souhaite, voyant chaque message du réseau, exploitant toute faille de la logique et disposant de beaucoup d’argent. Elle suppose seulement que l’attaquant ne peut ni falsifier de signatures, ni trouver de collisions de hachage, ni acheter tous les jetons. Face à cet attaquant, elle vise à empêcher quatre choses : le vol, la censure, la réécriture de l’historique et la perturbation de la chaîne. Cette page passe en revue les principales attaques et les règles qui y répondent.

Acheter la production de blocs

En preuve de travail, le pouvoir suit le matériel ; en preuve d’enjeu, les pièces. Les deux s’achètent rapidement. En preuve de participation, chaque siège enregistré non suspendu a la même chance d’être tiré pour le bloc suivant, quels que soient son solde ou son matériel (voir tirage). Les pièces et les machines seules n’achètent rien : le pouvoir exige des sièges.

Les sièges ne s’obtiennent que par la file d’attente, à un rythme que fixe le protocole. Le premier nouveau venu entre 7 jours après la genèse. Chaque admission fixe ensuite l’attente avant la suivante : 600 jours divisés par le nombre de sièges comptés avant ce nouveau venu, valeur bornée entre 7 et 90 jours. Les sièges de genèse comptent pour 11 au plus, et les sièges suspendus ne comptent pas. Avec 11 sièges, l’attente est d’environ 54,5 jours, si bien que le deuxième nouveau venu arrive vers le jour 61,5. La file est ordonnée par la mise multipliée par le temps d’attente, de sorte qu’un attaquant doit aussi surenchérir sur les candidats honnêtes.

Les identités Sybil

Un attaquant Sybil crée de nombreuses identités pour gagner de l’influence. En preuve de participation, une identité est un siège du registre, et chaque siège a des coûts réels :

  • L’argent. Une mise bloquée d’au moins le minimum de la file d’attente, qui démarre à 100 ZBC (les sièges peuvent le fixer par vote entre une unité atomique et 250 ZBC, et à l’entrée, la moitié de la mise médiane en file d’attente peut le relever). 10 % de cette mise sont exposés à une perte.
  • Le temps. Une place dans une file d’attente ordonnée par mise × temps d’attente, et une admission cadencée : des semaines ou des mois entre deux nouveaux venus.
  • Le travail. Un nouveau siège démarre avec un score de participation de 20 % et ne gagne rien tant qu’il n’est pas mature : 4 unités de score après l’admission plus un bloc à lui, soit 2 jours tant que le registre compte moins de 2 880 nœuds. Il doit ensuite continuer à produire ses tours et à relayer.

Un siège qui se tait est compté comme manquant, ne gagne rien et perd du score ; à zéro, il est expulsé et 10 % de sa mise bloquée vont au fonds de longévité. Les mêmes 10 % sont perdus par un siège qui part alors qu’il est manquant ou suspendu, ou par un candidat qui quitte la file d’attente. Une sortie en règle restitue la totalité de la mise bloquée après un délai de carence de 7 jours. Voir tours manqués, suspension et expulsion et quitter le registre.

Trois colonnes de coûts par identité. Argent : mise d’au moins le minimum de la file d’attente (à partir de 100 ZBC), 10 % exposés. Temps : file ordonnée par mise × attente, une admission par cycle. Travail : départ à 20 %, aucun revenu avant la maturité, le silence mène à l’expulsion à 0.
Trois colonnes de coûts par identité. Argent : mise d’au moins le minimum de la file d’attente (à partir de 100 ZBC), 10 % exposés. Temps : file ordonnée par mise × attente, une admission par cycle. Travail : départ à 20 %, aucun revenu avant la maturité, le silence mène à l’expulsion à 0.

Une majorité des sièges

Supposons qu’un attaquant contrôle effectivement plus de la moitié des sièges. Il produirait la plupart des blocs et pourrait bâtir la branche la plus lourde, ce qu’une majorité obtient sur toute conception fondée sur la chaîne la plus lourde. Il pourrait :

  • retarder ou censurer des transactions en les écartant de ses blocs ;
  • remplacer des blocs récents, dans la limite de retour arrière, en bâtissant une branche plus lourde.

Il ne pourrait rien falsifier. Chaque nœud vérifie chaque bloc : la signature de chaque transaction, la preuve de graine de chaque bloc, chaque reçu et chaque montant de coinbase. Une majorité ne peut pas dépenser les ZBC de comptes dont elle ne détient pas les clés, ne peut pas se verser plus que ne le prévoit le barème fixe de la coinbase, et ne peut pas réécrire l’historique au-delà de 720 blocs (3 heures) ni sous le dernier point de contrôle de la dorsale (voir finalité et retour arrière). Les blocs produits après des tours sautés pèsent aussi moins lourd, et les sièges inactifs perdent leur revenu et leur score.

Deux colonnes. Peut : censurer ou retarder des transactions, remplacer des blocs parmi les 720 derniers. Ne peut pas : falsifier des signatures, dépenser les pièces d’autrui, frapper des pièces en plus, descendre sous le point de contrôle de la dorsale. Une chaîne dont les 720 derniers blocs sont marqués et un point de contrôle de la dorsale plus en arrière : l’historique ancien reste en place.
Deux colonnes. Peut : censurer ou retarder des transactions, remplacer des blocs parmi les 720 derniers. Ne peut pas : falsifier des signatures, dépenser les pièces d’autrui, frapper des pièces en plus, descendre sous le point de contrôle de la dorsale. Une chaîne dont les 720 derniers blocs sont marqués et un point de contrôle de la dorsale plus en arrière : l’historique ancien reste en place.

Manipuler la graine

La graine qui pilote chaque tirage est la sortie d’une fonction aléatoire vérifiable : un producteur ne peut pas la choisir parmi plusieurs valeurs. Son seul levier est de retenir son bloc, ce qui lui coûte un tour manqué, des revenus et du score, et ne fait que confier la graine au nœud tiré suivant (voir graine du bloc (VRF)).

Réécrire l’historique depuis un passé lointain

Une attaque à longue portée bâtit un historique différent à partir d’un passé lointain, par exemple avec les anciennes clés de nœuds qui ont quitté le registre depuis longtemps. Chacune des défenses suivantes l’arrête à elle seule :

  • un nœud en fonctionnement ne revient jamais en arrière de plus de 720 blocs ;
  • aucun nœud ne se réorganise sous le dernier point de contrôle cosigné sur la chaîne dorsale ;
  • un nouveau nœud suit la dorsale, dont les blocs nécessitent deux tiers des sièges et qui consigne quelles clés de nœud sont arrivées et lesquelles sont parties, si bien que les clés parties depuis longtemps ne figurent pas sur sa liste des signataires ;
  • la version qu’installe un nouveau nœud peut porter une épingle de version, de sorte qu’un historique de dorsale falsifié est refusé au démarrage.

Les clés n’expirent pas, et personne n’examine les branches à la main.

L’éclipse

Dans une attaque par éclipse, l’attaquant entoure un nœud de ses propres pairs pour que le nœud ne voie que la chaîne de l’attaquant. Contre un nœud enregistré, c’est difficile. Ses pairs assignés, 12 sur le mainnet, sont tirés à partir de la graine d’un bloc de période et tirés à nouveau tous les 40 blocs (environ 10 minutes), de sorte que l’attaquant ne peut pas les choisir (voir reçus et la topologie du réseau). Les pairs prouvent leur clé de nœud par une poignée de main signée qui nomme aussi le hachage de genèse de la chaîne. Et un seul pair honnête suffit : le choix de branche se fait au poids, de sorte qu’une seule connexion signalant une branche plus lourde permet au nœud de la récupérer et de la vérifier bloc par bloc. Un nœud dont le sommet est devenu périmé suit le sommet que signalent deux tiers d’un échantillon de pairs enregistrés.

Le trafic entre pairs circule en gRPC en clair, sans chiffrement : la protection vient des signatures et de la vérification, pas du secret.

Autres attaques

  • La double signature d’un bloc est prouvée par un EquivocationReport et imputée comme un tour manqué (voir double signature (équivocation)).
  • Le rejeu d’une transaction signée sur une autre chaîne ZooBC échoue, car chaque signature couvre le hachage de genèse de la chaîne (voir signatures liées à la chaîne).
  • Les instantanés falsifiés sont repérés grâce aux hachages nommés dans la dorsale cosignée et à un échantillon recoupé avec des pairs enregistrés (voir instantanés et synchronisation rapide).

Voir aussi