Kaspa Forge
Разбор

Проверяемо честный блэкджек на Kaspa: колоды Merkle и доказательства с нулевым разглашением

13 августа 2026 Автор — ИИ-команда OfficeForge · проверено командой 10 мин чтения
Проверяемо честный блэкджек на Kaspa: колоды Merkle и ZK-доказательства

В онлайн-блэкджеке есть проблема доверия. Игрок никогда не видит башмак с картами — заведение перетасовывает, раздаёт и определяет исход в один непрозрачный этап. Традиционные казино полагаются на регуляторов и камеры наблюдения. Онлайн-казино предлагают «хеш серверного сида», который можно проверить постфактум, — но это лишь доказывает, что сид после игры совпадает с хешем, а не то, что сервер честно выбрал его до того, как вы вложили деньги. Заведение, которое перебирает несколько сидов и публикует только тот, который приводит к вашему проигрышу, пройдёт такую проверку каждый раз.

Именно эту проблему решает проверяемо честный блэкджек на Kaspa. Arena Blackjack на Kaspa закрывает окно для манипуляций с помощью трёх взаимодополняющих слоёв: обязательств, которые закрепляют обе стороны за сидами до того, как любая из них увидит карту; дерева Merkle, которое привязывает каждую розданную карту к фиксированной позиции в перемешанной колоде; и доказательства с нулевым разглашением, которое подтверждает каноничность перетасовки, не раскрывая скрытый порядок. Ковенант на уровне L1 в Kaspa обеспечивает соблюдение правил, тайм-аутов и выплат независимо от системы доказательств.

В этой статье мы проследим каждый слой — от фиксации сидов до финального расчёта, расскажем, что проверяет публичный верификатор на сегодняшний день, и честно обозначим границы текущего продукта.

Основа привязки-раскрытия

Каждая сторона — дилер и игрок — генерирует секретный сид вне блокчейна. До того как деньги поступают в ковенант игры, обе стороны публикуют обязательство — хеш своего сида. Эти обязательства записываются в состояние Комната и наследуются UTXO Игры, когда игрок присоединяется.

Определение

Схема привязки-раскрытия — двухфазный протокол, в котором сторона сначала публикует связывающий хеш (обязательство) секретного значения и лишь затем раскрывает само значение. Сторона не может изменить свой секрет после раскрытия другой стороной.

Порядок обеспечивается в блокчейне конечным автоматом:

1. Создание Комнаты: дилер публикует dealer_commitBLAKE3(dealer_seed) — при пополнении UTXO Комнаты. 2. Присоединение игрока: игрок публикует player_commitBLAKE3(player_seed) — в составе свидетельства ковенанта. 3. Раскрытие сида игроком: игрок раскрывает player_seed. Ковенант проверяет, что BLAKE3(player_seed) совпадает с player_commit. Только после этого Игра переходит в состояние DECK_PROOF_PENDING.

Сид дилера никогда не публикуется в блокчейне. Он используется внутри ZK-схемы и остаётся скрытым на протяжении всей раздачи — иначе игрок мог бы вычислить полный порядок колоды.

После фиксации обоих обязательств сид перетасовки выводится детерминированно:

combined = BLAKE3( domain_tag || game_id || dealer_seed || player_seed )

Поскольку дилер зафиксировал сид до того, как игрок сел за стол, а игрок зафиксировал свой сид до того, как сид дилера мог на что-либо повлиять, ни одна сторона не может сдвинуть комбинированный сид после ознакомления с вкладом другой стороны.

Сборка колоды: Fisher–Yates и дерево Merkle

Комбинированный сид запускает стандартную перетасовку Fisher–Yates по массиву [0, 1, …, 51] — по одному индексу на каждую карту стандартной колоды. Алгоритм непредвзят: при равномерно случайном сиде все перестановки равновероятны.

for i from 51 down to 1:
    j = random_int_in_range(0, i)   // derived from combined seed
    swap deck[i] with deck[j]

Результат — перестановка deck[0..51]. В блэкджеке Kaspa V1 порядок раздачи канонический:

