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

# Честность Mines

> Когда фиксируется коммит поля, как оно выводится и что программа перепроверяет при расчёте.

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

На этой странице описан точный механизм, стоящий за каждым полем [Mines](/ru/docs/games/mines): что фиксируется и когда, как именно выводится поле, что программа перепроверяет при расчёте и где честно проходят границы этой схемы. Общие сведения: [обзор доказуемой честности](/ru/docs/provably-fair/overview).

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

Игра в Mines начинается с одной ончейн-транзакции (`mines_start`), которая одновременно делает три вещи — **ещё до того, как вы выберете хоть одну клетку**:

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

Поле — чистая функция зафиксированного сида, сохранённого хеша слота, вашего аккаунта и счётчика ваших игр. **С этого момента поле зафиксировано**: мины не могут переместиться в ответ на ваши ходы. Во время игры клетки открываются вне блокчейна (именно поэтому это происходит мгновенно); в конце транзакция расчёта раскрывает сид, а программа **заново выводит всё поле в блокчейне** и отклоняет любой расчёт, который с ним не совпадает.

<h2 id="the-exact-board-derivation">
  Как выводится поле Mines?
</h2>

25 клеток пронумерованы от 0 до 24 построчно на сетке 5×5 (`index = row × 5 + column`). Поле — это 25-битная маска: установленный бит `t` означает, что под клеткой `t` спрятана мина.

```text theme={null}
входные данные
  server_seed  32 байта   сид оператора, при старте игры фиксируется как sha256(server_seed)
  slothash     32 байта   последний хеш слота Solana на момент выполнения стартовой транзакции
  user         32 байта   адрес вашего ончейн-аккаунта пользователя
  nonce        8 байт     счётчик ваших игр в Mines, little-endian
  mines_count  1..24      выбранное вами количество мин

случайный поток: блоки SHA-256, расходуемые по 4 байта
  block(k)   = sha256( server_seed ‖ slothash ‖ user ‖ nonce ‖ "mines" ‖ k )
               // "mines" = 5 байт ASCII; k = счётчик блоков 0, 1, 2, … в виде 8 байт little-endian
  next_u32() = следующие непрочитанные 4 байта текущего блока, big-endian;
               когда блок исчерпан, переход к block(k+1)

несмещённая выборка в диапазоне 0..bound (выборка с отклонением, без смещения по модулю)
  draw(bound):
    zone = 4294967295 − (4294967295 mod bound)
    повторять v = next_u32(), пока не станет v < zone
    вернуть v mod bound

поле: частичное перемешивание Фишера–Йетса
  tiles = [0, 1, …, 24]
  mine_mask = 0
  for i in 0..mines_count:
      j = i + draw(25 − i)
      поменять местами tiles[i] и tiles[j]
      mine_mask = mine_mask OR (1 << tiles[i])
```

Детали, важные при самостоятельном пересчёте:

* Порядок входных данных хеша строго такой: сид, хеш слота, адрес аккаунта пользователя, nonce (**8 байт little-endian**), ASCII-тег `"mines"`, затем счётчик блоков (**8 байт little-endian**, начиная с 0).
* Каждый 4-байтный фрагмент читается как **big-endian**. Один блок даёт не более 8 выборок; при необходимости поток пополняется блоком со следующим значением счётчика.
* Цикл выборки с отклонением делает каждую выборку строго равномерной: у перемешивания нет смещения, о котором можно было бы спорить.

<h2 id="the-payout-formula">
  Какую формулу выплаты применяет программа?
</h2>

Каждая открытая безопасная клетка умножает сумму кешаута на точную обратную величину вероятности уцелеть, а преимущество казино применяется один раз:

```text theme={null}
                                k−1
множитель = (1 − edge) × product ( (25 − i) / (25 − M − i) )
                                i=0

M = количество мин, k = количество открытых безопасных клеток
```

Программа вычисляет это в точной целочисленной арифметике с одним итоговым делением с округлением вниз (округление — не более одного базисного пункта — идёт в пользу казино). При текущем преимуществе 1.5%:

