Generador de ganadores aleatorios de lotería

Estoy creando un contrato inteligente que simula un juego de lotería: los usuarios compran boletos de un grupo fijo de boletos y, al final, se extrae un número de boleto aleatorio para el ganador. Ahora me preocupa el proceso de selección del número de boleto aleatorio que es el boleto ganador.

Estaba leyendo esta publicación: ¿Cómo puedo generar de forma segura un número aleatorio en mi contrato inteligente?

y todavía no entiendo por qué no puedo simplemente generar un número aleatorio en el rango 1 - amount of ticketsy asignarlo a los boletos ganadores, usando el equivalente a:

randomNum = 1 + (int)(Math.random() * amount_of_tickets); 

Esto suena muy trivial, pero no veo cómo sería injusto o cómo podría manipularse, ya que cada boleto tendría las mismas posibilidades de ser seleccionado. También se sugirió que debería usar el hash de la cabeza de la cadena en este cálculo, nuevamente, no entiendo por qué esto sería beneficioso o necesario.

Respuestas (3)

No puede hacer números aleatorios en Ethereum directamente . Puede utilizar un servicio como Oracle para generarlo. Aquí hay un tutorial que escribí no hace mucho con los detalles de implementación: https://hackernoon.com/building-a-raffle-contract-using-oraclize-e746e5edff6b

No puede usar Math.randomporque Ethereum no tiene Math.random.

Ethereum no tiene Math.randomporque todos los cálculos deben ser deterministas para que puedan ser validados por diferentes nodos en la red, lo que no funciona si todos arrojan números diferentes.

No existe tal cosa como Math.random en la cadena de bloques de Ethereum. Si lo hubiera, los mineros podrían jugar con el sistema y acceder a Math.random antes de transmitir un bloque. Si transmitir el bloque significa que pierden 100,000 ETH, simplemente no lo transmitirán e intentarán hacer un bloque que los haga ganar. Fácilmente podrían engañar al sistema.

La solución más común para esto es Oracles. Un servicio fuera de la cadena que inyecta valores "aleatorios" (si elige confiar en ellos) en la cadena de bloques. El proveedor más popular de valores aleatorios en cadena es probablemente Oraclize (Nota: no tengo afiliación con Oraclize)