Maison >Périphériques technologiques >Industrie informatique >Pièges de solidité: génération de nombres aléatoires pour Ethereum
Cet article est parrainé et créé par Iolite. Merci de soutenir les partenaires qui ont rendu le point de point possible.
Solidity est un langage relativement nouveau qui contient des problèmes liés au code et son utilisation prévue car il n'y a pas de code parfait. Cet article vous guidera les meilleures pratiques et les pièges lors de l'utilisation de nombres aléatoires comme entrée pour les contrats intelligents Ethereum.
Points clés
block.timestamp
et block.difficulty
, les mineurs peuvent manipuler ces valeurs. Génération de nombres aléatoires de solidité
Solidité incapable de créer des nombres aléatoires. En fait, tous les algorithmes qui créent des nombres aléatoires sont un pseudo-aléatoire - aucun langage ne peut créer des nombres complètement aléatoires. Le problème de la solidité est que les algorithmes complexes sont trop chers et donc une solution plus basique est utilisée. En dehors de cela, le code de solidité doit être déterministe, car il fonctionnera sur plusieurs nœuds. Nous avons besoin d'un algorithme qui peut générer un nombre aléatoire à la fois et l'utiliser sur plusieurs nœuds. Des informations telles que le temps d'horloge ne sont pas disponibles pour générer des nombres aléatoires, nous devons donc rechercher d'autres options. En tant que développeur, vous devez être conscient de ce problème car un attaquant est en mesure de prédire les résultats dans certaines situations.
L'un des algorithmes les plus couramment utilisés est le "générateur de congruence linéaire" (LCG). C'est l'un des algorithmes les plus anciens, rapide et facile à comprendre. Les LCG sont un bon choix pour les systèmes embarqués car ils n'ont qu'une mémoire limitée. Cependant, cela ne fonctionne pas avec les applications de sécurité de mot de passe. Néanmoins, il est toujours utilisé dans les contrats intelligents, car les algorithmes rapides sont moins chers en termes de coûts de gaz.
L'algorithme lui-même effectue les étapes suivantes:
Explorons différentes façons de créer des nombres aléatoires à l'aide de l'exemple de contrat intelligent de la loterie. Les utilisateurs peuvent rejoindre la loterie en envoyant 0,1 éther au contrat et un entier entre 0 et 250.
block.timestamp
& block.difficulty
Chaque fois que le mineur confirme une transaction, A block.timestamp
est attribué. Aucun joueur sur notre contrat de loterie ne peut le contrôler. Jetons un coup d'œil à ce code utilisé pour créer des nombres aléatoires.
<code class="language-solidity">function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }</code>
Trouvez Gist ici.
Ce code hache d'abord l'horodatage et la difficulté du bloc. Ensuite, nous convertissons la valeur de hachage en un entier et la divisons par 251 pour obtenir un entier entre 0 et 250. Cependant, le problème avec ce code est que nous ne devons pas faire confiance aux mineurs pour choisir le gagnant.
Nous avons besoin de données plus arbitraires pour sélectionner notre gagnant. Nous pouvons utiliser l'adresse des joueurs qui sont entrés dans notre contrat intelligent de loterie, mais nous devons le cacher car ils peuvent en abuser. Étant donné que toutes les informations sont enregistrées sur la blockchain, ces informations ne peuvent pas être cachées.
les chiffres qui peuvent être soumis à notre contrat intelligent de loterie. Les utilisateurs doivent avoir le numéro de hachage qu'ils ont sélectionné avec leur adresse Ethereum. Cela nous donne un nombre assez aléatoire.
avec cela étant dit, le caractère aléatoire est possible, mais il vous suffit d'utiliser un oracle pour obtenir le nombre aléatoire de l'extérieur de la blockchain. Le problème avec l'utilisation de données externes est qu'il est très difficile de prouver que le nombre est réellement aléatoire et de s'assurer que l'entité hors chaîne ne manipule en aucune façon le nombre aléatoire. C'est là que ChainLink VRF entre en jeu. ChainLink VRF (fonction aléatoire vérifiée) est la façon dont nous obtenons des nombres aléatoires prouvés dans la solidité.
ChainLink VRF ajoute un événement à la blockchain à partir de laquelle le nœud ChainLink lit l'événement et renvoie un nombre aléatoire. Les vérifications de l'aléatoire en chaîne sont effectuées via le soi-disant coordinateur VRF. Cela utilise un hachage de clé spécifique de l'Oracle et une phrase de graines de l'utilisateur, ainsi qu'une cryptographie pour s'assurer que le nombre est un vrai nombre aléatoire. De cette façon, nous pouvons obtenir un nombre aléatoire impartial.
Les développeurs doivent considérer quand choisir un gagnant. Des informations telles que le temps d'horloge ne sont pas disponibles dans la machine virtuelle Ethereum, car le code s'exécutera à différents moments sur plusieurs nœuds. Cela rend plus difficile le choix du gagnant. Une façon consiste à implémenter une fonction dans votre contrat intelligent qui désactivera la loterie et sélectionnera le gagnant. Ce n'est pas aussi décentralisé que nous l'aurions espéré. Le propriétaire du contrat peut fermer la loterie lorsqu'il est déterminé que son ami gagnera. Nous devons éviter ce genre de tricherie.
Une meilleure option consiste à utiliser le réveil Ethereum. Il s'agit d'un service qui permet d'exécuter les transactions de planification plus tard sur la blockchain Ethereum. Ce service est entièrement sans confiance, ce qui signifie que l'ensemble du service fonctionne comme un contrat intelligent. Fondamentalement, l'alarme Ethereum utilise des numéros de bloc pour planifier les transactions. Notez que cela ne signifie pas que le contrat commencera seul. Il s'appuie sur l'intérêt de l'utilisateur à appeler la fonction "Select Winner" (éther récompense). Bien sûr, si personne n'appelle votre fonction, votre loterie échouera.
random.org fournit une API qui fournit une source de données aléatoire via JSON. Ethereum Smart Contracts peut utiliser cette source de données pour alimenter les algorithmes pour sélectionner des nombres aléatoires. Parce que la sécurité est importante, les signatures numériques peuvent être utilisées. Les données aléatoires seront signées par Random.org. Vous pouvez vérifier l'intégrité des données afin que vous puissiez prouver qu'elle provient bien de Random.org et que les données n'ont pas été falsifiées.
Randao est un nouveau projet dans le champ Blockchain, en se concentrant entièrement sur la fourniture de nombres aléatoires. Ils utilisent une combinaison d'oracles et de contrats intelligents pour vous donner des nombres aléatoires. Cependant, les services Randao sont actuellement très lents. Si vous avez une application que vous utilisez fréquemment, ce n'est pas idéal.
Vous pouvez également utiliser un moniteur dans votre code qui vérifie le numéro de bloc jusqu'à ce qu'il correspond au numéro cible que vous définissez.
<code class="language-solidity">function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }</code>
Source. GIST .
iolite crée un produit qui accepte le langage naturel pour créer des contrats intelligents. Il utilise le moteur de traitement du langage naturel de Stanford (NLP), appelé le moteur d'adaptation rapide (FAE). Iolite s'appuie sur des experts de la solidité pour la formation communautaire. Un expert de la solidité (contributeur) peut définir une structure contenant une ou plusieurs phrases et l'ajoutant au code du contrat intelligent correspondant.
Le moteur NLP Stanford est conçu pour comprendre les langues complexes. La complexité du langage dépend de la quantité de formation à la machine. Après une formation appropriée, le moteur sera en mesure de créer des contrats intelligents complexes. Fae est capable de créer de tels contrats car les contrats complexes ne sont pas vraiment compliqués. Les experts peuvent diviser la demande en plusieurs extraits de code plus petits et l'ajoutant en une phrase.
Lorsque quelqu'un entre plusieurs phrases, il recherchera la structure / phrase correspondante pour construire un contrat "complexe". Les contributeurs recevront des récompenses de jetons Iolite grâce au processus d'extraction de la nouvelle structure.
L'avantage de l'utilisation de l'IOLITE est que les experts en contrat intelligent peuvent résoudre des problèmes tels que la génération de nombres aléatoires pour vous. Vous pouvez trouver plus d'informations sur iolite.io.
Conclusion
Comme vous pouvez le voir, la génération d'une véritable entrée aléatoire n'est pas facile. Ne comptez pas sur block.timestamp
, now
et block.blockhash
comme sources de hasard. Une bonne solution comprend la combinaison de plusieurs entrées de données pseudo-aléatoires et l'utilisation d'oracles ou de contrats intelligents pour le rendre plus fiable. Vous devez être sûr à 100% que personne ne peut altérer les données conclues dans le contrat intelligent.
Veuillez être prudent et réfléchir à deux fois avant d'implémenter une logique de génération de nombres aléatoires.
FAQ pour la génération de nombres aléatoires dans la solidité (FAQ)
Solidity (le langage de programmation utilisé pour écrire des contrats intelligents Ethereum) n'a pas de fonctions intégrées pour générer des nombres aléatoires. En effet, la blockchain (la technologie de base d'Ethereum) est essentiellement déterministe. Cela signifie que compte tenu d'un ensemble d'entrées, la sortie sera toujours la même. Cette certitude est cruciale pour maintenir l'intégrité et la sécurité de la blockchain. Cependant, cela fait de la génération de vrais nombres aléatoires un défi, car le concept d'aléatoire est intrinsèquement non déterministe.
Les développeurs utilisent plusieurs méthodes pour générer des nombres pseudo-aléatoires dans la solidité. Une méthode courante consiste à utiliser la fonction de hachage Keccak256, dont l'entrée est difficile à prévoir, comme l'horodatage du bloc actuel et la difficulté du bloc. Une autre approche consiste à utiliser un service Oracle qui fournit des nombres aléatoires à partir de sources hors chaîne. Cependant, chaque approche a ses propres limites et ses risques de sécurité potentiels.
Bien que la fonction de hachage Keccak256 puisse être utilisée pour générer des nombres pseudo-aléatoires, il pose certains risques de sécurité potentiels. Étant donné que les entrées des fonctions de hachage telles que les horodatages de blocs actuels et la difficulté du bloc sont accessibles au public sur la blockchain, les mineurs malveillants peuvent manipuler ces valeurs pour affecter la sortie générée par des nombres aléatoires.
Les services originaux peuvent fournir des nombres aléatoires à partir de sources hors chaîne. Ces services agissent comme un pont entre la blockchain et le monde extérieur, permettant aux contrats intelligents d'interagir avec des données qui ne sont pas disponibles pour la blockchain lui-même. Cependant, l'utilisation des services Oracle introduit un niveau de confiance, car les contrats intelligents doivent s'appuyer sur Oracles pour fournir des nombres aléatoires précis et impartiaux.
Le schéma de révolution de l'engagement est un moyen de générer des nombres aléatoires de manière décentralisée et sécurisée. Dans le système de révolution de l'engagement, les participants commettent d'abord un numéro secret, puis tous les nombres secrets sont révélés en même temps, et un nombre aléatoire est généré sur la base de ces secrets. Cette approche empêche tout participant unique de pouvoir influencer la sortie générée par des nombres aléatoires.
Les nombres aléatoires réels sont cruciaux pour de nombreux types de contrats intelligents, tels que ceux utilisés pour les jeux de hasard, la loterie et d'autres applications qui nécessitent un aléatoire. Si les nombres aléatoires utilisés dans ces contrats peuvent être prédits ou affectés, cela peut conduire à des résultats injustes et même permettre aux acteurs malveillants d'exploiter le contrat.
La fonction Blockhash dans la solidité peut être utilisée pour générer des nombres pseudo-aléatoires. Cette fonction renvoie la valeur de hachage du numéro de bloc donné, qui est imprévisible et varie avec chaque bloc. Cependant, cette méthode a ses limites. Par exemple, la fonction Blockhash ne fonctionne que sur les 256 blocs les plus récents, et le blocage des blocs futurs ne peut pas être connu avant l'exploitation minière.
Il existe une limitation majeure à l'utilisation de l'horodatage de bloc actuel comme entrée pour générer des nombres aléatoires. Les mineurs ont une certaine influence sur les horodatages des blocs qu'ils exploitent, ce qui signifie qu'ils peuvent manipuler les horodatages pour affecter la sortie générée par des nombres aléatoires.
randao (nombre aléatoire DAO) La balise est une manière décentralisée et transparente de générer des nombres aléatoires. Les participants au Randao Beacon promettent des numéros secrètes, qui sont ensuite révélés et combinés pour générer un nombre aléatoire. Cette approche est conçue pour empêcher un seul participant de pouvoir influencer la sortie générée par des nombres aléatoires.
La recherche et les propositions sur l'amélioration de la génération de nombres aléatoires dans la solidité et d'autres plateformes de blockchain sont en cours. Par exemple, Ethereum 2.0 (une mise à niveau à venir vers le réseau Ethereum) devrait inclure un générateur de nombres aléatoires intégré. Cependant, avant la mise en œuvre de ces améliorations, les développeurs doivent continuer à utiliser les approches existantes et leurs limitations inhérentes et leurs risques de sécurité potentiels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!