Peut-on générer des nombres aléatoires si nous ne nous faisons pas confiance ? Partie 1

Salut, Habr !

Dans cet article, je vais parler de la génération de nombres pseudo-aléatoires par des participants qui ne se font pas confiance. Comme nous le verrons ci-dessous, réaliser un générateur « presque » bon est assez simple, mais en créer un trÚs bon est difficile.

Pourquoi gĂ©nĂ©rer des nombres alĂ©atoires pour des participants qui ne se font pas confiance ? L'un des domaines d'application est celui des applications dĂ©centralisĂ©es. Par exemple, une application qui accepte une mise d'un participant et double le montant avec une probabilitĂ© de 49 %, ou le prend avec une probabilitĂ© de 51 %, ne fonctionnera que si elle peut obtenir un nombre alĂ©atoire de maniĂšre impartiale. Si un attaquant peut influencer le rĂ©sultat du gĂ©nĂ©rateur de nombres alĂ©atoires et mĂȘme lĂ©gĂšrement augmenter ses chances de recevoir un paiement dans l'application, il pourra facilement la vider.

Lorsque nous développons un protocole distribué de génération de nombres aléatoires, nous voulons qu'il possÚde trois propriétés :

  1. Il doit ĂȘtre impartial. En d'autres termes, aucun participant ne doit avoir d'influence sur le rĂ©sultat du gĂ©nĂ©rateur de nombres alĂ©atoires.

  2. Il doit ĂȘtre imprĂ©visible. En d'autres termes, aucun participant ne doit pouvoir prĂ©dire quel nombre sera gĂ©nĂ©rĂ© (ou en dĂ©duire certaines de ses propriĂ©tĂ©s) avant qu'il ne soit gĂ©nĂ©rĂ©.

  3. Le protocole doit ĂȘtre viable, c'est-Ă -dire rĂ©sistant Ă  ce qu'un certain pourcentage de participants se dĂ©connecte du rĂ©seau ou tente intentionnellement d'arrĂȘter le protocole.

Dans cet article, nous examinerons deux approches : RANDAO + VDF et une approche basée sur des codes de correction d'effacement. Dans la prochaine partie, nous détaillerons l'approche basée sur des signatures seuil.

Mais d'abord, examinons un algorithme simple et souvent utilisé qui est viable, imprévisible mais biaisé.

RANDAO

RANDAO est une approche trÚs simple et donc assez fréquemment utilisée pour obtenir de l'aléa. Tous les participants du réseau choisissent d'abord un nombre pseudo-aléatoire localement, puis chaque participant envoie le hachage du nombre choisi. Ensuite, les participants révÚlent à tour de rÎle leurs nombres choisis, et effectuent une opération XOR sur les nombres révélés, le résultat de cette opération devenant le résultat du protocole.

Un pas de publication des hachages avant de révéler les nombres est nécessaire pour que l'attaquant ne puisse pas choisir son nombre aprÚs avoir vu les nombres des autres participants. Cela lui permettrait en fait de déterminer seul la sortie du générateur de nombres aléatoires.

Tout au long du protocole, les participants doivent parvenir à un consensus à deux reprises : d'abord sur le moment de révéler les nombres choisis, puis de cesser d'accepter les hachages, et ensuite sur le moment de cesser d'accepter les nombres choisis et de calculer le résultat. Prendre de telles décisions entre des participants qui ne se font pas confiance est en soi une tùche difficile, et nous y reviendrons dans de futurs articles. Dans cet article, nous supposerons qu'un tel algorithme de consensus est à notre disposition.

Quelles sont les propriĂ©tĂ©s dĂ©crites ci-dessus qui s'appliquent Ă  RANDAO ? Il est imprĂ©visible, possĂšde la mĂȘme viabilitĂ© que le protocole de consensus qui le sous-tend, mais il est biaisĂ©. En particulier, un attaquant peut observer le rĂ©seau, et une fois que d'autres participants ont rĂ©vĂ©lĂ© leurs nombres, il peut calculer leur XOR et dĂ©cider de rĂ©vĂ©ler ou non son nombre pour influencer le rĂ©sultat. Bien que cela ne permette pas Ă  l'attaquant de dĂ©terminer seul la sortie du gĂ©nĂ©rateur de nombres alĂ©atoires, cela lui donne tout de mĂȘme 1 bit d'influence. Et si les attaquants contrĂŽlent plusieurs participants, le nombre de bits qu'ils contrĂŽlent sera Ă©gal au nombre de participants sous leur contrĂŽle.

Peut-on générer des nombres aléatoires si nous ne nous faisons pas confiance ? Partie 1

