Použití náhodného orákula na příkladu loterie

Jedno ráno jsem narazil na článek o ověřeném generátoru náhodných čísel na blockchainu platformy Waves.

Celkový obrázek byl jasný, ale způsob konkrétní realizace — nikoliv. Nějaké kódy, podpisy, co, kam, proč?

Po několika konzultacích s autorem orákula se mi podařilo spojit logiku losování (realizovanou v PHP) s algoritmem pro získání náhodného čísla.

  1. V okamžiku zahájení turnaje/kola se od orákula žádá první část kódu (R-code).

    V tu chvíli není k dispozici žádná informace o počtu hráčů, ani o počtu výherních míst, ani o výši výherních výplat a vůbec o existenci loterie. Orákulum pomocí transakce vydává osobní náhodný kód, který může být použit pouze jednou a pouze tím, kdo si ho vyžádal. Mimochodem, R-code si lze „zakoupit“ (myslí se tím náklady transakce žádosti + kompenzace orákulu za odpovědní transakci, což je suma kolem 0,015 USD podle současného kurzu, samotný kód je vydáván zdarma) předem několik, abychom se vyhnuli čekání na odpovědní transakci. Vytvořil jsem malý pravidelně doplňovaný buffer v DB.

  2. Turnaj standardně trvá 60 bloků blockchainu platformy Waves, což je v současnosti přibližně 1 hodina. Turnaj se považuje za uskutečněný a uzavřený, pokud po 60 blocích bude mít alespoň dvě vstupenky, jinak se doba aktivity turnaje prodlouží o dalších 60 bloků.
  3. Bezprostředně po uzavření turnaje vytváříme a odesíláme datovou transakci (za kterou také platíme provizi přibližně 0,005 USD), případně několik, ve které jsou zaznamenány všechny podmínky losování a uspořádaný seznam hráčů (vstupenek), ze kterého je třeba vybrat výherce.
  4. V této fázi již máme první část kódu (R-code) plus ID datové transakce (TXID). Odesíláme je orákulu k podpisu ve formě konkatenece (R-code + TXID), opět platíme provizi + kompenzaci. Orákulum kontroluje přijatá data na unikátnost a příslušnost, a na oplátku nám posílá druhou část kódu (S-code) ve formátu sha256, která je výchozím bodem pro generátor náhodných čísel.
  5. Aby získali náhodné číslo, které určuje pořadové číslo vítězného lístku, převádíme S-kód z binárních dat sha256 do hexadecimálního (HEX) formátu. Poté z výsledného HEX řetězce získáváme číslo. Spočítáme zbytek po dělení získaného čísla celkovým počtem lístků (all_tickets) a k výsledku přičteme 1 (abychom dostali číslo od 1 do all_tickets). Nakonec získáme pořadové číslo vítěze.
  6. Pokud podle podmínek losování vyhrává více vítězů, opakujeme předchozí operace v počtu, který odpovídá počtu cenových míst. Pokaždé odstraňujeme ze seznamu lístek, který již vyhrál, a zmenšujeme all_tickets o 1, přičemž místo S-kódu uvedeme předchozí získané číslo.

Podíváme se na konkrétní skutečný příklad, turnaj č. 119:

Celkem 7 lístků (all_tickets)
Cena lístku 50 mincí (Bet)
Herní poplatek 10 % (Fee)

Podle podmínek loterie 30 % jde do cenových fondů, tj. v tomto případě 2 lístky by měly získat cenu, jejíž výše se počítá podle vzorce (Bet * all_tickets - Fee) / 2.

1. Získali jsme R-kód: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Po uzavření turnaje máme seznam lístků ve formě párů: číslo + adresa (adresa peněženky, ze které byla provedena platba za účast v turnaji). Všimněte si, že adresy se mohou opakovat, což znamená, že jeden účastník zakoupil několik lístků na jeden turnaj, což není pravidly zakázáno.

Odeslali jsme datum transakce: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Požádali jsme o S-kód: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV s komentářem (R-kód + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Získali jsme S-kód: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Určili jsme vítěze.

6. Odeslali jsme výplaty

V důsledku toho máme v blockchainu krok za krokem zaznamenaný průběh losování cen s možností ověřit ho kdykoli. Podvádět výsledky ze strany organizátora je prakticky nemožné, alespoň to udělat nenápadně už není možné.

určit vítěze č. 1

Všechny_vstupenky:
Index: 1 Vstupenka:139
Index: 2 Vstupenka:141
Index: 3 Vstupenka:143
Index: 4 Vstupenka:145
Index: 5 Vstupenka:147
Index: 6 Vstupenka:149
Index: 7 Vstupenka:151

1. bin -> hex ( bin2hex(sha256(S-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596

2. hex -> gmp číslo: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342

3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4

4. modulo -> vstupenka: 4 -> 145

určit vítěze č. 2

Všechny_vstupenky:

Index: 1 Vstupenka:139
Index: 2 Vstupenka:141
Index: 3 Vstupenka:143
Index: 4 Vstupenka:147
Index: 5 Vstupenka:149
Index: 6 Vstupenka:151

1. bin -> hex ( bin2hex(sha256předchozí hex) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> gmp číslo: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> vstupenka: 1 -> 139

Konec.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster