Uso de un oráculo aleatorio tomando como ejemplo una lotería

Una mañana, me topé con un artículo sobre un generador de números aleatorios verificable en la plataforma de blockchain Waves.

El panorama general era claro, pero el método de implementación específico no. ¿Códigos, firmas, qué, dónde, para qué?

Después de varias consultas con el autor del oráculo, logré combinar la lógica del sorteo (implementada en PHP) con el algoritmo para obtener un número aleatorio.

  1. En el momento de inicio del torneo/ronda, solicitamos al oráculo la primera parte del código (R-code).

    En este momento, no hay información sobre el número de jugadores, ni sobre la cantidad de premios, ni sobre el tamaño de los pagos de premios y, en general, sobre la existencia de la lotería. El oráculo emite un código aleatorio personal a través de una transacción, que solo puede ser utilizado una vez y únicamente por quien lo ha solicitado. Por cierto, el R-code puede ser "comprado" (se refiere al costo de la transacción de solicitud + compensación al oráculo por la transacción de respuesta, que es un monto de aproximadamente $0.015 según el tipo de cambio actual; el código en sí se emite gratis) por adelantado, para no tener que esperar la transacción de respuesta. Yo creé un pequeño búfer que se llena regularmente en la base de datos.

  2. El torneo dura generalmente 60 bloques de la plataforma blockchain Waves, lo que actualmente equivale a aproximadamente 1 hora. El torneo se considera realizado y cerrado si después de 60 bloques hay al menos dos boletos, de lo contrario, el tiempo de actividad del torneo se extiende por otros 60 bloques.
  3. Inmediatamente después de cerrar el torneo, generamos y enviamos la transacción de datos (por la cual también pagamos una comisión de aproximadamente $0.005), y, si es necesario, varias en las que se registran todas las condiciones del sorteo y una lista ordenada de jugadores (boletos) de los que necesitamos elegir ganadores.
  4. En esta etapa ya tenemos la primera parte del código (R-code) más el ID de la transacción de datos (TXID). Los enviamos para ser firmados por el oráculo en forma de concatenación (R-code + TXID), nuevamente pagamos una comisión + compensación. El oráculo verifica los datos recibidos en cuanto a su singularidad y pertenencia, y en respuesta nos envía la segunda parte del código (S-code) en formato sha256, que es el punto de partida para el generador de números aleatorios.
  5. Para obtener un número aleatorio que indique el número de orden del boleto ganador, convertimos el S-code de los datos binarios sha256 a representación hexadecimal (HEX). Luego, de la cadena HEX obtenida, obtenemos un número. Calculamos el residuo de la división del número obtenido entre la cantidad de boletos (all_tickets) y sumamos 1 al resultado (para obtener un dígito de 1 a all_tickets). Al final, obtenemos el número de orden del ganador.
  6. Si hay varios ganadores según las condiciones del sorteo, repetimos las operaciones anteriores en una cantidad igual al número de premios. En cada ocasión, eliminamos de la lista el boleto que ya ganó y reducimos all_tickets en 1, usando el número obtenido anteriormente en lugar del S-code.

Analicemos un caso práctico concreto, torneo Nº119:

Un total de 7 boletos (all_tickets)
El costo del boleto es de 50 monedas (Bet)
La comisión de juego es del 10% (Fee)

Según las condiciones de la lotería, el 30% va a premios, es decir, en este caso 2 boletos deben recibir un premio, cuyo monto se calcula según la fórmula (Bet*all_tickets-Fee)/2.

1. Obtuvimos el R-code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Después de cerrar el torneo, tenemos una lista de boletos en forma de pares: número + dirección (dirección de la billetera desde la que se realizó el pago de la participación en el torneo). Notemos que las direcciones pueden repetirse, lo que significa que un participante compró varios boletos en un solo torneo, lo cual no está prohibido por las reglas.

Enviamos la fecha de la transacción: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Solicitamos el S-code: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV con comentario (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Recibimos el S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Determinamos a los ganadores.

6. Enviamos los pagos

Como resultado, tenemos en la blockchain un registro paso a paso del procedimiento del sorteo de premios, con la posibilidad de verificarlo en cualquier momento. Manipular los resultados desde el lado del organizador es prácticamente imposible; al menos, hacerlo de manera desapercibida ya no será posible.

determinar el ganador n.º 1

Todos_los_boletos:
Índice: 1 Boleto:139
Índice: 2 Boleto:141
Índice: 3 Boleto:143
Índice: 4 Boleto:145
Índice: 5 Boleto:147
Índice: 6 Boleto:149
Índice: 7 Boleto:151

1. bin -> hex ( bin2hex(sha256(S-código)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596

2. hex -> número gmp: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342

3. gmp -> módulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4

4. módulo -> boleto: 4 -> 145

determinar el ganador n.º 2

Todos_los_boletos:

Índice: 1 Boleto:139
Índice: 2 Boleto:141
Índice: 3 Boleto:143
Índice: 4 Boleto:147
Índice: 5 Boleto:149
Índice: 6 Boleto:151

1. bin -> hex ( bin2hex(sha256(hex anterior)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> número gmp: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> módulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. módulo -> boleto: 1 -> 139

Fin.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster