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

# Minesの公平性

> 盤面がいつコミットされ、どのように導出され、決済時にプログラムが何を再検証するのか。

Minesの盤面は、タイルを1枚も選ぶ前に確定しています。開始トランザクションはランダムなサーバーシードのSHA-256ハッシュをコミットし、Solanaのスロットハッシュを取得します。盤面はこの2つだけから決まる純粋関数です。決済時には、プログラムがオンチェーンで盤面全体を再導出し、それと一致しない決済はすべて拒否します。

このページでは、すべての[Mines](/ja/docs/games/mines)の盤面を支える仕組みを正確に説明します。何がいつコミットされるのか、盤面の厳密な導出方法、決済時にプログラムが再検証する内容、そしてこの方式の限界を率直にお伝えします。背景については[Provably Fairの概要](/ja/docs/provably-fair/overview)をご覧ください。

## 何が、いつコミットされるのか

Minesのゲームは1件のオンチェーントランザクション（`mines_start`）で始まり、このトランザクションが**タイルを選ぶ前に**次の3つを同時に行います。

1. **オペレーター側の要素をコミットします。** バックエンドがランダムな32バイトの`server_seed`を生成し、トランザクションはそのSHA-256ハッシュ、つまりコミットメントを保存します。シードそのものはゲーム終了まで非公開のままです。
2. **チェーンのエントロピーを取得します。** プログラムはSolanaの`SlotHashes` sysvarから最新のスロットハッシュを読み取り、ゲームに保存します。
3. **条件を固定します。** ハウスエッジ、配当上限、返金タイムアウトがゲームにスナップショットとして記録されます。プレイ中の盤面の条件が後から変更されることはありません。

盤面は、コミットされたシード、保存されたスロットハッシュ、あなたのアカウント、ゲームカウンターから決まる純粋関数です。**この時点で盤面は確定します。** 選んだタイルに応じて地雷が動くことはありません。プレイ中のタイルの結果はオフチェーンで返されます（だから即座に表示されます）。終了時には決済トランザクションがシードを公開し、プログラムが**オンチェーンで盤面全体を再導出**して、それと一致しない決済はすべて拒否します。

<h2 id="the-exact-board-derivation">
  Minesの盤面はどのように導出されるのか
</h2>

25枚のタイルには、5×5のグリッド上で行ごとに0から24までの番号が振られます（`index = row × 5 + column`）。盤面は25ビットのマスクで、ビット`t`が立っていればタイル`t`に地雷があることを意味します。

```text theme={null}
入力
  server_seed  32バイト   オペレーターのシード。ゲーム開始時に sha256(server_seed) としてコミット
  slothash     32バイト   開始トランザクション実行時の最新の Solana スロットハッシュ
  user         32バイト   オンチェーンのユーザーアカウントのアドレス
  nonce        8バイト    Mines のゲームカウンター（リトルエンディアン）
  mines_count  1..24      選んだ地雷の数

乱数ストリーム：SHA-256 ブロックを 4 バイトずつ消費
  block(k)   = sha256( server_seed ‖ slothash ‖ user ‖ nonce ‖ "mines" ‖ k )
               // "mines" = ASCII 5 バイト。k = ブロックカウンター 0, 1, 2, …（8 バイト、リトルエンディアン）
  next_u32() = 現在のブロックで未読の次の 4 バイト（ビッグエンディアン）。
               ブロックを使い切ったら block(k+1) に進む

0..bound の偏りのない抽選（棄却サンプリング、剰余による偏りなし）
  draw(bound):
    zone = 4294967295 − (4294967295 mod bound)
    v = next_u32() を v < zone になるまで繰り返す
    v mod bound を返す

盤面：部分的な Fisher–Yates シャッフル
  tiles = [0, 1, …, 24]
  mine_mask = 0
  for i in 0..mines_count:
      j = i + draw(25 − i)
      tiles[i] と tiles[j] を入れ替える
      mine_mask = mine_mask OR (1 << tiles[i])
```

自分で再計算する際に重要な点：

* ハッシュ入力の順序は厳密に、シード、スロットハッシュ、ユーザーアカウントのアドレス、nonce（**8バイト、リトルエンディアン**）、ASCIIタグ`"mines"`、ブロックカウンター（**8バイト、リトルエンディアン**、0から開始）です。
* 4バイトのチャンクはそれぞれ**ビッグエンディアン**で読み取ります。1つのブロックから得られる抽選は最大8回で、必要に応じて次のカウンター値でストリームを補充します。
* 棄却サンプリングのループにより、すべての抽選は厳密に一様になります。シャッフルに偏りが入り込む余地はありません。

<h2 id="the-payout-formula">
  プログラムが強制する配当式は
</h2>

安全なタイルをめくるたびに、キャッシュアウト額に生存確率のちょうど逆数が掛けられ、ハウスエッジは1回だけ適用されます。

```text theme={null}
倍率 = (1 − ハウスエッジ) × ∏(i = 0 … k−1) ( (25 − i) / (25 − M − i) )

M = 地雷の数、k = めくった安全なタイルの数
```

プログラムはこれを厳密な整数演算で計算し、最後に1回だけ切り捨て除算を行います（丸めによる差は最大1ベーシスポイントで、ハウス側に有利になります）。現在のエッジ1.5%では次のとおりです。