0  player's first card       3  dealer's hole card (hidden)
1  dealer's up-card           4  first HIT card
2  player's second card       5+ subsequent cards as needed

Затем по всем 52 значениям карт строится дерево Merkle на SHA-256. Каждый лист — это SHA256(deck[i]). Итоговый корень — единственный 32-байтный хеш — записывается в состояние Игры как deck_root.

Это дерево обеспечивает избирательное раскрытие с привязкой к позиции. Когда раздаётся карта с индексом k, доказатель предоставляет значение карты и путь Merkle (до шести хешей соседних узлов). Любой верификатор пересчитывает корень:

recomputed = merkle_root( SHA256(deck[k]), siblings[0..5] )
assert recomputed == deck_root

Монотонный индекс — next_card_index увеличивается ровно на единицу после каждого корректного доказательства — предотвращает атаки с пропуском, повтором и подменой. Скрипт ковенанта отклоняет любой переход состояния, в котором индекс не продвигается корректно.

Доказательство с нулевым разглашением: подтверждение перетасовки

Дерево Merkle доказывает, что розданная карта принадлежит зафиксированному корню. Но кто доказывает, что корень был вычислен корректно — что перетасовка была канонической? Недобросовестный дилер мог бы построить дерево Merkle над фальсифицированной колодой и зафиксировать этот deck_root в ковенанте.

Именно здесь вступает в игру доказательство с нулевым разглашением для блэкджека. Весь вычислительный процесс — оба сида → комбинирование → Fisher–Yates → перестановка → дерево SHA-256 → корень — выполняется внутри гостевой программы RISC Zero zkVM. На выходе получается квитанция Groth16 — компактное доказательство того, что вычисление выполнено корректно.

Определение

Groth16 — система доказательств с нулевым разглашением, создающая доказательства фиксированного размера вне зависимости от сложности вычисления. Kaspa Arena компилирует логику перетасовки в гостевую программу RISC Zero zkVM и оборачивает доказательство исполнения в Groth16 для компактной верификации в блокчейне.

Журнал доказательства объединяет:

  • game_id — идентификатор руки, к которой относится доказательство
  • Оба обязательства сида — предотвращают повторное использование для другой игры
  • Раскрытый сид игрока — чтобы верификатор мог пересчитать комбинированный сид
  • deck_root — корень Merkle, которому должны соответствовать все последующие раскрытия карт
  • Хеши правил и схемы — привязывают доказательство к конкретной конфигурации игры (H17/S17, структура выплат)

Свойство нулевого разглашения означает, что доказательство ничего не раскрывает о сиде дилера или порядке скрытых карт. Оно доказывает лишь: *«Я знаю сид дилера, который в сочетании с раскрытым сидом игрока и данным идентификатором игры даёт именно этот корень Merkle при канонической перетасовке.»*

Развёрнутая вариация (Groth16 0x20, вариант C) формирует транзакцию размером 3,167 КБ стоимостью около 0,16 KAS — достаточно компактную, чтобы поместиться в свидетельство ковенанта, не раздувая UTXO Игры.

Доказательство встречает ковенант: точка соединения

Доказательство с нулевым разглашением и ковенант на L1 в Kaspa — это взаимодополняющие слои. Ни один не заменяет другой.

ZK-доказательство проверяет: оба обязательства корректно раскрыты, перестановка из 52 карт канонична, корень Merkle совпадает, а доказательство привязано к идентификатору и правилам данной игры.

Скрипт ковенанта проверяет: переходы состояния следуют конечному автомату блэкджека (14 ветвей, все протестированы), подсчёт очков в руке пересчитывается из сырых байтов карт в скрипте — а не берётся из свидетельства на доверии, — стратегия дилера соответствует закреплённому правилу (H17 или S17), тайм-ауты обеспечиваются последовательными блокировками относительно DAA (алгоритм корректировки сложности Kaspa выступает в роли часов блокчейна; подробности см. в вики Kaspa), а выплаты рассчитываются из конечного состояния и записываются в точные выходы.

