Skip to main content
Поле Mines фиксируется ещё до того, как вы выберете первую клетку. Открывающая транзакция публикует коммит — SHA-256-хеш случайного серверного сида — и захватывает хеш слота Solana, а поле является чистой функцией обоих значений. При расчёте программа заново выводит всё поле в блокчейне и отклоняет любой расчёт, который с ним не совпадает. На этой странице описан точный механизм, стоящий за каждым полем Mines: что фиксируется и когда, как именно выводится поле, что программа перепроверяет при расчёте и где честно проходят границы этой схемы. Общие сведения: обзор доказуемой честности.

Что фиксируется и когда

Игра в Mines начинается с одной ончейн-транзакции (mines_start), которая одновременно делает три вещи — ещё до того, как вы выберете хоть одну клетку:
  1. Фиксирует вклад оператора. Бэкенд генерирует случайный 32-байтный server_seed, а транзакция сохраняет его SHA-256-хеш — коммит. Сам сид остаётся скрытым до конца игры.
  2. Захватывает энтропию блокчейна. Программа считывает последний хеш слота из sysvar SlotHashes сети Solana и сохраняет его в игре.
  3. Замораживает условия. Преимущество казино, лимит выплаты и таймаут возврата записываются в вашу игру как снимок: ничто не может изменить условия поля, на котором вы уже играете.
Поле — чистая функция зафиксированного сида, сохранённого хеша слота, вашего аккаунта и счётчика ваших игр. С этого момента поле зафиксировано: мины не могут переместиться в ответ на ваши ходы. Во время игры клетки открываются вне блокчейна (именно поэтому это происходит мгновенно); в конце транзакция расчёта раскрывает сид, а программа заново выводит всё поле в блокчейне и отклоняет любой расчёт, который с ним не совпадает.

Как выводится поле 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.5%: Ожидаемый возврат равен 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. Чтобы проверить игру:
  1. Проверьте коммит: sha256(server_seed) должен совпадать с commit_hash, опубликованным в стартовой транзакции вашей игры (событие MinesGameStarted). Это доказывает, что поле было зафиксировано до вашего первого хода.
  2. Выведите маску мин заново по формуле выше и сравните её с mines_mask из события.
  3. Сверьте исход с маской: каждый бит revealed_mask должен соответствовать безопасной клетке, а клетка подрыва должна быть миной.
  4. Проверьте множитель по формуле выплаты.
Общие советы о том, как читать данные событий в обозревателе блоков, — на странице Проверка раунда. Как играть в саму игру, описано в руководстве по Mines.