| Поле | Множитель |
| - | - |
| 3 мины, 1 открытая клетка | 1.1193x |
| 3 мины, 2 открытые клетки | 1.2792x |
| 24 мины, 1 открытая клетка | 24.625x |
| 1 мина, всё поле (24 открытые клетки) | 24.625x |

Ожидаемый возврат равен `1 − edge` при любом сочетании количества мин и открытых клеток. Текущие значения приведены в разделе [Комиссии и лимиты](/ru/docs/fees-and-limits).

## Что программа проверяет при расчёте

Транзакция расчёта (`mines_settle`) раскрывает `server_seed` и заявляет исход: кешаут с набором открытых клеток или подрыв на конкретной клетке. Затем программа проверяет всё в блокчейне:

* `sha256(server_seed)` должен совпадать с коммитом, сохранённым при старте игры; с другим сидом рассчитать игру невозможно.
* Поле **выводится заново с нуля** по формуле выше. Любая «открытая» клетка, под которой на самом деле мина, отклоняется; заявленная клетка подрыва, под которой нет мины, отклоняется; клетка подрыва, одновременно заявленная как открытая, тоже отклоняется.
* Множитель вычисляется в блокчейне по **зафиксированному в снимке** преимуществу и фактическому числу открытых клеток, поэтому исказить выплату невозможно.
* Событие расчёта навсегда публикует сид, хеш слота, полную маску мин, открытые вами клетки и исход.

## Что гарантировано, а что нет

**Обеспечивается программой:**

* Поле фиксируется до вашего первого хода — коммитом и сохранённым хешем слота. Мины не могут переместиться посреди игры.
* При расчёте оператор не может солгать о поле: неверный сид, мина, выданная за безопасную клетку, или фиктивный подрыв — всё это приводит к отказу транзакции.
* Условия, с которыми вы начали (преимущество, лимит выплаты, таймаут), действуют до конца игры.
* Вашу ставку невозможно заблокировать: если оператор так и не проведёт расчёт, после таймаута игры отмену может вызвать **кто угодно**, и ставка вернётся к вам. При нормальной работе до этого не доходит: брошенное поле закрывается кешаутом по текущему множителю ещё до таймаута (см. [Mines](/ru/docs/games/mines)), так что вы сохраняете выигрыш, а не только ставку. Отмена без разрешений — это гарантия нижнего уровня на случай, если оператор исчезнет.

**Честные оговорки:**

* **Оператор знает поле, пока вы играете.** Это структурная особенность, а не недостаток именно этой схемы: клетки открываются мгновенно вне блокчейна, и тот, кто их открывает, должен знать, где мины. Никакая схема генерации случайности этого не устраняет: даже поле, сгенерированное через VRF, станет известно оператору в момент, когда он откроет вашу первую клетку. Коммит гарантирует другое: эти знания нельзя использовать, чтобы *изменить* поле или *исказить* исход.
* **Момент старта.** Поле зависит от хеша слота, захваченного при старте игры, а стартовую транзакцию отправляет бэкенд — это то же соображение о тайминге, что и в других играх. Знание поля заранее помогает, только если ваши ходы предсказуемы; меняя места, куда вы кликаете, вы сводите на нет подбор поля по таймингу.
* **Аннулирование.** Оператор может отменить игру в процессе (в принципе, даже ту, в которой вы выигрываете). Отмена **возвращает всю ставку** (механизма конфискации не существует) и всегда порождает публичное событие, так что частоту аннулирований любой может проверить в блокчейне.
* Для каждой игры нужен новый сид: раскрытый сид публичен, и его повторное использование сделало бы следующее поле публично вычислимым. Программа отклоняет повторное использование подряд прямо в блокчейне, а бэкенд обеспечивает глобальную уникальность.

<h2 id="verify-a-game">
  Как проверить игру в Mines?
</h2>

Событие расчёта (`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. Проверьте множитель по формуле выплаты.

Общие советы о том, как читать данные событий в обозревателе блоков, — на странице [Проверка раунда](/ru/docs/provably-fair/verify-a-round).

Как играть в саму игру, описано в [руководстве по Mines](/ru/docs/games/mines).
