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

# ラウンドを検証する

> 終了したラウンドを公開データから検証する実例と、より簡単な Dice・Mines の確認方法。

終了したラウンドはすべて、公開されたオンチェーンデータだけを使って自分で検証できます。アカウントも特別な権限も必要ありません。確認するのは次の3点です。コミットメントハッシュがラウンド開始前に公開されていたこと、公開されたシークレットのハッシュがそのコミットメントと一致すること、そして公開された式で再計算した結果がラウンドの実際の配当結果と一致することです。

このガイドでは、終了した [Crash](/ja/docs/games/crash) のラウンドを1つ取り上げ、最初から最後まで検証します。運営者のシークレットがラウンドの**前に**コミットされていたこと、そしてクラッシュポイントが[公開された式](/ja/docs/provably-fair/crash)の結果とぴったり一致することを確かめます。特別な権限は必要ありません。すべてのデータは公開オンチェーンデータから取得できます。最後の短いセクションでは、それぞれ1つのトランザクションで検証できる [Dice](#dice-and-mines) と Mines を扱います。

## 何を証明するのか

1. **コミットメントが先にあった。** シークレットのハッシュはラウンド開始前にオンチェーンに記録されていたため、ベットの後で結果を選ぶことはできませんでした。
2. **シークレットがコミットメントと一致する。** `sha256(secret)` がコミットされたハッシュと等しくなります。
3. **倍率が正しい。** シークレットとブロックハッシュから式を再計算すると、ラウンドの配当に使われたクラッシュポイントとまったく同じ値になります。

## ステップ1：アプリでラウンドの公平性データを開く

ベット履歴（またはラウンド履歴）を開き、終了したラウンドをクリックして詳細を表示します。ラウンドの結果と並んで、次の項目があります。

* **クラッシュ倍率**：検証対象となる最終倍率。
* **ゲームシークレットハッシュ**：公開された32バイトのシークレット。Solana エクスプローラー上の**コミットトランザクション**にリンクしています。
* **ブロックハッシュ**：チェーン由来のエントロピーとして使われる Solana のスロットハッシュ。**ラウンド開始トランザクション**にリンクしています。
* **「このゲームは公平？公平性検証ツールを使う」**：このラウンドの情報が入力済みの状態で公平性検証ツールを開きます。ツールはラウンドの3つのトランザクション署名（コミット、ブロックハッシュ、公開）とネットワークを取得し、以下の計算をワンクリックですべて再現します。

公平性検証ツールは手軽な方法です。このページの残りの部分では、チェーンと自分のコンピューター以外は何も信頼しない、完全に独立した方法を説明します。

## ステップ2：ラウンドの3つのトランザクション

| 公平性データ | オンチェーン命令 | 公開される内容 |
| - | - | - |
| コミットトランザクション | `start_new_round` | コミットメント `sha256(secret)`。ベット受付開始前に `CrashRoundPrepared` イベントで公開 |
| ブロックハッシュトランザクション | `start_game` | 取得された Solana スロットハッシュ。`CrashGameStarted` イベントで公開。この時点で結果が確定 |
| 公開トランザクション | `crash` | 公開されたシークレットと最終クラッシュポイント。`CrashRoundFinalized` イベントで公開 |

## ステップ3：Solana エクスプローラーで値を読み取る

お好みのエクスプローラー（Solscan、Solana Explorer、SolanaFM など）で、アプリが稼働しているネットワークを選んで各トランザクションを開きます。トランザクションのページで、デコードされたプログラムの**イベント**を探してください（「Logs」や「Instruction data」の下にある場合もあります。プログラムの IDL を認識するエクスプローラーでは、イベントのフィールドが名前付きでデコードされます）。

次の4つの値を集めます。

* `commit_hash`：32バイト。コミットトランザクションから取得。
* `blockhash`：32バイト。ブロックハッシュトランザクションから取得。
* `local_e`：32バイトのシークレット。公開トランザクションから取得。
* `crash_point_bps`：ベーシスポイント単位の最終クラッシュポイント。公開トランザクションから取得（29948 は 2.9948x を意味します）。

<Tip>
  **エンコーディング**

  エクスプローラーによって、32バイトの値は16進数、base58、またはバイト配列で表示されます。下のスクリプトは**16進数**を前提としています。エクスプローラーが base58 で表示している場合は変換してください（どの base58 デコーダーでも構いません。重要なのは表記ではなくバイト値そのものです）。
</Tip>

## ステップ4：順序を確認する

エクスプローラーで、コミットトランザクションとブロックハッシュトランザクションの**スロット**（またはブロック時刻）を比較します。コミットの方が先でなければなりません。これがこの仕組みの核心です。シークレットは、それと組み合わされるエントロピーが存在する前に封印されていたのです。

## ステップ5：クラッシュポイントを再計算する

ステップ3で得た3つの16進数文字列を入力し、Node.js で次のコードを実行します（依存パッケージは不要です）。

```js theme={null}
const { createHash } = require("node:crypto");
const sha256 = (buf) => createHash("sha256").update(buf).digest();

// ── ラウンドのオンチェーンイベントから入力（16進数、各32バイト）──
const commit = Buffer.from("<commit_hash hex>", "hex"); // コミットトランザクションから
const blockhash = Buffer.from("<blockhash hex>", "hex"); // ブロックハッシュトランザクションから
const secret = Buffer.from("<local_e hex>", "hex"); // 公開トランザクションから
const edgeBps = 150n; // ラウンド当時のハウスエッジ（bps）。「手数料と上限」を参照

// 1. 公開されたシークレットはコミットメントと一致しなければならない
console.log("commitment ok:", sha256(secret).equals(commit));

// 2. クラッシュポイントを再計算：プログラムが実行するのと同じ整数演算
const hash = sha256(Buffer.concat([blockhash, secret])); // 先に blockhash、次に secret
const X = BigInt(hash.readUInt32BE(0)); // 先頭4バイト、ビッグエンディアン
const TWO32 = 1n << 32n;
const cappedX = X < TWO32 - 1000n ? X : TWO32 - 1000n;
const raw = ((10000n - edgeBps) * TWO32) / (TWO32 - cappedX); // BigInt の除算は切り捨て
const crashBps = raw > 10000n ? raw : 10000n;

console.log("crash point:", `${Number(crashBps) / 10000}x`, `(${crashBps} bps)`);
```

両方の確認に合格する必要があります。`commitment ok: true` と表示され、出力されたクラッシュポイントがラウンドの**クラッシュ倍率**（および公開イベントの `crash_point_bps`）と一致しなければなりません。一致すれば、誰も信頼することなく、このラウンドの結果が開始前に確定しており、公開された式どおりに計算されたことを証明できたことになります。

<h2 id="dice-and-mines">
  Dice と Mines
</h2>

インスタントゲームも同じ方法で、より少ないトランザクションから検証できます。

* **Dice**：ベットごとに1つのトランザクション。その `DiceBetSettled` イベントには、導出に使うすべての入力（`slothash`、`user`、`nonce`）と `roll` および配当が含まれます。[Dice の公平性](/ja/docs/provably-fair/dice)の式で再計算してください。
* **Mines**：ゲームごとに2つのトランザクション。開始トランザクションがボードのコミットメントとスロットハッシュを公開し、精算トランザクションがシードとボード全体を公開します。[Mines の公平性](/ja/docs/provably-fair/mines)の式で再計算してください。

## 一致しない場合

まずはよくある原因を除外してください。16進数が必要な箇所に base58 の値を貼り付けた、別のトランザクションを見ている（各ラウンドには3つあります）、ラウンド当時とは異なるハウスエッジを使っている（エッジはオンチェーンの設定に保存されており、その変更自体もすべてオンチェーンのトランザクションです）、などです。

それでも本当に不一致がある場合、それこそがこの仕組みが明らかにするために存在するものです。データは公開され永続的に残るため、誰でもあなたの検証を再実行できます。ラウンド番号を添えてサポートにご連絡ください。なお、コミットメントや式の本当の不一致に正当な説明は存在しません。だからこそ、この仕組みはそれを隠せないようにしているのです。
