Apa yang dikunci, dan kapan
Game Mines dimulai dengan satu transaksi on-chain (mines_start) yang melakukan tiga hal sekaligus, sebelum Anda memilih kotak apa pun:
- Mengunci kontribusi operator. Backend membuat
server_seedacak sepanjang 32 byte, dan transaksi menyimpan hash SHA-256-nya, yaitu commitment. Seed itu sendiri tetap tersembunyi sampai game berakhir. - Merekam entropi chain. Program membaca slot hash terbaru dari sysvar
SlotHashesSolana dan menyimpannya di dalam game. - Membekukan ketentuan. House edge, batas pembayaran, dan batas waktu refund direkam (snapshot) ke dalam game Anda; tidak ada yang bisa mengubah harga papan yang sedang Anda mainkan.
Bagaimana papan Mines diturunkan?
Ke-25 kotak diberi indeks 0 sampai 24, baris demi baris pada grid 5×5 (index = row × 5 + column). Papan berupa mask 25 bit: bit t yang menyala berarti kotak t menyembunyikan ranjau.
- Urutan input hash persis seperti ini: seed, slot hash, alamat akun pengguna, nonce (8 byte little-endian), tag ASCII
"mines", lalu penghitung blok (8 byte little-endian, dimulai dari 0). - Setiap potongan 4 byte dibaca secara big-endian. Satu blok menghasilkan paling banyak 8 pengambilan; aliran diisi ulang dengan nilai penghitung berikutnya bila diperlukan.
- Loop rejection sampling membuat setiap pengambilan benar-benar seragam: pengacakannya tidak memiliki bias yang bisa diperdebatkan.
Formula pembayaran apa yang ditegakkan program?
Setiap kotak aman yang dibuka mengalikan nilai cashout Anda dengan kebalikan persis dari peluang Anda untuk selamat, dengan house edge diterapkan satu kali:
Pengembalian yang diharapkan adalah
1 − edge untuk setiap kombinasi jumlah ranjau dan kotak yang dibuka. Nilai saat ini tercantum di Biaya & batas.
Apa yang ditegakkan program saat penyelesaian
Transaksi penyelesaian (mines_settle) mengungkap server_seed dan menyatakan sebuah hasil: cashout dengan sekumpulan kotak yang sudah dibuka, atau bust pada kotak tertentu. Program kemudian memeriksa semuanya secara on-chain:
sha256(server_seed)harus sama dengan commitment yang disimpan saat game dimulai; seed yang berbeda tidak dapat menyelesaikan game.- Papan diturunkan ulang dari awal dengan formula di atas. Kotak terbuka yang ternyata berisi ranjau akan ditolak; kotak bust yang diklaim tetapi bukan ranjau akan ditolak; kotak bust yang juga diklaim sebagai terbuka akan ditolak.
- Pengali dihitung on-chain dari edge yang direkam (snapshot) dan jumlah kotak yang benar-benar Anda buka, sehingga pembayaran tidak bisa dilaporkan secara keliru.
- Event penyelesaian memublikasikan seed, slot hash, mask ranjau lengkap, kotak yang Anda buka, dan hasilnya, secara permanen.
Apa yang dijamin, dan apa yang tidak
Ditegakkan oleh program:- Papan sudah tetap sebelum pilihan pertama Anda, berkat commitment ditambah slot hash yang tersimpan. Ranjau tidak bisa berpindah di tengah game.
- Saat penyelesaian, operator tidak bisa berbohong tentang papan: seed yang salah, ranjau yang diklaim aman, atau bust palsu semuanya membuat transaksi gagal.
- Ketentuan saat Anda memulai (edge, batas pembayaran, batas waktu) berlaku sampai game berakhir.
- Taruhan Anda tidak akan pernah terkunci: jika operator tidak pernah menyelesaikan game, pembatalan bisa dipanggil oleh siapa pun setelah batas waktu game, dan taruhan Anda dikembalikan. Dalam operasi normal Anda tidak akan sampai ke titik itu: papan yang ditinggalkan akan di-cashout pada pengali saat itu sebelum batas waktu (lihat Mines), sehingga Anda tetap mendapatkan kemenangan Anda, bukan sekadar taruhan Anda. Pembatalan tanpa izin (permissionless) adalah jaminan dasarnya, untuk kasus ketika operator sudah tidak ada.
- Operator mengetahui papan saat Anda bermain. Ini bersifat struktural, bukan kelemahan desain khusus ini: pembukaan kotak dilayani secara instan off-chain, dan siapa pun yang melayaninya harus tahu letak ranjau. Tidak ada skema keacakan yang bisa menghilangkan hal ini: bahkan papan yang dibuat dengan VRF pun akan diketahui operator begitu ia melayani pembukaan kotak pertama Anda. Yang dijamin oleh commitment adalah bahwa pengetahuan ini tidak dapat digunakan untuk mengubah papan atau melaporkan hasil secara keliru.
- Waktu mulai. Papan bergantung pada slot hash yang direkam saat game Anda dimulai, dan transaksi start dikirim oleh backend, pertimbangan waktu yang sama seperti pada game lainnya. Mengetahui papan lebih awal hanya berguna jika pilihan Anda dapat diprediksi; mengubah-ubah posisi klik Anda menggagalkan pemilihan papan berdasarkan waktu.
- Pembatalan (void). Operator dapat membatalkan game yang sedang berlangsung (termasuk, secara prinsip, game yang sedang Anda menangkan). Pembatalan mengembalikan seluruh taruhan (tidak ada jalur penyitaan) dan selalu memancarkan event publik, sehingga frekuensi pembatalan dapat diaudit on-chain oleh siapa pun.
- Setiap game harus memakai seed baru: seed yang sudah diungkap bersifat publik, dan memakainya ulang akan membuat papan berikutnya dapat diturunkan oleh publik. Program menolak pemakaian ulang berturut-turut secara on-chain, dan backend menegakkan keunikan secara global.
Bagaimana cara memverifikasi game Mines?
Event penyelesaian (MinesGameSettled) di transaksi terakhir game Anda memuat server_seed, slothash, user, nonce, mines_count, mines_mask, revealed_mask, bust_tile, multiplier_bps, dan is_win. Untuk memverifikasi:
- Periksa commitment:
sha256(server_seed)harus sama dengancommit_hashyang dipublikasikan di transaksi start game Anda (eventMinesGameStarted), membuktikan bahwa papan sudah dikunci sebelum pilihan pertama Anda. - Turunkan ulang mask ranjau dengan formula di atas dan bandingkan dengan
mines_maskpada event. - Periksa hasil terhadap mask: setiap bit
revealed_maskharus merupakan kotak aman, dan kotak bust harus berisi ranjau. - Periksa pengali dengan formula pembayaran.