Menggunakan ramalan acak menggunakan contoh lotere

Suatu pagi saya menemukan artikel tentang generator nomor acak yang dapat diverifikasi pada platform blockchain Waves.

Gambaran keseluruhannya jelas, namun metode implementasi spesifiknya tidak jelas. Beberapa kode, tanda tangan, apa, dimana, mengapa?

Beberapa konsultasi dengan penulis oracle, sebagai hasilnya, dimungkinkan untuk menggabungkan logika gambar (diimplementasikan dalam PHP) dengan algoritma untuk mendapatkan nomor acak.

  1. Di awal turnamen/putaran, kami meminta bagian pertama kode (R-code) dari oracle.

    Saat ini belum ada informasi mengenai jumlah pemain, jumlah hadiah, besaran pembayaran hadiah, atau keberadaan lotere secara umum. Oracle, melalui suatu transaksi, mengeluarkan kode acak pribadi, yang kemudian hanya dapat digunakan satu kali dan hanya oleh mereka yang memintanya. Omong-omong, kode-R dapat "dibeli" (artinya biaya transaksi permintaan + kompensasi kepada oracle untuk transaksi respons, jumlahnya sekitar $0.015 dengan kurs saat ini, kode itu sendiri dikeluarkan secara gratis ) beberapa kali sebelumnya, agar tidak menunggu diterimanya respon transaksi nantinya. Saya membuat buffer kecil yang diperbarui secara berkala di database.

  2. Turnamen biasanya berlangsung selama 60 blok dari blockchain platform Waves, saat ini sekitar 1 jam. Turnamen dianggap selesai dan ditutup jika setelah 60 blok terdapat minimal dua tiket di dalamnya, jika tidak, waktu kegiatan turnamen diperpanjang untuk 60 blok berikutnya.
  3. Segera setelah turnamen ditutup, kami membuat dan mengirimkan transaksi tanggal (kami juga membayar komisi sekitar $0.005 untuk itu), jika perlu, beberapa, di mana semua kondisi pengundian dicatat dan daftar pemain yang diurutkan (tiket) dari situ kita perlu memilih pemenangnya.
  4. Pada tahap ini kita sudah memiliki kode bagian pertama (R-code) ditambah ID tanggal transaksi (TXID). Kami mengirimkannya untuk ditandatangani ke oracle dalam bentuk penggabungan (R-code + TXID), sekali lagi kami membayar komisi + kompensasi. Oracle memeriksa keunikan dan kepemilikan data yang diterima, dan sebagai tanggapan mengirimkan kepada kami bagian kedua dari kode (kode-S) dalam format sha256, yang merupakan titik awal untuk penghasil angka acak.
  5. Untuk mendapatkan nomor acak yang menunjukkan nomor urut tiket pemenang, kami mengubah kode S dari data biner sha256 menjadi representasi heksadesimal (HEX). Kemudian dari string HEX yang dihasilkan kita mendapatkan sebuah nomor. Kita mendapatkan sisa pembagian angka yang dihasilkan dengan jumlah tiket (all_tickets) dan menambahkan 1 pada hasilnya (untuk mendapatkan angka 1 sebelum all_tickets). Hasilnya, kami mendapatkan nomor seri pemenangnya.
  6. Jika menurut ketentuan pengundian ada beberapa pemenang, maka kami mengulangi operasi sebelumnya dalam jumlah yang sama dengan jumlah hadiah. Dalam hal ini, setiap kali kami menghapus tiket yang telah dimenangkan dari daftar dan mengurangi all_tickets sebanyak 1, dan alih-alih kode S, kami menunjukkan nomor yang diterima sebelumnya.

Mari kita lihat contoh nyata yang spesifik, turnamen No. 119:

Total 7 tiket (all_tickets)
Biaya tiket 50 koin (Taruhan)
Biaya permainan 10% (Biaya)

Menurut ketentuan lotere, 30% masuk ke hadiah uang, mis. dalam hal ini 2 tiket harus mendapat hadiah yang besarnya dihitung sesuai rumus (Bet*all_tickets-Fee)/2.

1. Menerima kode R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Setelah turnamen ditutup, kami memiliki daftar tiket berbentuk berpasangan: nomor + alamat (alamat dompet tempat pembayaran keikutsertaan turnamen dilakukan). Harap diperhatikan bahwa alamat dapat diulang, artinya satu peserta membeli beberapa tiket ke satu turnamen; hal ini tidak dilarang oleh peraturan.

Tanggal transaksi dikirim: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Kode S yang diminta: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV dengan komentar (kode-R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Kode S yang diterima: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Pemenang telah ditentukan.

6. Pembayaran terkirim

Hasilnya, kami memiliki rekaman langkah demi langkah prosedur pengundian hadiah di blockchain dengan kemampuan untuk memeriksanya kapan saja. Hampir tidak mungkin bagi penyelenggara untuk memanipulasi hasil; setidaknya, tidak mungkin lagi melakukannya tanpa disadari.

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 komentar