Lotereya nümunəsindən istifadə edərək təsadüfi oracle istifadə

Bir səhər haqqında bir məqalə ilə qarşılaşdım yoxlanıla bilən təsadüfi ədəd generatoru Waves platforması blokçeynində.

Ümumi mənzərə aydın idi, lakin konkret icra üsulu yox idi. Bəzi kodlar, imzalar, nə, harada, niyə?

Oracle müəllifi ilə bir neçə məsləhətləşmələr, nəticədə rəsm məntiqini (PHP-də həyata keçirilir) təsadüfi nömrə əldə etmək üçün alqoritmlə birləşdirmək mümkün oldu.

  1. Turnirin/raundun başlanğıcında biz oracle-dan kodun birinci hissəsini (R kodu) tələb edirik.

    Hazırda oyunçuların sayı, uduş yerlərinin sayı, uduş ödənişlərinin həcmi və ümumiyyətlə lotereyanın mövcudluğu barədə heç bir məlumat yoxdur. Oracle, bir əməliyyat vasitəsilə şəxsi təsadüfi kod verir, sonra yalnız bir dəfə və yalnız bunu tələb edənlər tərəfindən istifadə edilə bilər. Yeri gəlmişkən, R kodunu "satın almaq" olar (sorğu əməliyyatının dəyəri + cavab əməliyyatı üçün oracle üçün kompensasiya deməkdir, bu, cari məzənnə ilə təxminən $ 0.015 məbləğindədir, kodun özü pulsuz verilir. ) sonradan cavab əməliyyatının alınmasını gözləməmək üçün əvvəlcədən bir neçə dəfə. Mən verilənlər bazasında müntəzəm olaraq yenilənən kiçik bir bufer yaratdım.

  2. Turnir adətən Waves platforması blokçeyninin 60 blokunu əhatə edir, hazırda bu, təxminən 1 saatdır. 60 blokdan sonra ən azı iki bilet olarsa, turnir başa çatmış və bağlanmış sayılır, əks halda turnirin fəaliyyət müddəti növbəti 60 blok üçün uzadılır.
  3. Turnir bağlandıqdan dərhal sonra biz bir tarix əməliyyatı yaradırıq və göndəririk (biz də bunun üçün təxminən $ 0.005 komissiya ödəyirik), lazım gələrsə, bir neçə, tirajın bütün şərtləri qeyd olunur və oyunçuların sifariş siyahısı (biletlər) oradan qalibləri seçməliyik.
  4. Bu mərhələdə artıq kodun birinci hissəsi (R-kodu) və əməliyyat tarixi ID-si (TXID) var. Onları imza üçün oracle-a birləşmə şəklində göndəririk (R-kod + TXID), yenə komissiya + kompensasiya ödəyirik. Oracle alınan məlumatların unikallığını və aidiyyətini yoxlayır və cavab olaraq bizə kodun ikinci hissəsini (S-kodu) sha256 formatında göndərir ki, bu da təsadüfi ədədlər generatorunun başlanğıc nöqtəsidir.
  5. Qalib biletin ardıcıl nömrəsini göstərəcək təsadüfi bir nömrə əldə etmək üçün biz S kodunu sha256 ikili məlumatından onaltılıq (HEX) təsvirə çeviririk. Sonra yaranan HEX sətirindən bir nömrə alırıq. Əldə edilən nömrəni biletlərin sayına (bütün_biletlər) bölməkdən qalan məbləği alırıq və nəticəyə 1 əlavə edirik (hamı_biletlərdən əvvəl 1 nömrəsini almaq üçün). Nəticədə qalibin seriya nömrəsini alırıq.
  6. Əgər tirajın şərtlərinə görə bir neçə qalib varsa, o zaman əvvəlki əməliyyatları uduş yerlərinin sayına bərabər miqdarda təkrar edirik. Bu halda, hər dəfə biz artıq udmuş ​​bileti siyahıdan çıxarırıq və bütün_biletləri 1-ə endiririk və S kodu əvəzinə əvvəlki alınan nömrəni göstəririk.

Konkret real nümunəyə, 119 nömrəli turnirə baxaq:

Cəmi 7 bilet (hamısı_bilet)
Biletin qiyməti 50 qəpik (Mərc)
Oyun haqqı 10% (ödəniş)

Lotereyanın şərtlərinə görə, 30% pul mükafatına gedir, yəni. bu halda 2 bilet mükafat almalıdır, onun ölçüsü (Bet*all_tickets-Fee)/2 düsturuna əsasən hesablanır.

1. Alınan R kodu: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Turnir bağlandıqdan sonra bizdə cütlük şəklində biletlərin siyahısı var: nömrə + ünvan (turnirdə iştirak üçün ödənişin edildiyi pul kisəsinin ünvanı). Nəzərə alın ki, ünvanlar təkrarlana bilər, bu o deməkdir ki, bir iştirakçı bir turnirə bir neçə bilet alıb, bu, qaydalarla qadağan edilmir.

Göndərilən əməliyyat tarixi: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Tələb olunan S kodu: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV şərh ilə (R kodu + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Alınan S kodu: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Qaliblər müəyyən olundu.

6. Göndərilən ödənişlər

Nəticədə, istənilən vaxt yoxlamaq imkanı ilə blokçeynində uduşların oynanılması prosedurunun addım-addım qeydinə sahibik. Təşkilatçının nəticələri manipulyasiya etməsi demək olar ki, mümkün deyil, ən azı, bunu gözədəyməz etmək artıq mümkün olmayacaq.

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.

Mənbə: www.habr.com

Добавить комментарий