Menggunakan oracle rawak menggunakan contoh loteri

Pada suatu pagi saya terjumpa satu artikel tentang penjana nombor rawak yang boleh disahkan pada blockchain platform Waves.

Gambaran keseluruhan adalah jelas, tetapi kaedah pelaksanaan khusus tidak. Beberapa kod, tandatangan, apa, di mana, mengapa?

Beberapa perundingan dengan pengarang oracle, sebagai hasilnya, adalah mungkin untuk menggabungkan logik lukisan (dilaksanakan dalam PHP) dengan algoritma untuk mendapatkan nombor rawak.

  1. Pada permulaan kejohanan/pusingan, kami meminta bahagian pertama kod (R-kod) daripada oracle.

    Pada masa ini, tiada maklumat tentang bilangan pemain, bilangan tempat hadiah, saiz pembayaran hadiah, atau kewujudan loteri secara umum. Oracle, melalui transaksi, mengeluarkan kod rawak peribadi, yang kemudiannya boleh digunakan sekali sahaja dan hanya oleh mereka yang memintanya. Ngomong-ngomong, R-code boleh "dibeli" (bermaksud kos transaksi permintaan + pampasan kepada oracle untuk transaksi respons, ini adalah jumlah kira-kira $0.015 pada kadar semasa, kod itu sendiri dikeluarkan secara percuma ) beberapa kali lebih awal, supaya tidak menunggu penerimaan transaksi balasan nanti. Saya membuat penimbal kecil yang dikemas kini secara kerap dalam pangkalan data.

  2. Kejohanan ini biasanya berlangsung selama 60 blok blok platform Waves, pada masa ini ia adalah kira-kira 1 jam. Kejohanan dianggap selesai dan ditutup jika selepas 60 blok terdapat sekurang-kurangnya dua tiket di dalamnya, jika tidak, masa aktiviti kejohanan dilanjutkan untuk 60 blok berikutnya.
  3. Sejurus selepas kejohanan ditutup, kami menjana dan menghantar transaksi tarikh (kami juga membayar komisen kira-kira $0.005 untuknya), jika perlu, beberapa, di mana semua syarat cabutan direkodkan dan senarai pemain yang dipesan (tiket) dari mana kita perlu memilih pemenang.
  4. Pada peringkat ini, kita sudah mempunyai bahagian pertama kod (R-code) serta ID tarikh transaksi (TXID). Kami menghantarnya untuk tandatangan kepada oracle dalam bentuk gabungan (R-code + TXID), sekali lagi kami membayar komisen + pampasan. Oracle menyemak data yang diterima untuk keunikan dan kepunyaan, dan sebagai tindak balas menghantar kepada kami bahagian kedua kod (S-kod) dalam format sha256, yang merupakan titik permulaan untuk penjana nombor rawak.
  5. Untuk mendapatkan nombor rawak yang akan menunjukkan nombor urutan tiket yang menang, kami menukar kod-S daripada data binari sha256 kepada perwakilan perenambelasan (HEX). Kemudian daripada rentetan HEX yang terhasil, kita mendapat nombor. Kami mendapat baki membahagikan nombor yang terhasil dengan bilangan tiket (all_tickets) dan menambah 1 pada keputusan (untuk mendapatkan nombor 1 sebelum all_tickets). Hasilnya, kami mendapat nombor siri pemenang.
  6. Jika, mengikut syarat cabutan, terdapat beberapa pemenang, maka kami mengulangi operasi sebelumnya dalam jumlah yang sama dengan bilangan tempat hadiah. Dalam kes ini, setiap kali kami mengalih keluar daripada senarai tiket yang telah menang dan mengurangkan semua_tiket sebanyak 1, dan bukannya kod-S kami menunjukkan nombor sebelumnya yang diterima.

Mari kita lihat contoh sebenar yang khusus, kejohanan No. 119:

Jumlah 7 tiket (semua_tiket)
Kos tiket 50 syiling (Pertaruhan)
Yuran permainan 10% (Yuran)

Mengikut syarat loteri, 30% pergi ke hadiah wang, i.e. dalam kes ini, 2 tiket mesti menerima hadiah, yang saiznya dikira mengikut formula (Pertaruhan*semua_tiket-Yuran)/2.

1. Menerima kod R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Selepas kejohanan ditutup, kami mempunyai senarai tiket dalam bentuk pasangan: nombor + alamat (alamat dompet dari mana pembayaran untuk penyertaan dalam kejohanan dibuat). Sila ambil perhatian bahawa alamat mungkin berulang, ini bermakna seorang peserta membeli beberapa tiket untuk satu kejohanan; ini tidak dilarang oleh peraturan.

Tarikh transaksi dihantar: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Kod S yang diminta: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV dengan ulasan (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Menerima S-kod: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Pemenang telah ditentukan.

6. Bayaran dihantar

Hasilnya, kami mempunyai rakaman langkah demi langkah prosedur cabutan hadiah dalam rantaian blok dengan keupayaan untuk menyemaknya pada bila-bila masa. Hampir mustahil bagi penganjur untuk memanipulasi keputusan; sekurang-kurangnya, ia tidak lagi mungkin untuk melakukannya tanpa disedari.

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.

Sumber: www.habr.com

Tambah komen