> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mycryptocasino.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Keadilan Mines

> Kapan papan dikunci (commit), bagaimana papan diturunkan, dan apa yang diperiksa ulang oleh program saat penyelesaian.

Papan Mines sudah ditetapkan sebelum Anda memilih satu kotak pun. Transaksi pembuka mengunci (commit) hash SHA-256 dari server seed acak dan merekam slot hash Solana, dan papan merupakan fungsi murni dari keduanya. Saat penyelesaian, program menurunkan ulang seluruh papan secara on-chain dan menolak penyelesaian apa pun yang tidak cocok dengannya.

Halaman ini menjelaskan mekanisme persis di balik setiap papan [Mines](/id/docs/games/mines): apa yang dikunci dan kapan, penurunan papan secara tepat, apa yang diperiksa ulang oleh program saat penyelesaian, serta batasan skema ini secara jujur. Latar belakang: [Ikhtisar provably fair](/id/docs/provably-fair/overview).

## 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**:

1. **Mengunci kontribusi operator.** Backend membuat `server_seed` acak sepanjang 32 byte, dan transaksi menyimpan hash SHA-256-nya, yaitu commitment. Seed itu sendiri tetap tersembunyi sampai game berakhir.
2. **Merekam entropi chain.** Program membaca slot hash terbaru dari sysvar `SlotHashes` Solana dan menyimpannya di dalam game.
3. **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.

Papan merupakan fungsi murni dari seed yang dikunci, slot hash yang tersimpan, akun Anda, dan penghitung game Anda. **Sejak saat ini papan sudah tetap**: ranjau tidak bisa berpindah sebagai respons terhadap pilihan Anda. Selama bermain, pembukaan kotak dilayani off-chain (itulah yang membuatnya instan); di akhir, transaksi penyelesaian mengungkap (reveal) seed, dan program **menurunkan ulang seluruh papan secara on-chain**, menolak penyelesaian apa pun yang tidak cocok dengannya.

<h2 id="the-exact-board-derivation">
  Bagaimana papan Mines diturunkan?
</h2>

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.

```text theme={null}
input
  server_seed  32 byte    seed operator, dikunci sebagai sha256(server_seed) saat game dimulai
  slothash     32 byte    slot hash Solana terbaru saat transaksi start dieksekusi
  user         32 byte    alamat akun pengguna on-chain Anda
  nonce        8 byte     penghitung game Mines Anda, little-endian
  mines_count  1..24      jumlah ranjau yang Anda pilih

aliran acak: blok SHA-256 dipakai 4 byte setiap kali
  block(k)   = sha256( server_seed ‖ slothash ‖ user ‖ nonce ‖ "mines" ‖ k )
               // "mines" = 5 byte ASCII; k = penghitung blok 0, 1, 2, … sebagai 8 byte little-endian
  next_u32() = 4 byte berikutnya yang belum dibaca dari blok saat ini, big-endian;
               jika blok habis, lanjut ke block(k+1)

pengambilan tak bias dalam 0..bound (rejection sampling, tanpa bias modulo)
  draw(bound):
    zone = 4294967295 − (4294967295 mod bound)
    ulangi v = next_u32() sampai v < zone
    kembalikan v mod bound

papan: pengacakan Fisher–Yates parsial
  tiles = [0, 1, …, 24]
  mine_mask = 0
  for i in 0..mines_count:
      j = i + draw(25 − i)
      tukar tiles[i] dan tiles[j]
      mine_mask = mine_mask OR (1 << tiles[i])
```

Detail yang penting saat Anda menghitungnya ulang:

* 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.

<h2 id="the-payout-formula">
  Formula pembayaran apa yang ditegakkan program?
</h2>

Setiap kotak aman yang dibuka mengalikan nilai cashout Anda dengan kebalikan persis dari peluang Anda untuk selamat, dengan house edge diterapkan satu kali:

```text theme={null}
                              k−1
pengali = (1 − edge) × product ( (25 − i) / (25 − M − i) )
                              i=0

M = jumlah ranjau, k = jumlah kotak aman yang dibuka
```

Program menghitungnya dengan aritmetika bilangan bulat yang eksak dan satu pembagian floor di akhir (pembulatan, paling banyak satu basis poin, menguntungkan kasino). Dengan edge saat ini sebesar 1.5%:

| Papan | Pengali |
| - | - |
| 3 ranjau, 1 kotak dibuka | 1.1193x |
| 3 ranjau, 2 kotak dibuka | 1.2792x |
| 24 ranjau, 1 kotak dibuka | 24.625x |
| 1 ranjau, full clear (24 kotak dibuka) | 24.625x |

Pengembalian yang diharapkan adalah `1 − edge` untuk setiap kombinasi jumlah ranjau dan kotak yang dibuka. Nilai saat ini tercantum di [Biaya & batas](/id/docs/fees-and-limits).

## 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](/id/docs/games/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.

**Catatan jujur:**

* **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.

<h2 id="verify-a-game">
  Bagaimana cara memverifikasi game Mines?
</h2>

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:

1. Periksa commitment: `sha256(server_seed)` harus sama dengan `commit_hash` yang dipublikasikan di transaksi start game Anda (event `MinesGameStarted`), membuktikan bahwa papan sudah dikunci sebelum pilihan pertama Anda.
2. Turunkan ulang mask ranjau dengan formula di atas dan bandingkan dengan `mines_mask` pada event.
3. Periksa hasil terhadap mask: setiap bit `revealed_mask` harus merupakan kotak aman, dan kotak bust harus berisi ranjau.
4. Periksa pengali dengan formula pembayaran.

Lihat [Verifikasi ronde](/id/docs/provably-fair/verify-a-round) untuk tips umum membaca data event dari explorer.

Untuk cara memainkan game ini, lihat [panduan game Mines](/id/docs/games/mines).
