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:
- Cam kết phần đóng góp của nhà vận hành. Backend tạo một
server_seedngẫ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. - Ghi lại entropy của chuỗi. Chương trình đọc slot hash gần nhất từ sysvar
SlotHashescủa Solana và lưu vào ván chơi. - Đó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 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.
- 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:
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à 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:
- Kiểm tra bản cam kết:
sha256(server_seed)phải bằngcommit_hashđược công bố trong giao dịch mở ván của bạn (sự kiệnMinesGameStarted), chứng minh bàn chơi đã bị khóa trước lượt chọn đầu tiên của bạn. - Tạo lại mặt nạ mìn bằng công thức ở trên và so sánh với
mines_maskcủa sự kiện. - Đối chiếu kết quả với mặt nạ: mọi bit của
revealed_maskphải là ô an toàn, và ô trúng mìn phải là mìn. - Kiểm tra hệ số nhân bằng công thức trả thưởng.