Lotereya misolidan foydalanib, tasodifiy oracledan foydalanish

Bir kuni ertalab men bir maqolaga duch keldim tekshiriladigan tasodifiy sonlar generatori Waves platformasi blokcheynida.

Umumiy rasm aniq edi, lekin amalga oshirishning o'ziga xos usuli emas edi. Ba'zi kodlar, imzolar, nima, qaerda, nima uchun?

Oracle muallifi bilan bir nechta maslahatlashuvlar natijasida chizma mantig'ini (PHPda amalga oshirilgan) tasodifiy sonni olish algoritmi bilan birlashtirish mumkin bo'ldi.

  1. Turnir/tur boshida biz oracledan kodning birinchi qismini (R-kod) so'raymiz.

    Hozirda o'yinchilar soni, sovrinli o'rinlar soni, yutuq to'lovlari miqdori yoki umuman lotereya mavjudligi haqida hech qanday ma'lumot yo'q. Oracle tranzaksiya orqali shaxsiy tasodifiy kodni chiqaradi, undan keyin faqat bir marta va faqat so'raganlar foydalanishi mumkin. Aytgancha, R-kodni "sotib olish" mumkin (so'rov operatsiyasining narxi + javob operatsiyasi uchun oracle kompensatsiyasini anglatadi, bu joriy kurs bo'yicha taxminan 0.015 dollarni tashkil etadi, kodning o'zi bepul beriladi. ) keyinroq javob tranzaksiyasini olishni kutmaslik uchun oldindan bir necha marta. Ma'lumotlar bazasida muntazam yangilanadigan kichik bufer yaratdim.

  2. Turnir odatda Waves platformasi blokcheynining 60 blokidan iborat bo‘lib, hozircha bu taxminan 1 soatni tashkil qiladi. Agar 60 blokdan keyin kamida ikkita chipta bo'lsa, turnir yakunlangan va yopilgan hisoblanadi, aks holda turnirning o'tkazish vaqti keyingi 60 blokga uzaytiriladi.
  3. Turnir yopilgandan so'ng darhol biz sana bitimini tuzamiz va jo'natamiz (biz buning uchun taxminan $ 0.005 komissiya to'laymiz), agar kerak bo'lsa, o'yinning barcha shartlari va o'yinchilarning buyurtma qilingan ro'yxati (chiptalar) yozilgan bir nechta. ular orasidan g'oliblarni tanlashimiz kerak.
  4. Ushbu bosqichda biz allaqachon kodning birinchi qismiga (R-kod) va tranzaksiya sanasi identifikatoriga (TXID) egamiz. Biz ularni imzolash uchun oracle-ga birlashma shaklida yuboramiz (R-kod + TXID), biz yana komissiya + tovon to'laymiz. Oracle olingan ma'lumotlarning o'ziga xosligi va tegishliligini tekshiradi va bunga javoban bizga kodning ikkinchi qismini (S-kod) sha256 formatida yuboradi, bu tasodifiy sonlar generatori uchun boshlang'ich nuqtadir.
  5. G'olib chiptaning tartib raqamini ko'rsatadigan tasodifiy raqamni olish uchun biz sha256 ikkilik ma'lumotlaridan S-kodni o'n oltilik (HEX) ko'rinishga aylantiramiz. Keyin olingan HEX qatoridan biz raqam olamiz. Olingan raqamni chiptalar soniga (barcha_tickets) bo'lishning qolgan qismini olamiz va natijaga 1 qo'shamiz (barcha_chiptalardan oldin 1 raqamini olish uchun). Natijada, biz g'olibning seriya raqamini olamiz.
  6. Agar o'yin shartlariga ko'ra, bir nechta g'oliblar aniqlansa, biz oldingi operatsiyalarni sovrinli o'rinlar soniga teng miqdorda takrorlaymiz. Bunday holda, har safar biz allaqachon yutgan chiptani ro'yxatdan olib tashlaymiz va barcha_chiptalarni 1 ga kamaytiramiz va S-kod o'rniga oldingi olingan raqamni ko'rsatamiz.

Keling, aniq bir haqiqiy misolni, 119-sonli turnirni ko'rib chiqaylik:

Jami 7 ta chipta (barcha_chipta)
Chipta narxi 50 tanga (bet)
Oʻyin toʻlovi 10% (toʻlov)

Lotereya shartlariga ko'ra, 30% pul mukofotiga tushadi, ya'ni. bu holda 2 ta chipta sovrinni olishi kerak, uning hajmi (Bet*all_tickets-Fee)/2 formulasi bo'yicha hisoblanadi.

1. Qabul qilingan R-kodi: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Turnir yopilgandan so'ng bizda juftlik ko'rinishidagi chiptalar ro'yxati mavjud: raqam + manzil (turnirda ishtirok etish uchun to'lov amalga oshirilgan hamyon manzili). E'tibor bering, manzillar takrorlanishi mumkin, bu bitta ishtirokchi bitta turnirga bir nechta chipta sotib olganligini anglatadi, bu qoidalar bilan taqiqlanmagan.

Tranzaksiya yuborilgan sana: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. So‘ralgan S-kod: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV izoh bilan (R-kod + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Qabul qilingan S-kodi: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. G‘oliblar aniqlandi.

6. Yuborilgan to'lovlar

Natijada, biz blokcheyn-da sovrinlarni o'tkazish tartibini bosqichma-bosqich yozib oldik, uni istalgan vaqtda tekshirish imkoniyati mavjud. Tashkilotchining natijalarni o'zgartirishi deyarli mumkin emas, hech bo'lmaganda, endi buni sezmasdan qilish mumkin bo'lmaydi.

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.

Manba: www.habr.com

a Izoh qo'shish