L'influence des attaquants peut ĂȘtre fortement rĂ©duite en exigeant que les participants rĂ©vĂšlent leurs nombres dans l'ordre. Dans ce cas, l'attaquant ne pourra influencer le rĂ©sultat que s'il est le dernier Ă  se rĂ©vĂ©ler. Bien que l'influence soit considĂ©rablement rĂ©duite, l'algorithme reste biaisĂ©.

RANDAO + VDF

Une des options pour rendre RANDAO impartial est la suivante : aprÚs que tous les nombres ont été révélés et que le XOR a été calculé, le résultat est introduit dans une fonction qui prend beaucoup de temps à calculer, mais permet de vérifier la précision du calcul trÚs rapidement.

(vdf_output, vdf_proof) = VDF_compute(input) // c'est trĂšs lent
correct = VDF_verify(input, vdf_output, vdf_proof) // c'est trĂšs rapide

Cette fonction s'appelle Verifiable Delay Function, ou VDF. Si le calcul du résultat final prend plus de temps que la phase de divulgation des nombres, un attaquant ne pourra pas prédire l'effet de la démonstration ou de la dissimulation de son nombre, et par conséquent il perdra la capacité d'influencer le résultat.

Le dĂ©veloppement de bons VDF est extrĂȘmement difficile. RĂ©cemment, plusieurs avancĂ©es ont Ă©tĂ© rĂ©alisĂ©es, par exemple celui-ci et celle-ci, qui ont rendu les VDF plus applicables en pratique, et Ethereum 2.0 prĂ©voit Ă  long terme d'utiliser RANDAO avec VDF comme source de nombres alĂ©atoires. En plus du fait que cette approche est imprĂ©visible et impartiale, elle a l'avantage supplĂ©mentaire d'ĂȘtre viable tant qu'au moins deux participants sont disponibles sur le rĂ©seau (Ă  condition que le protocole de consensus utilisĂ© soit viable en tenant compte d'un si petit nombre de participants).

La plus grande difficultĂ© de cette approche rĂ©side dans la configuration d'un VDF de maniĂšre Ă  ce qu'un participant disposant de matĂ©riel spĂ©cialisĂ© trĂšs coĂ»teux ne puisse pas calculer le VDF avant la fin de la phase de divulgation. IdĂ©alement, l'algorithme devrait avoir mĂȘme une marge de sĂ©curitĂ© significative, disons 10x. La figure ci-dessous montre l'attaque d'un participant ayant un ASIC spĂ©cialisĂ©, ce qui lui permet d'exĂ©cuter le VDF plus rapidement que le temps allouĂ© pour la divulgation de la confirmation RANDAO. Un tel participant pourrait toujours calculer le rĂ©sultat final en utilisant ou non son nombre, puis, en se basant sur les calculs, choisir de le montrer ou non.

Peut-on générer des nombres aléatoires si nous ne nous faisons pas confiance ? Partie 1

Pour la famille de VDF mentionnĂ©e ci-dessus, la performance d'un ASIC spĂ©cialisĂ© peut ĂȘtre plus de 100 fois supĂ©rieure Ă  celle d'un Ă©quipement ordinaire. Ainsi, si la phase de divulgation dure 10 secondes, un VDF calculĂ© sur un tel ASIC doit prendre plus de 100 secondes pour avoir une marge de sĂ©curitĂ© de 10 fois, et donc le mĂȘme VDF, calculĂ© sur un Ă©quipement ordinaire, doit prendre 100 x 100 secondes = ~ 3 heures.

La Fondation Ethereum prévoit de résoudre ce problÚme en créant ses propres ASIC publics et gratuits. DÚs que cela se produira, tous les autres protocoles pourront également profiter de cette technologie, mais jusqu'à ce moment-là, l'approche RANDAO + VDF ne sera pas aussi viable pour les protocoles qui ne peuvent pas investir dans le développement de leurs propres ASIC.

De nombreux articles, vidéos et autres informations sur le VDF ont été rassemblés sur ce site.

Utilisation des codes d'effacement

Dans cette section, nous examinerons le protocole de gĂ©nĂ©ration de nombres alĂ©atoires qui utilise des codes d'effacement. Il peut supporter jusqu'Ă  ⅓ d'agresseurs tout en restant viable, et permet l'existence de jusqu'Ă  ⅔ d'agresseurs avant qu'ils ne puissent prĂ©dire ou influencer le rĂ©sultat.

L'idée principale du protocole est la suivante. Pour simplifier, supposons qu'il ait exactement 100 participants. Supposons aussi que tous les participants aient localement une certaine clé privée, et que les clés publiques de tous les participants soient connues de tous :

  1. Chaque participant invente localement une longue chaĂźne, la divise en 67 parties, crĂ©e des codes d'effacement pour obtenir 100 parts, dont 67 suffisent pour reconstruire la chaĂźne, attribue chacune des 100 parts Ă  un participant et les chiffre avec la clĂ© publique du mĂȘme participant. Ensuite, toutes les parts codĂ©es sont publiĂ©es.

  2. Les participants utilisent un certain consensus pour parvenir à un accord sur les ensembles codés de 67 participants spécifiques.

  3. Une fois le consensus atteint, chaque participant prend les parts codées dans chacun des 67 ensembles, chiffrées avec leur clé publique, déchiffre toutes ces parts et publie toutes ces parts déchiffrées.

  4. Une fois que 67 participants ont exĂ©cutĂ© l'Ă©tape (3), tous les ensembles convenus peuvent ĂȘtre complĂštement dĂ©codĂ©s et reconstruits grĂące aux propriĂ©tĂ©s des codes d'effacement, et le nombre final peut ĂȘtre obtenu comme XOR des chaĂźnes initiales dont les participants ont commencĂ© en (1).

Peut-on générer des nombres aléatoires si nous ne nous faisons pas confiance ? Partie 1

Il est possible de montrer que ce protocole est impartial et imprĂ©visible. Le nombre alĂ©atoire rĂ©sultant est dĂ©terminĂ© aprĂšs l'atteinte du consensus, mais il est inconnu pour tous tant que ⅔ des participants n'ont pas dĂ©cryptĂ© les parties chiffrĂ©es avec leur clĂ© publique. Ainsi, le nombre alĂ©atoire est dĂ©fini avant que l'information nĂ©cessaire Ă  sa rĂ©cupĂ©ration ne soit publiĂ©e.

Que se passe-t-il si, Ă  l'Ă©tape (1), l'un des participants envoie aux autres participants des parts codĂ©es qui ne constituent pas un code d'effacement correct pour une certaine chaĂźne ? Sans modifications supplĂ©mentaires, des participants diffĂ©rents ne pourront soit pas rĂ©cupĂ©rer la chaĂźne du tout, soit rĂ©cupĂ©rer des chaĂźnes diffĂ©rentes, ce qui entraĂźnera des nombres alĂ©atoires diffĂ©rents pour chaque participant. Pour Ă©viter cela, il est possible de faire ce qui suit : chaque participant, en plus des parts codĂ©es, calcule Ă©galement un arbre de Merkle , toutes ces parts, et envoie Ă  chaque participant Ă  la fois sa part codĂ©e et la racine de l'arbre de Merkle, ainsi que la preuve de l'inclusion de la part dans l'arbre de Merkle. Au consensus Ă  l'Ă©tape (2), les participants ne se mettent alors pas seulement d'accord sur plusieurs ensembles, mais sur plusieurs racines spĂ©cifiques de ces arbres (si un participant s'Ă©carte du protocole et envoie diffĂ©rentes racines d'arbre de Merkle Ă  diffĂ©rents participants, et que deux de ces racines sont montrĂ©es durant le consensus, sa chaĂźne n'est pas incluse dans l'ensemble rĂ©sultant). À la fin du consensus, nous aurons 67 chaĂźnes codĂ©es et leurs racines d'arbre de Merkle correspondantes, de sorte qu'il y a au moins 67 participants (pas nĂ©cessairement les mĂȘmes qui ont proposĂ© les chaĂźnes correspondantes), ayant pour chacune des 67 chaĂźnes un message avec une part de code d'effacement, et une preuve de l'inclusion de leur part dans l'arbre de Merkle correspondant.

Lorsque, à l'étape (4), un participant déchiffre 67 parts pour une certaine chaßne, et tente de reconstruire la chaßne originale à partir de celles-ci, l'une des options possibles est :

  1. La chaßne est reconstruite, et si elle est ensuite codée à nouveau avec des codes d'effacement, et que l'arbre de Merkle est calculé pour les parts calculées localement, la racine correspond à celle sur laquelle le consensus a été atteint.

  2. La chaßne est reconstruite, mais la racine calculée localement ne correspond pas à celle sur laquelle le consensus a été atteint.

  3. La chaĂźne n'est pas reconstruite.

Il est facile de montrer que si au moins un participant a rencontré l'option (1), alors tous les participants rencontreront l'option (1), et inversement, si au moins un participant a rencontré l'option (2) ou (3), alors tous les participants rencontreront l'option (2) ou (3). Ainsi, pour chaque ligne dans l'ensemble, soit tous les participants parviennent à la restaurer, soit aucun participant ne peut la restaurer. Ensuite, le nombre aléatoire résultant est le XOR uniquement des lignes que les participants ont réussi à restaurer.

Signatures de seuil

Une autre approche Ă  la randomisation consiste Ă  utiliser ce que l'on appelle des signatures de seuil BLS. Un gĂ©nĂ©rateur de nombres alĂ©atoires basĂ© sur des signatures de seuil possĂšde exactement les mĂȘmes garanties que l'algorithme dĂ©crit ci-dessus basĂ© sur des codes effaçables, mais a une asymptotique du nombre de messages Ă©changĂ©s sur le rĂ©seau pour chaque nombre gĂ©nĂ©rĂ© beaucoup plus faible.

Les signatures BLS sont une construction qui permet à plusieurs participants de créer une signature commune pour un message. De telles signatures sont souvent utilisées pour économiser de l'espace et de la bande passante, car elles ne nécessitent pas l'envoi de plusieurs signatures. 

Une application frĂ©quente des signatures BLS dans les protocoles blockchain, en plus de la gĂ©nĂ©ration de nombres alĂ©atoires, est la signature de blocs dans les protocoles BFT. Par exemple, 100 participants crĂ©ent des blocs, et un bloc est considĂ©rĂ© comme final si 67 d'entre eux le signent. Tous peuvent prĂ©senter leurs parties de la signature BLS et utiliser un certain algorithme de consensus pour convenir de 67 d'entre eux, puis les combiner en une seule signature BLS. N'importe quelles 67 (ou plus) parties peuvent ĂȘtre utilisĂ©es pour crĂ©er la signature finale, qui dĂ©pend des 67 signatures spĂ©cifiques qui ont Ă©tĂ© combinĂ©es et peut donc varier, mais malgrĂ© le fait qu'un choix diffĂ©rent de 67 participants produira une signature diffĂ©rente, toute signature de ce type sera une signature valide pour le bloc. Les autres participants n'ont alors qu'Ă  recevoir et vĂ©rifier uniquement une signature par bloc, et non pas 67, ce qui rĂ©duit considĂ©rablement la charge sur le rĂ©seau.

Il s'avĂšre que si les clĂ©s privĂ©es utilisĂ©es par les participants sont gĂ©nĂ©rĂ©es d'une certaine maniĂšre, peu importe quelles 67 signatures (ou plus, mais pas moins) sont agrĂ©gĂ©es, la signature rĂ©sultante sera identique. Cela peut ĂȘtre utilisĂ© comme source d'alĂ©a : les participants conviennent d'abord d'un certain message qu'ils signeront (cela peut ĂȘtre le rĂ©sultat de RANDAO ou simplement le hachage du dernier bloc, en fait cela n'a pas d'importance tant que cela change Ă  chaque fois et est consensuel), et crĂ©ent une signature BLS pour celui-ci. Le rĂ©sultat de la gĂ©nĂ©ration sera imprĂ©visible tant que 67 participants n'auront pas fourni leurs parts, et aprĂšs cela, les rĂ©sultats sont dĂ©jĂ  prĂ©dĂ©finis et ne peuvent pas dĂ©pendre des actions d'un participant.

Cette approche de l'alĂ©a est viable tant qu'au moins ⅔ des participants sont en ligne et suivent le protocole, et elle est impartiale et imprĂ©visible tant qu'au moins ⅓ des participants respectent le protocole. Il est important de noter qu'un attaquant qui contrĂŽle plus d'un tiers mais moins des deux tiers des participants peut arrĂȘter le protocole, mais ne peut pas prĂ©voir ou influencer son rĂ©sultat.

Les signatures de seuil en elles-mĂȘmes sont un sujet trĂšs intĂ©ressant. Dans la deuxiĂšme partie de cet article, nous examinerons en dĂ©tail comment elles fonctionnent et comment il est nĂ©cessaire de gĂ©nĂ©rer les clĂ©s des participants pour que les signatures de seuil puissent ĂȘtre utilisĂ©es comme gĂ©nĂ©rateur de nombres alĂ©atoires.

En conclusion

Cet article est le premier d'une série d'articles techniques sur le blog NEAR. NEAR est un protocole blockchain et une plateforme pour le développement d'applications décentralisées mettant l'accent sur la simplicité de développement et la facilité d'utilisation pour les utilisateurs finaux.

Le code du protocole est ouvert, notre implĂ©mentation est Ă©crite en Rust, et elle peut ĂȘtre trouvĂ©e ici.

Vous pouvez voir à quoi ressemble le développement sous NEAR et expérimenter dans l'IDE en ligne ici.

Pour suivre toutes les nouvelles en russe, vous pouvez visiter le groupe sur Telegram et dans groupe sur VKontakte., et en anglais sur le site officiel Twitter.

À bientît !

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster