Usando un oráculo aleatorio usando o exemplo dunha lotería

Unha mañá atopeime cun artigo sobre xerador de números aleatorios verificables na cadea de bloques da plataforma Waves.

A imaxe xeral era clara, pero o método de implementación específico non. Algúns códigos, sinaturas, que, onde, por que?

Varias consultas co autor do oráculo, como resultado, foi posible combinar a lóxica de debuxo (implementada en PHP) cun algoritmo para obter un número aleatorio.

  1. Ao comezo do torneo/rolda, solicitamos ao oráculo a primeira parte do código (código R).

    Neste momento, non hai información sobre o número de xogadores, o número de prazas de premios, o tamaño dos pagos dos premios ou a existencia da lotería en xeral. O oráculo, a través dunha transacción, emite un código persoal aleatorio, que logo pode ser usado só unha vez e só por aqueles que o solicitaron. Por certo, o código R pódese "comprar" (é dicir, o custo da transacción de solicitude + compensación ao oráculo pola transacción de resposta, esta é unha cantidade de aproximadamente 0.015 dólares á taxa actual, o código en si emítese de forma gratuíta). ) varias veces con antelación, para non esperar a recepción da transacción de resposta máis tarde. Fixen un pequeno búfer actualizado regularmente na base de datos.

  2. O torneo adoita durar 60 bloques da cadea de bloques da plataforma Waves, polo momento é de aproximadamente 1 hora. O torneo considérase rematado e pechado se despois de 60 bloques hai polo menos dúas entradas nel, se non, o tempo de actividade do torneo prolóngase aos 60 bloques seguintes.
  3. Inmediatamente despois do peche do torneo, xeramos e enviamos unha transacción de data (tamén pagamos unha comisión de aproximadamente $ 0.005 por iso), se é necesario, varias, na que se rexistran todas as condicións do sorteo e unha lista ordenada de xogadores (entradas). entre os que debemos seleccionar os gañadores.
  4. Nesta fase, xa temos a primeira parte do código (código R) máis o ID da data da transacción (TXID). Enviámolos para sinatura ao oráculo en forma de concatenación (código R + TXID), de novo pagamos unha comisión + compensación. O oráculo comproba a unicidade e a pertenza dos datos recibidos e, como resposta, envíanos a segunda parte do código (código S) en formato sha256, que é o punto de partida para o xerador de números aleatorios.
  5. Para obter un número aleatorio que indicará o número de secuencia do boleto gañador, convertimos o código S dos datos binarios sha256 nunha representación hexadecimal (HEX). A continuación, a partir da cadea HEX resultante, obtemos un número. Obtemos o resto de dividir o número resultante polo número de billetes (todos os_tickets) e sumamos 1 ao resultado (para obter o número 1 antes de todos_tickets). Como resultado, obtemos o número de serie do gañador.
  6. Se, segundo as condicións do sorteo, hai varios gañadores, repetimos as operacións anteriores nunha cantidade igual ao número de prazas do premio. Neste caso, cada vez que eliminamos da lista un boleto que xa gañou e reducimos all_tickets en 1, e en lugar de S-code indicamos o número anterior recibido.

Vexamos un exemplo real específico, o torneo no 119:

Total de 7 entradas (all_tickets)
O billete custa 50 moedas (aposta)
Cota do xogo 10 % (Taxa)

Segundo as condicións do sorteo, o 30% vai para o diñeiro do premio, é dicir. neste caso, 2 boletos deben recibir un premio, cuxo tamaño se calcula segundo a fórmula (Aposta*todos_los_tickets-Taxa)/2.

1. Código R recibido: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Despois do peche do torneo, temos unha lista de entradas en forma de parellas: número + enderezo (o enderezo da carteira desde a que se fixo o pago da participación no torneo). Teña en conta que os enderezos poden repetirse, isto significa que un participante comprou varias entradas para un torneo; isto non está prohibido polas regras.

Data de envío da transacción: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Código S solicitado: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV con comentario (código R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Código S recibido: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Determináronse os gañadores.

6. Pagos enviados

Como resultado, temos unha gravación paso a paso do procedemento de sorteo de premios na cadea de bloques coa posibilidade de comprobalo en calquera momento. É case imposible que o organizador manipule os resultados; polo menos, xa non será posible facelo desapercibido.

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.

Fonte: www.habr.com

Engadir un comentario