Skip to main content
Bàn chơi Mines đã được cố định trước khi bạn chọn bất kỳ ô nào. Giao dịch mở ván cam kết mã băm SHA-256 của một server seed ngẫu nhiên và ghi lại một slot hash của Solana, và bàn chơi là một hàm thuần túy của hai giá trị đó. Khi tất toán, chương trình tạo lại toàn bộ bàn chơi on-chain và từ chối mọi lệnh tất toán không khớp với nó. Trang này trình bày cơ chế chính xác đằng sau mọi bàn chơi Mines: cái gì được cam kết và khi nào, cách tạo bàn chơi chính xác, những gì chương trình kiểm tra lại khi tất toán, và những giới hạn thực sự của cơ chế này. Kiến thức nền: Tổng quan về công bằng có thể kiểm chứng (Provably Fair).

Cái gì được cam kết, và khi nào

Một ván Mines bắt đầu bằng một giao dịch on-chain duy nhất (mines_start) làm cùng lúc ba việc, trước khi bạn chọn bất kỳ ô nào:
  1. Cam kết phần đóng góp của nhà vận hành. Backend tạo một server_seed ngẫu nhiên dài 32 byte, và giao dịch lưu mã băm SHA-256 của nó, tức là bản cam kết. Bản thân seed được giữ kín cho đến khi ván kết thúc.
  2. Ghi lại entropy của chuỗi. Chương trình đọc slot hash gần nhất từ sysvar SlotHashes của Solana và lưu vào ván chơi.
  3. Đóng băng các điều kiện. Lợi thế nhà cái, mức trần trả thưởng và thời hạn hoàn tiền được chụp lại (snapshot) vào ván của bạn; không gì có thể định giá lại một bàn chơi bạn đang chơi.
Bàn chơi là một hàm thuần túy của seed đã cam kết, slot hash đã lưu, tài khoản của bạn và bộ đếm ván của bạn. Từ thời điểm này, bàn chơi đã cố định: mìn không thể di chuyển theo các lựa chọn của bạn. Trong lúc chơi, việc lật ô được xử lý off-chain (đó là lý do nó diễn ra tức thì); khi kết thúc, giao dịch tất toán công bố seed và chương trình tạo lại toàn bộ bàn chơi on-chain, từ chối mọi lệnh tất toán không khớp với nó.

Bàn chơi Mines được tạo ra như thế nào?

25 ô được đánh số từ 0 đến 24, lần lượt theo từng hàng trên lưới 5×5 (index = row × 5 + column). Bàn chơi là một mặt nạ 25 bit: bit t được bật nghĩa là ô t có mìn.
Những chi tiết quan trọng khi bạn tự tính lại:
  • Thứ tự đầu vào của hàm băm chính xác là: seed, slot hash, địa chỉ tài khoản người dùng, nonce (8 byte little-endian), nhãn ASCII "mines", rồi đến bộ đếm khối (8 byte little-endian, bắt đầu từ 0).
  • Mỗi đoạn 4 byte được đọc theo big-endian. Một khối cho tối đa 8 lần rút; luồng được nạp thêm bằng giá trị bộ đếm tiếp theo khi cần.
  • Vòng lặp lấy mẫu loại bỏ giúp mọi lần rút phân phối đều tuyệt đối: phép xáo trộn không có thiên lệch nào để bàn cãi.

Chương trình áp dụng công thức trả thưởng nào?

Mỗi lần lật được một ô an toàn, số tiền chốt lời của bạn được nhân với đúng nghịch đảo xác suất sống sót, và lợi thế nhà cái chỉ được áp dụng một lần:
Chương trình tính giá trị này bằng số học số nguyên chính xác và chỉ một phép chia làm tròn xuống ở bước cuối (phần làm tròn, tối đa một điểm cơ bản, nghiêng về phía nhà cái). Với lợi thế hiện tại 1.5%: Mức hoàn trả kỳ vọng là 1 − lợi thế cho mọi tổ hợp số mìn và số ô lật. Giá trị hiện tại được liệt kê tại Phí và giới hạn.

Chương trình kiểm tra những gì khi tất toán

Giao dịch tất toán (mines_settle) công bố server_seed và khai báo một kết quả: chốt lời với một tập các ô đã lật, hoặc trúng mìn tại một ô cụ thể. Sau đó chương trình kiểm tra mọi thứ on-chain:
  • sha256(server_seed) phải bằng bản cam kết đã lưu khi mở ván; một seed khác không thể tất toán ván chơi.
  • Bàn chơi được tạo lại từ đầu bằng công thức ở trên. Mọi ô được khai là đã lật nhưng thực ra là mìn đều bị từ chối; một ô được khai là trúng mìn nhưng không có mìn bị từ chối; một ô trúng mìn đồng thời được khai là đã lật cũng bị từ chối.
  • Hệ số nhân được tính on-chain từ lợi thế đã chụp lại và số ô bạn thực sự đã lật, nên tiền trả thưởng không thể bị khai sai.
  • Sự kiện tất toán công bố vĩnh viễn seed, slot hash, toàn bộ mặt nạ mìn, các ô bạn đã lật và kết quả.