| 盤面 | 倍率 |
| - | - |
| 地雷3個、1枚めくる | 1.1193x |
| 地雷3個、2枚めくる | 1.2792x |
| 地雷24個、1枚めくる | 24.625x |
| 地雷1個、フルクリア（24枚めくる） | 24.625x |

期待リターンは、地雷の数とめくる枚数のどの組み合わせでも`1 − edge`です。現在の値は[手数料と上限](/ja/docs/fees-and-limits)に掲載しています。

## 決済時にプログラムが強制すること

決済トランザクション（`mines_settle`）は`server_seed`を公開し、結果を申告します。めくったタイルの組を伴うキャッシュアウト、または特定のタイルでのバーストのいずれかです。そのうえでプログラムはすべてをオンチェーンで検証します。

* `sha256(server_seed)`はゲーム開始時に保存されたコミットメントと一致しなければなりません。別のシードではゲームを決済できません。
* 盤面は上記の式で**ゼロから再導出**されます。めくったと申告されたタイルが実際には地雷であれば拒否され、バーストと申告されたタイルが地雷でなければ拒否され、バーストのタイルがめくったタイルとしても申告されていれば拒否されます。
* 倍率は、**スナップショットされた**エッジと実際にめくった枚数からオンチェーンで計算されるため、配当を偽って報告することはできません。
* 決済イベントは、シード、スロットハッシュ、地雷マスク全体、めくったタイル、結果を恒久的に公開します。

## 保証されること、されないこと

**プログラムが強制すること：**

* 盤面は、コミットメントと保存されたスロットハッシュにより、最初のタイルを選ぶ前に確定します。ゲームの途中で地雷が動くことはありません。
* 決済時、オペレーターは盤面について嘘をつけません。誤ったシード、地雷を安全と申告すること、偽のバーストは、いずれもトランザクションを失敗させます。
* 開始時の条件（エッジ、配当上限、タイムアウト）はゲーム終了まで適用されます。
* 賭け金がロックされたままになることはありません。オペレーターが決済しない場合、ゲームのタイムアウト後は**誰でも**キャンセルを実行でき、賭け金が返金されます。通常の運用ではそこまで至りません。放置された盤面はタイムアウト前に現在の倍率でキャッシュアウトされるため（[Mines](/ja/docs/games/mines)を参照）、賭け金だけでなく獲得額も受け取れます。誰でも実行できるキャンセルは、オペレーターがいなくなった場合に備えた土台となる保証です。

**率直な注意点：**

* **プレイ中、オペレーターは盤面を知っています。** これは構造上のもので、この設計特有の欠陥ではありません。タイルの結果はオフチェーンで即座に返されるため、それを返す側は地雷の位置を知っている必要があります。どんな乱数方式でもこれは解消できません。たとえVRFで生成した盤面でも、最初のタイルの結果を返した時点でオペレーターはそれを知ることになります。コミットメントが保証するのは、この知識を使って盤面を*変更*したり、結果を*偽って報告*したりできないということです。
* **開始のタイミング。** 盤面はゲーム開始時に取得したスロットハッシュに依存し、開始トランザクションはバックエンドが送信します。これは他のゲームと同じタイミング上の考慮事項です。盤面を事前に知っていても、選ぶタイルが予測可能な場合にしか役に立ちません。クリックする位置を変えれば、タイミングを利用した盤面の選別は無効になります。
* **無効化。** オペレーターは進行中のゲームをキャンセルできます（原則として、勝っている最中のゲームも含みます）。キャンセルでは**賭け金が全額返金**され（没収する経路は存在しません）、必ず公開イベントが発行されるため、無効化の頻度は誰でもオンチェーンで監査できます。
* ゲームごとに新しいシードを使う必要があります。公開済みのシードは誰でも見られるため、再利用すると次の盤面を誰でも導出できてしまいます。プログラムは連続した再利用をオンチェーンで拒否し、バックエンドはグローバルな一意性を保証しています。

<h2 id="verify-a-game">
  Minesのゲームを検証するには
</h2>

ゲームの最後のトランザクションに含まれる決済イベント（`MinesGameSettled`）には、`server_seed`、`slothash`、`user`、`nonce`、`mines_count`、`mines_mask`、`revealed_mask`、`bust_tile`、`multiplier_bps`、`is_win`が含まれます。検証手順は次のとおりです。

1. コミットメントを確認します。`sha256(server_seed)`は、ゲームの開始トランザクション（`MinesGameStarted`イベント）で公開された`commit_hash`と一致しなければなりません。これにより、最初のタイルを選ぶ前に盤面が固定されていたことが証明されます。
2. 上記の式で地雷マスクを再導出し、イベントの`mines_mask`と比較します。
3. マスクと結果を照合します。`revealed_mask`のすべてのビットが安全なタイルであり、バーストのタイルが地雷でなければなりません。
4. 配当式で倍率を確認します。

エクスプローラーでイベントデータを読むための一般的なヒントは、[ラウンドを検証する](/ja/docs/provably-fair/verify-a-round)をご覧ください。

ゲームそのものの遊び方は、[Minesゲームガイド](/ja/docs/games/mines)をご覧ください。
