Лотерея мысалын пайдалана отырып, кездейсоқ оракулды пайдалану

Бір күні таңертең мен бір мақалаға тап болдым тексерілетін кездейсоқ сандар генераторы Waves платформасының блокчейнінде.

Жалпы сурет анық болды, бірақ нақты жүзеге асыру әдісі болмады. Кейбір кодтар, қолтаңбалар, не, қайда, неге?

Oracle авторымен бірнеше консультациялар нәтижесінде сызба логикасын (PHP-де енгізілген) кездейсоқ санды алу алгоритмімен біріктіру мүмкін болды.

  1. Турнир/турдың басында біз oracle-дан кодтың бірінші бөлігін (R-код) сұраймыз.

    Қазіргі уақытта ойыншылардың саны, жүлде орындарының саны, жүлде төлемдерінің мөлшері немесе жалпы лотереяның бар-жоғы туралы ақпарат жоқ. Oracle транзакция арқылы жеке кездейсоқ кодты шығарады, содан кейін оны тек бір рет және оны сұрағандар ғана пайдалана алады. Айтпақшы, R-кодты «сатып алуға» болады (сұраныс транзакциясының құны + жауап транзакциясы үшін oracle-ға өтемақы, бұл ағымдағы бағам бойынша шамамен $0.015 сома, кодтың өзі тегін беріледі. ) кейінірек жауап транзакциясын алуды күтпеу үшін алдын ала бірнеше рет. Мен дерекқорда үнемі жаңартылатын шағын буфер жасадым.

  2. Турнир әдетте Waves платформасының блокчейнінің 60 блогына созылады, қазіргі уақытта ол шамамен 1 сағатты құрайды. Егер 60 блоктан кейін онда кемінде екі билет болса, турнир аяқталды және жабылды деп есептеледі, әйтпесе турнирді өткізу уақыты келесі 60 блокқа ұзартылады.
  3. Турнир жабылғаннан кейін бірден біз транзакция күнін жасаймыз және жібереміз (сонымен бірге ол үшін шамамен $0.005 комиссия төлейміз), қажет болған жағдайда ұтыс ойынының барлық шарттары жазылған және ойыншылардың реттелген тізімі (билеттер) бар бірнеше. соның ішінен жеңімпаздарды таңдауымыз керек.
  4. Бұл кезеңде бізде кодтың бірінші бөлігі (R-код) және транзакция күні идентификаторы (TXID) бар. Біз оларды біріктіру (R-код + TXID) түрінде oracle-ға қол қоюға жібереміз, қайтадан комиссия + өтемақы төлейміз. Oracle алынған деректердің бірегейлігі мен тиесілілігін тексереді және жауап ретінде бізге кодтың екінші бөлігін (S-код) sha256 форматында жібереді, бұл кездейсоқ сандар генераторының бастапқы нүктесі болып табылады.
  5. Жеңімпаз билеттің реттік нөмірін көрсететін кездейсоқ санды алу үшін sha256 екілік деректерінен S-кодты он алтылық (HEX) ұсынуға түрлендіреміз. Содан кейін алынған HEX жолынан біз санды аламыз. Алынған санды билеттер санына (барлық_билет) бөлудің қалдығын аламыз және нәтижеге 1 қосамыз (барлық_билеттердің алдында 1 санын алу үшін). Нәтижесінде біз жеңімпаздың сериялық нөмірін аламыз.
  6. Егер ұтыс ойынының шарттарына сәйкес бірнеше жеңімпаз болса, онда алдыңғы операцияларды жүлделі орындар санына тең мөлшерде қайталаймыз. Бұл жағдайда біз ұтып алған билетті тізімнен алып тастаған сайын барлық_билеттерді 1-ге азайтамыз, ал S-кодтың орнына алдыңғы алынған нөмірді көрсетеміз.

Нақты нақты мысалды қарастырайық, №119 турнир:

Барлығы 7 билет (барлық_билет)
Билет құны 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

пікір қалдыру