Что фиксируется и когда
Игра в Mines начинается с одной ончейн-транзакции (mines_start), которая одновременно делает три вещи — ещё до того, как вы выберете хоть одну клетку:
- Фиксирует вклад оператора. Бэкенд генерирует случайный 32-байтный
server_seed, а транзакция сохраняет его SHA-256-хеш — коммит. Сам сид остаётся скрытым до конца игры. - Захватывает энтропию блокчейна. Программа считывает последний хеш слота из sysvar
SlotHashesсети Solana и сохраняет его в игре. - Замораживает условия. Преимущество казино, лимит выплаты и таймаут возврата записываются в вашу игру как снимок: ничто не может изменить условия поля, на котором вы уже играете.
Как выводится поле Mines?
25 клеток пронумерованы от 0 до 24 построчно на сетке 5×5 (index = row × 5 + column). Поле — это 25-битная маска: установленный бит t означает, что под клеткой t спрятана мина.
- Порядок входных данных хеша строго такой: сид, хеш слота, адрес аккаунта пользователя, nonce (8 байт little-endian), ASCII-тег
"mines", затем счётчик блоков (8 байт little-endian, начиная с 0). - Каждый 4-байтный фрагмент читается как big-endian. Один блок даёт не более 8 выборок; при необходимости поток пополняется блоком со следующим значением счётчика.
- Цикл выборки с отклонением делает каждую выборку строго равномерной: у перемешивания нет смещения, о котором можно было бы спорить.
Какую формулу выплаты применяет программа?
Каждая открытая безопасная клетка умножает сумму кешаута на точную обратную величину вероятности уцелеть, а преимущество казино применяется один раз:
Ожидаемый возврат равен
1 − edge при любом сочетании количества мин и открытых клеток. Текущие значения приведены в разделе Комиссии и лимиты.
Что программа проверяет при расчёте
Транзакция расчёта (mines_settle) раскрывает server_seed и заявляет исход: кешаут с набором открытых клеток или подрыв на конкретной клетке. Затем программа проверяет всё в блокчейне:
sha256(server_seed)должен совпадать с коммитом, сохранённым при старте игры; с другим сидом рассчитать игру невозможно.- Поле выводится заново с нуля по формуле выше. Любая «открытая» клетка, под которой на самом деле мина, отклоняется; заявленная клетка подрыва, под которой нет мины, отклоняется; клетка подрыва, одновременно заявленная как открытая, тоже отклоняется.
- Множитель вычисляется в блокчейне по зафиксированному в снимке преимуществу и фактическому числу открытых клеток, поэтому исказить выплату невозможно.
- Событие расчёта навсегда публикует сид, хеш слота, полную маску мин, открытые вами клетки и исход.
Что гарантировано, а что нет
Обеспечивается программой:- Поле фиксируется до вашего первого хода — коммитом и сохранённым хешем слота. Мины не могут переместиться посреди игры.
- При расчёте оператор не может солгать о поле: неверный сид, мина, выданная за безопасную клетку, или фиктивный подрыв — всё это приводит к отказу транзакции.
- Условия, с которыми вы начали (преимущество, лимит выплаты, таймаут), действуют до конца игры.
- Вашу ставку невозможно заблокировать: если оператор так и не проведёт расчёт, после таймаута игры отмену может вызвать кто угодно, и ставка вернётся к вам. При нормальной работе до этого не доходит: брошенное поле закрывается кешаутом по текущему множителю ещё до таймаута (см. Mines), так что вы сохраняете выигрыш, а не только ставку. Отмена без разрешений — это гарантия нижнего уровня на случай, если оператор исчезнет.
- Оператор знает поле, пока вы играете. Это структурная особенность, а не недостаток именно этой схемы: клетки открываются мгновенно вне блокчейна, и тот, кто их открывает, должен знать, где мины. Никакая схема генерации случайности этого не устраняет: даже поле, сгенерированное через VRF, станет известно оператору в момент, когда он откроет вашу первую клетку. Коммит гарантирует другое: эти знания нельзя использовать, чтобы изменить поле или исказить исход.
- Момент старта. Поле зависит от хеша слота, захваченного при старте игры, а стартовую транзакцию отправляет бэкенд — это то же соображение о тайминге, что и в других играх. Знание поля заранее помогает, только если ваши ходы предсказуемы; меняя места, куда вы кликаете, вы сводите на нет подбор поля по таймингу.
- Аннулирование. Оператор может отменить игру в процессе (в принципе, даже ту, в которой вы выигрываете). Отмена возвращает всю ставку (механизма конфискации не существует) и всегда порождает публичное событие, так что частоту аннулирований любой может проверить в блокчейне.
- Для каждой игры нужен новый сид: раскрытый сид публичен, и его повторное использование сделало бы следующее поле публично вычислимым. Программа отклоняет повторное использование подряд прямо в блокчейне, а бэкенд обеспечивает глобальную уникальность.
Как проверить игру в Mines?
Событие расчёта (MinesGameSettled) в финальной транзакции вашей игры содержит server_seed, slothash, user, nonce, mines_count, mines_mask, revealed_mask, bust_tile, multiplier_bps и is_win. Чтобы проверить игру:
- Проверьте коммит:
sha256(server_seed)должен совпадать сcommit_hash, опубликованным в стартовой транзакции вашей игры (событиеMinesGameStarted). Это доказывает, что поле было зафиксировано до вашего первого хода. - Выведите маску мин заново по формуле выше и сравните её с
mines_maskиз события. - Сверьте исход с маской: каждый бит
revealed_maskдолжен соответствовать безопасной клетке, а клетка подрыва должна быть миной. - Проверьте множитель по формуле выплаты.