Paggamit ng random na orakulo gamit ang halimbawa ng lottery

Isang umaga may nabasa akong artikulo tungkol sa napapatunayan na random number generator sa Waves platform blockchain.

Ang pangkalahatang larawan ay malinaw, ngunit ang tiyak na paraan ng pagpapatupad ay hindi. Ilang code, lagda, ano, saan, bakit?

Maraming mga konsultasyon sa may-akda ng orakulo, bilang isang resulta, posible na pagsamahin ang drawing logic (ipinatupad sa PHP) na may isang algorithm para sa pagkuha ng isang random na numero.

  1. Sa simula ng tournament/round, hinihiling namin ang unang bahagi ng code (R-code) mula sa oracle.

    Sa sandaling ito, walang impormasyon tungkol sa bilang ng mga manlalaro, ang bilang ng mga lugar ng premyo, ang laki ng mga pagbabayad ng premyo, o ang pagkakaroon ng lottery sa pangkalahatan. Ang orakulo, sa pamamagitan ng isang transaksyon, ay naglalabas ng isang personal na random na code, na pagkatapos ay magagamit lamang ng isang beses at lamang ng mga humiling nito. Sa pamamagitan ng paraan, ang R-code ay maaaring "mabili" (ibig sabihin ang gastos ng kahilingan sa transaksyon + kabayaran sa orakulo para sa tugon na transaksyon, ito ay isang halaga na humigit-kumulang $0.015 sa kasalukuyang rate, ang code mismo ay inisyu nang walang bayad. ) nang maraming beses nang maaga, upang hindi maghintay para sa pagtanggap ng transaksyon sa pagtugon sa ibang pagkakataon. Gumawa ako ng isang maliit na regular na na-update na buffer sa database.

  2. Ang tournament ay karaniwang tumatagal ng 60 blocks ng Waves platform blockchain, sa ngayon ay humigit-kumulang 1 oras. Itinuturing na kumpleto at sarado ang paligsahan kung pagkatapos ng 60 bloke ay mayroong hindi bababa sa dalawang tiket sa loob nito, kung hindi, ang oras ng aktibidad ng paligsahan ay pinalawig para sa susunod na 60 bloke.
  3. Kaagad pagkatapos magsara ang paligsahan, bumubuo at nagpapadala kami ng isang transaksyon sa petsa (nagbabayad din kami ng komisyon na humigit-kumulang $0.005 para dito), kung kinakailangan, ilan, kung saan ang lahat ng mga kondisyon ng pagguhit ay naitala at isang order na listahan ng mga manlalaro (mga tiket) kung saan kailangan nating piliin ang mga nanalo.
  4. Sa yugtong ito, mayroon na tayong unang bahagi ng code (R-code) kasama ang transaction date ID (TXID). Ipinapadala namin ang mga ito para sa lagda sa orakulo sa anyo ng concatenation (R-code + TXID), muli kaming nagbabayad ng komisyon + kabayaran. Sinusuri ng orakulo ang natanggap na data para sa pagiging natatangi at pagmamay-ari, at bilang tugon ay ipinapadala sa amin ang pangalawang bahagi ng code (S-code) sa sha256 na format, na siyang panimulang punto para sa random number generator.
  5. Upang makakuha ng random na numero na magsasaad ng sequence number ng nanalong ticket, iko-convert namin ang S-code mula sa sha256 binary data sa isang hexadecimal (HEX) na representasyon. Pagkatapos mula sa nagresultang string ng HEX, makakakuha tayo ng isang numero. Nakukuha namin ang natitira sa paghahati ng resultang numero sa bilang ng mga tiket (all_tickets) at magdagdag ng 1 sa resulta (upang makuha ang numero 1 bago ang all_tickets). Bilang resulta, nakukuha namin ang serial number ng nanalo.
  6. Kung, ayon sa mga kondisyon ng pagguhit, mayroong ilang mga nanalo, pagkatapos ay ulitin namin ang mga nakaraang operasyon sa isang halaga na katumbas ng bilang ng mga lugar ng premyo. Sa kasong ito, sa bawat oras na aalisin namin mula sa listahan ang isang tiket na nanalo na at binabawasan ng 1 ang all_tickets, at sa halip na S-code, ipinapahiwatig namin ang nakaraang numerong natanggap.

Tingnan natin ang isang tiyak na tunay na halimbawa, tournament No. 119:

Kabuuang 7 ticket (all_tickets)
Ang tiket ay nagkakahalaga ng 50 barya (Pusta)
Bayad sa laro 10% (Bayaran)

Ayon sa mga kondisyon ng lottery, 30% ang napupunta sa premyong pera, i.e. sa kasong ito, 2 ticket ang dapat makatanggap ng premyo, ang laki nito ay kinakalkula ayon sa formula (Bet*all_tickets-Fee)/2.

1. Nakatanggap ng R-code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Pagkatapos magsara ng paligsahan, mayroon kaming listahan ng mga tiket sa anyo ng mga pares: numero + address (ang address ng pitaka kung saan ginawa ang pagbabayad para sa pakikilahok sa paligsahan). Pakitandaan na ang mga address ay maaaring ulitin, nangangahulugan ito na ang isang kalahok ay bumili ng ilang mga tiket sa isang paligsahan; hindi ito ipinagbabawal ng mga patakaran.

Ipinadala ang petsa ng transaksyon: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Hiniling na S-code: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV may komento (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Nakatanggap ng S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Natukoy ang mga nanalo.

6. Nagpadala ng mga bayad

Bilang resulta, mayroon kaming step-by-step na pagtatala ng pamamaraan ng pagguhit ng premyo sa blockchain na may kakayahang suriin ito anumang oras. Halos imposible para sa organizer na manipulahin ang mga resulta; hindi bababa sa, hindi na posible na gawin ito nang hindi napapansin.

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.

Pinagmulan: www.habr.com

Magdagdag ng komento