Los números aleatorios son números que ocurren en una secuencia con las siguientes dos condiciones obligatorias:
- Los valores se distribuyen uniformemente en un intervalo establecido.
- No se pueden predecir valores futuros basados en resultados pasados.
Ejemplo: En el siguiente ejemplo, hemos creado un contrato con una función que generará un número aleatorio. A continuación se describe paso a paso todo el proceso a seguir.
Paso 1: tome la instancia de now , msg.sender y un nonce incremental .
Paso 2: « empaquetar» las entradas y usar keccak256() para convertirlas en hash de 256 bits.
Paso 3: convierta ese hash en un uint y luego use % 100 para tomar solo los últimos 2 dígitos. Esto nos dará un número totalmente aleatorio entre 0 y 99.
Solidity
// Solidity program to // demonstrate on how // to generate a random number pragma solidity ^0.6.6; // Creating a contract contract GeeksForGeeksRandom { // Initializing the state variable uint randNonce = 0; // Defining a function to generate // a random number function randMod(uint _modulus) internal returns(uint) { // increase nonce randNonce++; return uint(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _ modulus; } }
Aporte:
100
Producción:
Nota: El alias » ahora» para block.timestamp en la línea a continuación se eliminó en la versión 0.7.0, puede usar block.timestamp en lugar de now
return uint(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _modulus;
Posibles ataques con este enfoque:
En Ethereum, todos los Nodes están tratando de resolver el problema y verificar la transacción. Una vez que un Node lo verifica, lo transmite a la red.
Supongamos que creamos una DApp donde lanzamos una moneda donde la cara es el lado ganador. Usamos la función anterior para predecir cara o cruz. Si estuviera ejecutando un Node, podría publicar una transacción solo en mi propio Node y no compartirla. Ejecutaré la función randMod o la función de lanzamiento de moneda hasta que lo haga y solo compartiré la transacción después de haber ganado.
Una forma de resolver esto sería usar un oráculo para acceder a una función de número aleatorio desde fuera de la string de bloques de Ethereum. Hay otros algoritmos criptográficos y funciones de terceros que se pueden utilizar, pero no son seguros o deben auditarse.
Publicación traducida automáticamente
Artículo escrito por ciberexplosion y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA