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

# Xác minh một ván

> Hướng dẫn xác minh trọn vẹn một ván đã kết thúc từ dữ liệu công khai, kèm cách kiểm tra ngắn gọn hơn cho Dice và Mines.

Bạn có thể tự xác minh bất kỳ ván nào đã kết thúc từ dữ liệu on-chain công khai, không cần tài khoản hay quyền truy cập đặc biệt nào. Có ba điều cần kiểm tra: hash cam kết đã được công bố trước khi ván bắt đầu, giá trị bí mật được công bố có hash khớp với cam kết đó, và việc tính lại công thức công khai cho ra đúng kết quả mà ván đã trả thưởng.

Hướng dẫn này lấy một ván [Crash](/vi/docs/games/crash) đã kết thúc và xác minh từ đầu đến cuối: giá trị bí mật của nhà vận hành đã được cam kết **trước** ván, và điểm nổ đúng bằng kết quả mà [công thức công khai](/vi/docs/provably-fair/crash) tạo ra. Bạn không cần quyền truy cập đặc biệt nào: mọi thứ đều đến từ dữ liệu on-chain công khai. Phần ngắn ở cuối trang nói về [Dice](#dice-and-mines) và Mines, mỗi game chỉ cần xác minh từ một giao dịch duy nhất.

## Bạn đang chứng minh điều gì

1. **Cam kết có trước.** Hash của giá trị bí mật đã nằm on-chain trước khi ván bắt đầu, nên kết quả không thể được chọn sau khi bạn đặt cược.
2. **Giá trị bí mật khớp với cam kết.** `sha256(secret)` bằng đúng hash đã cam kết.
3. **Hệ số nhân là trung thực.** Tính lại công thức từ giá trị bí mật và block hash cho ra đúng điểm nổ mà ván đã trả thưởng.

## Bước 1: Mở dữ liệu công bằng của ván trong ứng dụng

Mở lịch sử cược của bạn (hoặc lịch sử ván) và nhấp vào một ván đã kết thúc để xem chi tiết. Bên cạnh kết quả của ván, bạn sẽ thấy:

* **Nổ tại**: hệ số nhân cuối cùng cần xác minh.
* **Hash bí mật của ván**: giá trị bí mật 32 byte đã được công bố. Nó liên kết tới **giao dịch commit** trên một trình khám phá Solana.
* **Block hash**: slot hash của Solana được dùng làm nguồn ngẫu nhiên từ chuỗi. Nó liên kết tới **giao dịch bắt đầu ván**.
* **“Ván này có công bằng không? Dùng công cụ kiểm chứng”**: mở công cụ kiểm chứng với ván này đã được điền sẵn. Công cụ lấy ba chữ ký giao dịch của ván (commit, block hash, reveal) cùng mạng, rồi tính lại toàn bộ các bước bên dưới cho bạn chỉ với một cú nhấp.

Công cụ kiểm chứng là cách tiện lợi. Phần còn lại của trang này là cách hoàn toàn độc lập, không tin vào gì ngoài blockchain và chiếc máy tính của chính bạn.

## Bước 2: Ba giao dịch của một ván

| Dữ liệu công bằng | Lệnh on-chain | Nội dung công bố |
| - | - | - |
| Giao dịch commit | `start_new_round` | Cam kết `sha256(secret)`, trong sự kiện `CrashRoundPrepared`, trước khi mở cược |
| Giao dịch block hash | `start_game` | Slot hash Solana đã ghi nhận, trong sự kiện `CrashGameStarted`; kết quả được cố định từ thời điểm này |
| Giao dịch reveal | `crash` | Giá trị bí mật được công bố và điểm nổ cuối cùng, trong sự kiện `CrashRoundFinalized` |

## Bước 3: Đọc các giá trị từ một trình khám phá Solana

Mở từng giao dịch trên trình khám phá bạn chọn (Solscan, Solana Explorer, SolanaFM…), trên đúng mạng mà ứng dụng đang chạy. Trên trang giao dịch, tìm các **sự kiện** (event) đã được giải mã của chương trình (đôi khi nằm trong mục “Logs” hoặc “Instruction data”; những trình khám phá biết IDL của chương trình sẽ giải mã các trường của sự kiện theo tên).

Thu thập bốn giá trị:

* `commit_hash`: 32 byte, từ giao dịch commit.
* `blockhash`: 32 byte, từ giao dịch block hash.
* `local_e`: giá trị bí mật 32 byte, từ giao dịch reveal.
* `crash_point_bps`: điểm nổ cuối cùng tính bằng điểm cơ bản (basis point), từ giao dịch reveal (29948 nghĩa là 2.9948x).

<Tip>
  **Định dạng mã hóa**

  Tùy trang, trình khám phá hiển thị giá trị 32 byte dưới dạng hex, base58 hoặc mảng byte. Đoạn script bên dưới cần **hex**; hãy chuyển đổi nếu trình khám phá của bạn hiển thị base58 (bộ giải mã base58 nào cũng được; điều quan trọng là giá trị các byte, không phải cách ghi).
</Tip>

## Bước 4: Kiểm tra thứ tự

Trên trình khám phá, so sánh **slot** (hoặc thời gian khối) của giao dịch commit và giao dịch block hash. Giao dịch commit phải có trước. Đây là cốt lõi của cơ chế: giá trị bí mật đã được niêm phong trước khi nguồn ngẫu nhiên mà nó được kết hợp cùng xuất hiện.

## Bước 5: Tính lại điểm nổ

Chạy đoạn này bằng Node.js (không cần thư viện phụ thuộc), điền ba chuỗi hex từ Bước 3:

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

// ── Điền các giá trị này từ các sự kiện on-chain của ván (hex, mỗi giá trị 32 byte) ──
const commit = Buffer.from("<commit_hash hex>", "hex"); // từ giao dịch commit
const blockhash = Buffer.from("<blockhash hex>", "hex"); // từ giao dịch block hash
const secret = Buffer.from("<local_e hex>", "hex"); // từ giao dịch reveal
const edgeBps = 150n; // lợi thế nhà cái (bps) tại thời điểm diễn ra ván; xem Phí và giới hạn

// 1. Giá trị bí mật được công bố phải khớp với cam kết
console.log("commitment ok:", sha256(secret).equals(commit));

// 2. Tính lại điểm nổ: đúng phép tính số nguyên mà chương trình thực hiện
const hash = sha256(Buffer.concat([blockhash, secret])); // blockhash trước, rồi đến secret
const X = BigInt(hash.readUInt32BE(0)); // 4 byte đầu, big-endian
const TWO32 = 1n << 32n;
const cappedX = X < TWO32 - 1000n ? X : TWO32 - 1000n;
const raw = ((10000n - edgeBps) * TWO32) / (TWO32 - cappedX); // phép chia BigInt làm tròn xuống
const crashBps = raw > 10000n ? raw : 10000n;

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

Cả hai phép kiểm tra đều phải đạt: `commitment ok: true`, và điểm nổ được in ra phải bằng hệ số nhân **Nổ tại** của ván (và bằng `crash_point_bps` trong sự kiện reveal). Nếu đúng như vậy, bạn đã chứng minh, mà không cần tin ai, rằng kết quả của ván này đã được khóa trước khi ván bắt đầu và được tính chính xác theo công thức công khai.

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

Các game tức thì được xác minh theo cùng cách, với ít giao dịch hơn:

* **Dice**: một giao dịch cho mỗi lượt cược. Sự kiện `DiceBetSettled` của nó chứa mọi đầu vào của phép dẫn xuất (`slothash`, `user`, `nonce`) cùng với `roll` và tiền trả thưởng. Tính lại bằng công thức trong [Tính công bằng của Dice](/vi/docs/provably-fair/dice).
* **Mines**: hai giao dịch cho mỗi game. Giao dịch bắt đầu công bố cam kết của bàn chơi và slot hash; giao dịch tất toán công bố seed và toàn bộ bàn chơi. Tính lại bằng công thức trong [Tính công bằng của Mines](/vi/docs/provably-fair/mines).

## Nếu có điều gì không khớp

Trước tiên hãy loại trừ những nguyên nhân thường gặp: dán giá trị base58 vào chỗ cần hex, lấy nhầm giao dịch (mỗi ván có ba giao dịch), hoặc dùng lợi thế nhà cái khác với mức tại thời điểm diễn ra ván (lợi thế nhà cái nằm trong cấu hình on-chain, và mọi thay đổi đối với nó cũng chính là một giao dịch on-chain).

Nếu vẫn thực sự không khớp, đó chính là điều mà hệ thống này tồn tại để phơi bày: dữ liệu là công khai và vĩnh viễn, nên bất kỳ ai cũng có thể chạy lại phép kiểm tra của bạn. Hãy liên hệ bộ phận hỗ trợ kèm số ván, và lưu ý rằng không có lời giải thích trung thực nào cho một sai lệch thật sự về cam kết hay công thức, đó chính là lý do cơ chế này khiến chúng không thể bị che giấu.