Điều gì được đảm bảo, và điều gì không

Được chương trình thực thi:
  • Bàn chơi được cố định trước lượt chọn đầu tiên của bạn, nhờ bản cam kết cùng slot hash đã lưu. Mìn không thể di chuyển giữa ván.
  • Khi tất toán, nhà vận hành không thể nói dối về bàn chơi: seed sai, mìn bị khai là an toàn, hay trúng mìn giả đều khiến giao dịch thất bại.
  • Các điều kiện lúc bạn bắt đầu (lợi thế, mức trần trả thưởng, thời hạn) được áp dụng đến hết ván.
  • Tiền cược của bạn không bao giờ bị khóa: nếu nhà vận hành không bao giờ tất toán, sau thời hạn của ván thì bất kỳ ai cũng có thể gọi lệnh hủy để hoàn lại tiền cược cho bạn. Khi vận hành bình thường, bạn sẽ không bao giờ phải đến bước đó: một bàn chơi bị bỏ dở sẽ được chốt lời ở hệ số nhân hiện tại trước khi hết hạn (xem Mines), nên bạn giữ được tiền thắng chứ không chỉ tiền cược. Lệnh hủy không cần cấp quyền là lớp bảo đảm nền tảng, cho trường hợp nhà vận hành không còn nữa.
Những lưu ý thẳng thắn:
  • Nhà vận hành biết bàn chơi trong lúc bạn chơi. Đây là đặc điểm mang tính cấu trúc, không phải lỗi của riêng thiết kế này: việc lật ô được xử lý tức thì off-chain, và bên xử lý nó phải biết mìn nằm ở đâu. Không cơ chế ngẫu nhiên nào loại bỏ được điều này: ngay cả một bàn chơi tạo bằng VRF cũng sẽ bị nhà vận hành biết ngay khi họ xử lý lượt lật đầu tiên của bạn. Điều bản cam kết đảm bảo là hiểu biết đó không thể được dùng để thay đổi bàn chơi hay khai sai kết quả.
  • Thời điểm mở ván. Bàn chơi phụ thuộc vào slot hash được ghi lại khi ván của bạn bắt đầu, và giao dịch mở ván do backend gửi đi, cùng vấn đề thời điểm như ở các game khác. Biết trước một bàn chơi chỉ có ích nếu các lựa chọn của bạn dễ đoán; thay đổi vị trí bạn bấm sẽ vô hiệu hóa việc chọn bàn chơi dựa trên thời điểm.
  • Hủy ván. Nhà vận hành có thể hủy một ván đang diễn ra (về nguyên tắc, kể cả ván bạn đang thắng). Lệnh hủy hoàn lại toàn bộ tiền cược (không có cách nào tịch thu) và luôn phát ra một sự kiện công khai, nên bất kỳ ai cũng có thể kiểm toán tần suất hủy ván on-chain.
  • Mỗi ván phải dùng một seed mới: seed đã công bố là công khai, và dùng lại nó sẽ khiến bàn chơi kế tiếp có thể bị suy ra công khai. Chương trình từ chối việc dùng lại liên tiếp on-chain, và backend đảm bảo tính duy nhất trên toàn hệ thống.

Làm thế nào để xác minh một ván Mines?

Sự kiện tất toán (MinesGameSettled) trong giao dịch cuối cùng của ván chứa server_seed, slothash, user, nonce, mines_count, mines_mask, revealed_mask, bust_tile, multiplier_bps và is_win. Để xác minh:
  1. Kiểm tra bản cam kết: sha256(server_seed) phải bằng commit_hash được công bố trong giao dịch mở ván của bạn (sự kiện MinesGameStarted), chứng minh bàn chơi đã bị khóa trước lượt chọn đầu tiên của bạn.
  2. Tạo lại mặt nạ mìn bằng công thức ở trên và so sánh với mines_mask của sự kiện.
  3. Đối chiếu kết quả với mặt nạ: mọi bit của revealed_mask phải là ô an toàn, và ô trúng mìn phải là mìn.
  4. Kiểm tra hệ số nhân bằng công thức trả thưởng.
Xem Xác minh một ván để biết các mẹo chung về cách đọc dữ liệu sự kiện từ một trình khám phá khối (explorer). Để biết cách chơi game này, xem Hướng dẫn chơi Mines.