Véletlenszerű orákulum használata a lottó példáján

Egyik reggel a kezembe akadt egy cikk arról, hogy ellenőrizhető véletlenszám generátor a Waves platform blokkláncán.

Az összkép egyértelmű volt, de a konkrét megvalósítási mód nem. Néhány kód, aláírás, mit, hol, miért?

Az orákulum szerzőjével folytatott többszöri egyeztetés eredményeként sikerült a rajzi logikát (PHP-ban megvalósítva) egy véletlenszám-szerzési algoritmussal kombinálni.

  1. A bajnokság/kör elején a kód első részét (R-kód) kérjük az orákulumtól.

    Jelenleg nincs információ a játékosok számáról, a nyereményhelyek számáról, a nyeremények kifizetésének nagyságáról, vagy általában a lottó létezéséről. Az orákulum egy tranzakció során személyes véletlenszerű kódot ad ki, amelyet ezután csak egyszer és csak azok használhatnak fel, akik kérték. Az R-kód egyébként „megvásárolható” (azaz a kérési tranzakció költsége + az orákulumnak járó kompenzáció a választranzakcióért, ez a jelenlegi árfolyamon körülbelül 0.015 USD összeget jelent, magát a kódot ingyenesen adják ki ) többször előre, hogy később ne várja meg a választranzakció beérkezését. Csináltam egy kis rendszeresen frissített puffert az adatbázisban.

  2. A verseny általában 60 blokkig tart a Waves platform blokkláncból, jelenleg körülbelül 1 óra. A verseny akkor tekinthető befejezettnek és lezártnak, ha 60 blokk után legalább két jegy van benne, ellenkező esetben a versenyaktivitás ideje meghosszabbodik a következő 60 blokkra.
  3. A verseny zárása után azonnal generálunk és elküldünk egy dátum-tranzakciót (kb. 0.005 dollár jutalékot is fizetünk érte), ha szükséges, akár többször is, melyben a sorsolás minden feltétele rögzítésre kerül és a játékosok (jegyek) rendezett listája. amelyek közül ki kell választanunk a nyerteseket.
  4. Ebben a szakaszban már megvan a kód első része (R-kód), valamint a tranzakció dátumának azonosítója (TXID). Aláírásra elküldjük az orákulumnak összefűzés formájában (R-kód + TXID), ismét jutalékot + kompenzációt fizetünk. Az orákulum ellenőrzi a kapott adatok egyediségét és összetartozását, és válaszul elküldi nekünk a kód második részét (S-kódot) sha256 formátumban, amely a véletlenszám-generátor kiindulópontja.
  5. Ahhoz, hogy egy véletlen számot kapjunk, amely a nyertes jegy sorszámát jelzi, az S-kódot az sha256 bináris adatokból hexadecimális (HEX) reprezentációvá alakítjuk. Ezután a kapott HEX karakterláncból egy számot kapunk. A kapott számot a jegyek számával osztva (all_tickets) megkapjuk a maradékot, és az eredményhez hozzáadunk 1-et (hogy az all_tickets előtti 1-et kapjuk). Ennek eredményeként megkapjuk a nyertes sorszámát.
  6. Ha a sorsolás feltételei szerint több nyertes van, akkor a nyereményhelyek számával megegyező mennyiségben megismételjük az előző műveleteket. Ebben az esetben minden alkalommal eltávolítunk a listáról egy már nyert jegyet, és 1-gyel csökkentjük az all_tickets-et, és az S-kód helyett a korábban kapott számot jelöljük.

Nézzünk egy konkrét valós példát, a 119-es versenyt:

Összesen 7 jegy (all_tickets)
A jegy ára 50 érme (fogadás)
Játékdíj 10% (Díj)

A sorsolás feltételei szerint 30% megy a pénznyereményre, azaz. ebben az esetben 2 jegynek kell nyereményt kapnia, melynek nagysága a (Tét*összes_jegy-Díj)/2 képlet alapján kerül kiszámításra.

1. Fogadott R-kód: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. A torna zárása után páros formában áll rendelkezésünkre a jegyek listája: szám + cím (annak a pénztárcának a címe, amelyről a versenyen való részvételt fizették). Felhívjuk figyelmét, hogy a címek megismétlődhetnek, ez azt jelenti, hogy egy résztvevő több jegyet vásárolt egy versenyre, ezt a szabályok nem tiltják.

A tranzakció elküldésének dátuma: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Kért S-kód: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV megjegyzéssel (R-kód + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Fogadott S-kód: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Kiderültek a nyertesek.

6. Elküldött kifizetések

Ennek eredményeként lépésről lépésre rögzítjük a nyereményjáték folyamatát a blokkláncban, és azt bármikor ellenőrizhetjük. Szinte lehetetlen, hogy a szervező manipulálja az eredményeket, legalábbis ezt már nem lehet észrevétlenül megtenni.

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.

Forrás: will.com

Hozzászólás