Maison >Périphériques technologiques >Industrie informatique >Pièges de solidité: génération de nombres aléatoires pour Ethereum

Pièges de solidité: génération de nombres aléatoires pour Ethereum

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌original
2025-02-16 10:44:09659parcourir

Solidity Pitfalls: Random Number Generation for 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

  • Le langage de solidité lui-même ne peut pas générer de vrais nombres aléatoires en raison de sa nature déterministe et du coût élevé des algorithmes complexes. Les développeurs doivent être conscients que, dans certains cas, un attaquant peut prédire les résultats.
  • Une façon courante de générer des nombres pseudo-aléatoires dans la solidité est d'utiliser l'algorithme de générateur de congruence linéaire (LCG). Cependant, cela ne fonctionne pas pour les applications de sécurité de mot de passe et s'appuyant sur block.timestamp et block.difficulty, les mineurs peuvent manipuler ces valeurs.
  • ChainLink VRF (fonction aléatoire vérifiée) fournit une solution pour générer des nombres aléatoires éprouvés dans la solidité. Il utilise la vérification aléatoire de la chaîne et le mélange de mots de passe pour s'assurer que les nombres sont des nombres vraiment aléatoires.
  • Les autres mécanismes de génération de nombres aléatoires incluent: les horloges d'alarme Ethereum pour les transactions de planification; contrats intelligents.

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:

  • Acceptez l'entrée
  • Exécuter un algorithme sur l'entrée
  • Obtenez le module de la sortie (divisé par le nombre maximum dans la plage souhaitée)
  • Sortir 0 à la valeur entre le nombre maximum dans la plage souhaitée

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.

  1. 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.

  1. Entrée de loterie - Toutes les données

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.

  1. ChainLink Vrf

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.

  1. Autres mécanismes

4.1 Écorce d'alarme Ethereum

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.

4.2 Entrée de données aléatoires

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.

4,3 Block Number Monitor

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 .

4.4 Création de contrats intelligents Iolite

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)

Pourquoi est-il difficile de générer des nombres aléatoires dans la solidité?

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.

Quelles sont les méthodes courantes pour générer des nombres aléatoires dans la solidité?

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.

Quels sont les risques d'utiliser la fonction de hachage Keccak256 pour générer des nombres aléatoires?

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.

Comment générer des nombres aléatoires dans Solidity en utilisant Oracle Service?

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.

Engagement - Quel est le rôle de révélation des schémas dans la génération de nombres aléatoires?

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.

Pourquoi est-il important de générer de vrais nombres aléatoires dans des contrats intelligents?

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 peut-elle être utilisée pour générer des nombres aléatoires dans la solidité?

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.

Quelles sont les limites de l'utilisation de l'horodatage du bloc actuel pour générer des nombres aléatoires?

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.

Comment générer des nombres aléatoires à l'aide de Randao Beacon?

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.

Y a-t-il des améliorations ou des propositions à venir pour générer des nombres aléatoires dans la solidité?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn