Una mañana, un artículo sobre el
generador de números aleatorios probado en la cadena de bloques de la plataforma Waves me llamó la atención.
El panorama general era comprensible, pero el método de implementación específica no lo era. ¿Códigos, firmas, qué, dónde, por qué?
Algunas consultas con el autor del oráculo, como resultado resultó combinar la lógica del sorteo (implementado en PHP) con un algoritmo para obtener un número aleatorio.
- Al comienzo del torneo / ronda, le pedimos al oráculo la primera parte del código (código R).
En este momento, no hay información sobre el número de jugadores, ni sobre el número de premios, ni sobre el tamaño de los pagos de premios y, en general, sobre la existencia de una lotería. El oráculo a través de una transacción emite un código aleatorio personal, que en el futuro puede usarse solo una vez y solo para aquellos que lo solicitaron. Por cierto, el código R se puede "comprar" (refiriéndose al costo de la transacción de solicitud + compensación de oráculo para la transacción de respuesta, este es un monto del pedido de $ 0.015 a la tasa actual, el código en sí se emite sin cargo) por adelantado de inmediato, para no esperar a que la transacción de respuesta se reciba más tarde. Hice un pequeño búfer actualizado regularmente en la base de datos. - El torneo dura de serie con 60 bloques de la cadena de bloques de la plataforma Waves, en este momento es de aproximadamente 1 hora. Un torneo se considera celebrado y cerrado si después de 60 bloques habrá al menos dos entradas, de lo contrario, el tiempo de actividad del torneo se extenderá en los próximos 60 bloques.
- Inmediatamente después del cierre del torneo, formamos y enviamos la fecha de la transacción (también pagamos una comisión de aproximadamente $ 0.005 por ella), si es necesario, algunos, en los que se fijan todas las condiciones del sorteo y una lista ordenada de jugadores (boletos) de los cuales debemos elegir los ganadores.
- En esta etapa, ya tenemos la primera parte del código (código R) más el ID de la fecha de transacción (TXID). Los enviamos al oráculo para su firma en forma de concatenación (código R + TXID), nuevamente pagamos una comisión + compensación. El oráculo verifica la unicidad y pertenencia de los datos, y en respuesta nos envía la segunda parte del código (código S) en formato sha256, que es el punto de partida para el generador de números aleatorios.
- Para obtener un número aleatorio que indique el número de secuencia del boleto ganador, convertimos el código S de datos binarios sha256 a una representación hexadecimal (HEX). Luego, de la cadena HEX resultante, obtenemos un número. Obtenemos el resto de dividir el número resultante entre el número de tickets (all_tickets) y lo sumamos al resultado 1 (para obtener el número 1 en all_tickets). Como resultado, obtenemos el número de serie del ganador.
- Si hay varios ganadores bajo los términos del sorteo, entonces repetimos las operaciones anteriores en una cantidad igual al número de premios. Al mismo tiempo, cada vez que eliminamos el boleto que ya ganamos de la lista y reducimos all_tickets en 1, y en lugar del código S, indicamos el número recibido anterior.
Analicemos un ejemplo concreto de la vida real, el torneo No. 119:
Solo 7 boletos (all_tickets)
Precio del boleto 50 monedas (Apuesta)
Tarifa del juego 10% (tarifa)
Según las condiciones de la lotería, el 30% obtiene el premio, es decir en este caso, 2 boletos deben recibir un premio cuyo tamaño se calcula utilizando la fórmula (Bet * all_tickets-Fee) / 2.
1. Código R recibido:
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE2. Después del cierre del torneo, tenemos una lista de entradas en forma de pares: número + dirección (dirección de billetera desde la que se pagó la participación en el torneo). Tenga en cuenta que las direcciones pueden repetirse, esto significa que un participante compró varias entradas en un torneo, esto no está prohibido por las reglas.
Fecha de transacción enviada:
82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S3. Código S solicitado:
FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV con comentario (código R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Código S recibido:
Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC5. Los ganadores fueron determinados.
6.
Pagos enviadosComo resultado, tenemos en la cadena de bloques una fijación paso a paso del proceso de sorteo de premios con la capacidad de verificarlo en cualquier momento. Es casi imposible manipular los resultados del organizador, al menos no funcionará en silencio.
determine the winner № 1 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:145 Index: 5 Ticket:147 Index: 6 Ticket:149 Index: 7 Ticket:151 1. bin -> hex ( bin2hex(sha256(S-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 2. hex -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342 3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4 4. modulo -> ticket: 4 -> 145 determine the winner № 2 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:147 Index: 5 Ticket:149 Index: 6 Ticket:151 1. bin -> hex ( bin2hex(sha256(previous hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 2. hex -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360 3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1 4. modulo -> ticket: 1 -> 139 End.