Користење на случаен пророк користејќи го примерот на лотарија

Едно утро наидов на статија за проверлив генератор на случаен број на блокчејнот на платформата Waves.

Целокупната слика беше јасна, но конкретниот метод на имплементација не беше. Некои шифри, потписи, што, каде, зошто?

Неколку консултации со авторот на пророштвото, како резултат на тоа, беше можно да се комбинира логиката на цртање (имплементирана во PHP) со алгоритам за добивање случаен број.

  1. На почетокот на турнирот/колото, го бараме првиот дел од кодот (R-код) од оракулот.

    Во овој момент нема информации за бројот на играчи, за бројот на наградни места, за големината на уплатите на наградите, ниту за постоењето на лотаријата воопшто. Ораклот, преку трансакција, издава личен случаен код, кој потоа може да се користи само еднаш и само од оние што го побарале. Патем, R-кодот може да се „купи“ (значи трошоците за трансакцијата со барање + компензација на оракулот за трансакцијата одговор, ова е сума од околу 0.015 УСД по тековната стапка, самиот код се издава бесплатно ) неколку пати однапред, за да не се чека подоцна да се прими трансакцијата за одговор. Направив мал редовно ажуриран бафер во базата на податоци.

  2. Турнирот обично трае 60 блокови од блокчејнот на платформата Waves, во моментот е приближно 1 час. Турнирот се смета за завршен и затворен доколку по 60 блока има најмалку два тикети во него, во спротивно времето на активностите на турнирот се продолжува за следните 60 блокови.
  3. Веднаш по затворањето на турнирот, генерираме и испраќаме трансакција со датум (исто така плаќаме провизија од приближно 0.005 долари за неа), доколку е потребно, неколку, во кои се запишани сите услови на извлекувањето и нарачана листа на играчи (билети) од кои треба да ги избереме победниците.
  4. Во оваа фаза, веќе го имаме првиот дел од кодот (R-код) плус ID на датумот на трансакцијата (TXID). Ги испраќаме на потпис до ораклот во форма на конкатенација (R-код + TXID), повторно плаќаме провизија + компензација. Ораклот ги проверува добиените податоци за уникатност и припадност, а како одговор ни го испраќа вториот дел од кодот (S-code) во формат sha256, што е почетна точка за генератор на случаен број.
  5. За да добиеме случаен број кој ќе го означи секвенцискиот број на добитниот тикет, го претвораме S-кодот од бинарните податоци sha256 во хексадецимална (HEX) репрезентација. Потоа од добиената HEX низа, добиваме број. Го добиваме остатокот од делењето на добиениот број со бројот на билети (all_tickets) и додаваме 1 на резултатот (за да го добиеме бројот 1 пред all_tickets). Како резултат на тоа, го добиваме серискиот број на победникот.
  6. Доколку, според условите на извлекувањето, има неколку победници, тогаш ги повторуваме претходните операции во износ еднаков на бројот на наградните места. Во овој случај, секој пат кога отстрануваме од списокот веќе освоен тикет и намалуваме all_tickets за 1, а наместо S-code го означуваме претходниот примен број.

Ајде да погледнеме конкретен вистински пример, турнир бр. 119:

Вкупно 7 билети (all_tickets)
Билетот чини 50 монети (облог)
Надомест за игра 10% (надомест)

Според условите на лотаријата, 30% оди во паричната награда, т.е. во овој случај, 2 тикети мора да добијат награда, чија големина се пресметува според формулата (Bet*all_tickets-Fee)/2.

1. Добиен R-код: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. По затворањето на турнирот имаме список на билети во форма на парови: број + адреса (адреса на паричникот од кој е извршена уплата за учество на турнирот). Ве молиме имајте предвид дека адресите може да се повторуваат, тоа значи дека еден учесник купил неколку билети за еден турнир; тоа не е забрането со правилата.

Испратен датум на трансакција: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Баран S-код: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV со коментар (R-код + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Добиен S-код: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Беа одредени победниците.

6. Испратени плаќања

Како резултат на тоа, имаме чекор-по-чекор снимање на постапката за извлекување на награди во блокчејнот со можност за проверка во секое време. Речиси е невозможно организаторот да манипулира со резултатите, барем веќе нема да може тоа да се прави незабележано.

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.

Извор: www.habr.com

Додадете коментар