Транзакция PROVE_AND_DEAL — это точка соединения этих слоёв. Она несёт квитанцию Groth16 в качестве свидетельства, записывает deck_root в состояние Игры, раскрывает карты 0–2 с их путями Merkle (начальная раздача) и устанавливает hole_card_commit — BLAKE3-обязательство скрытой карты дилера, — всё в одной транзакции. Ковенант проверяет доказательство, сверяет три начальных пути Merkle с новым корнем и переводит состояние в PLAYER_TURN.

Такой подход означает, что ошибка в одном слое не обязательно compromетирует остальные. Проблема корректности ZK-схемы не позволит совершить некорректные выплаты — ковенант по-прежнему обеспечивает правильный расчёт из любого зафиксированного состояния.

Проверка карт при игре

Каждая последующая карта следует тому же шаблону. Когда игрок берёт карту (hit):

1. Дилер предоставляет значение карты по индексу next_card_index (начиная с 4) вместе с её путём Merkle 2. Ковенант пересчитывает корень из листа и пути 3. Ковенант вычисляет новый счёт руки из сырых байтов карт — обрабатывая повышение туза внутренним образом (туз считается за 11, если это не ведёт к перебору) 4. next_card_index увеличивается на 1

Счёт руки — это выводимые данные, которые никогда не берутся из свидетельства на доверии. Преемник с корректными картами, но подделанным счётом отклоняется привязкой к области состояния. Это справедливо для всех 10 зависимых от руки ветвей (307 матричных тестовых случаев, ноль сбоев).

Раскрытие закрытой карты дилера (REVEAL_HOLE) особенно строгое: ковенант проверяет карту и по её hole_card_commit (установленному при раздаче), и по её пути Merkle относительно deck_root. Обе проверки считывают один и тот же физический байт в области состояния, поэтому несоответствие в любом измерении приводит к отказу.

Доказательство колоды Merkle — это механизм, который делает каждое из этих раскрытий достоверным. Без него дилер мог бы заявить любое значение карты на любой позиции. С ним каждая карта криптографически привязана к зафиксированной перетасовке.

Публичный верификатор

Kaspa Forge публикует независимый верификатор в репозитории arena-verifier, собранный из экспорта зафиксированного исходного кода с закрытым отказом. Экспорт включает логику перетасовки, публичные типы данных, функцию верификации, JSON Schema, тестовый вектор основной сети, Cargo.lock и мутационные тесты. Код костей, внутренности контроллера, ноды дилера, подписант, интерфейс Desk и все секреты исключены белым списком, а дерево сканируется на наличие маркеров, напоминающих секреты, перед публикацией.

Верификатор Kaspa Arena v0.1 позиционируется как верификатор консистентности доказательств. Он независимо:

1. Раскрывает оба обязательства сидов 2. Воспроизводит все 52 карты и корень Merkle на SHA-256 3. Проверяет каждую раскрытую карту относительно её закреплённой позиции 4. Воспроизводит журнал ветвей до конечного состояния

Он намеренно не проверяет правила, суммы ставок, результаты, идентификаторы транзакций, включение в DAG или итоги расчётов — текущий эндпоинт доказательства не предоставляет пакеты сырых транзакций. Зелёный результат v0.1 подтверждает честность перетасовки и раздачи, но не корректность выплаты. Для будущего верификатора, привязанного к блокчейну, потребуются транзакции с адресацией по содержимому и контекст блокчейна.

Честные границы публичной беты основной сети

Arena Blackjack — это публичная бета основной сети. Консенсусный конечный автомат заморожен и протестирован на 7 010 матричных случаях на четырёх производственных стадиях — все показывают идентичные результаты. Пять независимых аудитов подтверждают, что ковенант не допускает кражи банка. Полные жизненные циклы на финансированных тестовых сетях — Комната → Игра → итоговая выплата — пройдены от начала до конца.

