Generador de Números Aleatorios en Solidity usando keccak256

Los números aleatorios son números que ocurren en una secuencia con las siguientes dos condiciones obligatorias:

  1. Los valores se distribuyen uniformemente en un intervalo establecido.
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *