Suatu pagi, sebuah artikel tentang
generator angka acak yang diuji pada platform blockchain Waves menarik perhatian saya.
Gambaran keseluruhan dapat dimengerti, tetapi metode implementasi spesifik tidak. Setiap kode, tanda tangan, apa, di mana, mengapa?
Beberapa konsultasi dengan penulis oracle, sebagai hasilnya ternyata menggabungkan logika undian (diimplementasikan dalam PHP) dengan algoritma untuk mendapatkan nomor acak.
- Pada awal turnamen / putaran, kami meminta oracle untuk bagian pertama dari kode (R-code).
Pada saat ini, tidak ada informasi tentang jumlah pemain, atau tentang jumlah hadiah, atau tentang ukuran pembayaran hadiah dan umumnya tentang keberadaan lotere. Oracle melalui transaksi mengeluarkan kode acak pribadi, yang di masa depan hanya dapat digunakan sekali dan hanya untuk mereka yang memintanya. Ngomong-ngomong, R-code dapat "dibeli" (merujuk pada biaya transaksi permintaan + kompensasi oracle untuk transaksi respons, ini adalah jumlah pesanan $ 0,015 pada kurs saat ini, kode itu sendiri dikeluarkan secara gratis) di muka, sehingga Anda tidak harus menunggu agar transaksi respons diterima sebelum nanti. Saya membuat buffer kecil yang diperbarui secara berkala dalam database. - Turnamen ini berlangsung sebagai standar dengan 60 blok platform blockchain Waves, saat ini sekitar 1 jam. Turnamen dianggap diadakan dan ditutup jika setelah 60 blok akan ada setidaknya dua tiket di dalamnya, jika tidak waktu aktivitas turnamen akan diperpanjang 60 blok berikutnya.
- Segera setelah turnamen ditutup, kami membentuk dan mengirim tanggal transaksi (kami juga membayar komisi sekitar $ 0,005 untuk itu), jika perlu, beberapa, di mana semua kondisi gambar dan daftar pemain yang dipesan (tiket) ditetapkan sehingga kami harus memilih pemenang.
- Pada tahap ini, kita sudah memiliki bagian pertama dari kode (R-code) ditambah ID tanggal transaksi (TXID). Kami mengirim mereka ke oracle untuk ditandatangani dalam bentuk gabungan (R-code + TXID), lagi-lagi kami membayar komisi + kompensasi. Oracle memeriksa data yang diterima untuk keunikan dan kepemilikan, dan sebagai tanggapan mengirimi kami bagian kedua dari kode (S-code) dalam format sha256, yang merupakan titik awal untuk generator angka acak.
- Untuk mendapatkan nomor acak yang akan menunjukkan nomor urut dari tiket yang menang, kami mengonversi kode-S dari data biner sha256 ke representasi heksadesimal (HEX). Kemudian dari string HEX yang dihasilkan, kami mendapatkan nomor. Kami mendapatkan sisa pembagian nomor yang dihasilkan dengan jumlah tiket (all_tickets) dan tambahkan ke hasil 1 (untuk mendapatkan nomor 1 ke all_tickets). Hasilnya, kami mendapatkan nomor seri dari pemenang.
- Jika ada beberapa pemenang berdasarkan ketentuan undian, maka kami ulangi operasi sebelumnya dalam jumlah yang sama dengan jumlah hadiah. Pada saat yang sama, setiap kali kami menghapus tiket yang sudah kami menangkan dari daftar dan mengurangi all_tickets sebanyak 1, dan alih-alih dari S-code, kami menunjukkan nomor yang sebelumnya diterima.
Mari kita menganalisis contoh nyata kehidupan nyata, turnamen No. 119:
Hanya 7 tiket (all_tickets)
Harga tiket 50 koin (Taruhan)
Biaya permainan 10% (Biaya)
Menurut kondisi lotere, 30% dapatkan dalam hadiah, mis. dalam hal ini, 2 tiket harus menerima hadiah yang ukurannya dihitung menggunakan rumus (Taruhan * all_tickets-Fee) / 2.
1. Menerima kode-R:
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE2. Setelah turnamen ditutup, kami memiliki daftar tiket dalam bentuk pasangan: nomor + alamat (alamat dompet dari mana partisipasi dalam turnamen dibayarkan). Perhatikan bahwa alamat dapat diulangi, ini berarti bahwa satu peserta membeli beberapa tiket dalam satu turnamen, ini tidak dilarang oleh aturan.
Tanggal transaksi terkirim:
82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S3. Kode-S yang diminta:
FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV dengan komentar (R-kode + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VEVE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Menerima kode-S:
Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC5. Pemenang ditentukan.
6.
Pembayaran terkirimSebagai hasilnya, kami memiliki fiksasi step-by-step dari blockchain dalam proses pengundian hadiah dengan kemampuan untuk memeriksanya kapan saja. Hampir tidak mungkin untuk menyulap hasil di pihak penyelenggara, setidaknya tidak akan bekerja dengan tenang.
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.