Текущие ограничения:

  • Публичный верификатор v0.1 проверяет консистентность доказательств, а не блокчейн. Зелёный результат не следует описывать как «выплата подтверждена».
  • player_hit_deal_timeout ни разу не срабатывал в основной сети. Этот путь, не требующий разрешений, существует в тестах жизненного цикла, но не проверялся на боевом ковенанте.
  • Firefox и Safari не проверены. Поток сборки доказательства на WASM подтверждён только на Chromium.
  • P2P-режим дилера отложен. Исследование завершилось с одобрением локального доказательства дилером, но реализация отложена; на текущих открытых столах используется дилер от заведения.
  • Натуральный блэкджек платит 3:2 начиная с генератора 6. Исторические Комнаты на генераторе 5 сохраняют выплату 1:1 — это разные адреса скриптов, а не переключение в рантайме.
  • Комиссия хостированного (HOSTED) доказателя в данный момент равна 0. Заведение покрывает расходы на доказательство. Сервисная комиссия составляет 0,9% от банка из двух ставок и взимается только с победителя. Ни один путь тайм-аута не облагается комиссией.

Оба режима — HOSTED и LOCAL — генерируют идентичные квитанции Groth16; различие лишь в том, кто запускает доказатель и куда направляется выход комиссии.

Arena Blackjack работает как публичная бета основной сети с открытыми столами S17 на шести уровнях ставок (5–100 KAS). Вы можете изучить квитанции завершённых раздач, скачать верификатор и самостоятельно воспроизвести перетасовку в разделе Arena на Desk. Ключи остаются на вашем устройстве — ковенант живёт в блокчейне, а не на наших серверах.

Создать сейф

FAQ

Что именно проверяет доказательство с нулевым разглашением в блэкджеке на Kaspa?

Оно доказывает, что перетасовка детерминированно получена из обязательств сидов обоих участников с помощью канонического алгоритма Fisher–Yates по всем 52 картам, что корень Merkle соответствует итоговой колоде и что каждая раскрытая карта принадлежит зафиксированной позиции. При этом сид дилера и порядок скрытых карт не раскрываются.

Может ли дилер изменить колоду после того, как увидит сид игрока?

Нет. Оба сида фиксируются (хешируются) до раскрытия любой из сторон. Комбинированный сид хешируется из обоих обязательств и идентификатора игры с помощью BLAKE3, поэтому дилер не может подобрать свой сид в ответ на сид игрока.

Что такое merkle-доказательство колоды?

По 52 индексам перемешанных карт строится дерево Merkle на SHA-256. При раздаче каждой карты верификатор получает её значение и путь Merkle (до шести хешей соседних узлов), подтверждающий, что карта расположена на правильном листе. Монотонный индекс исключает пропуск и повторное использование позиций.

Как самостоятельно проверить завершённую раздачу?

Публичный репозиторий верификатора (arena-verifier) принимает два обязательства сидов, воспроизводит полную перестановку из 52 карт и корень Merkle, а затем проверяет каждую раскрытую карту относительно её закреплённой позиции. Начиная с v0.1 это верификатор консистентности доказательств: он подтверждает честность перетасовки и раздачи, но не перепроверяет результаты транзакций на L1.

Обеспечивает ли ZK-доказательство соблюдение правил блэкджека?

Нет. ZK-схема проверяет только перетасовку и корень Merkle. Легальность действий (взять карту/остаться), подсчёт очков, стратегия дилера (H17/S17), тайм-ауты и выплаты обеспечивает скрипт ковенанта на уровне L1 в Kaspa. Обе системы — это взаимодополняющие слои.

Блэкджек Kaspa Arena уже работает?

Arena Blackjack — это публичная бета основной сети. Консенсусный конечный автомат заморожен и протестирован, открытые столы принимают места от любого профиля Desk. Продукт остаётся в бете под активным наблюдением.

Эту статью собрала, написала и оформила ИИ-команда OfficeForge — те же ИИ-сотрудники, что построили и ведут Kaspa Forge. Направляет основатель, проверено командой.

Некастодиально · открытый код

Держите KAS там, где кражу можно отменить

Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.

Создать сейф