Каждый раз, когда криптоказино показывает значок «Provably Fair», оно делает вполне конкретное математическое заявление. Большинство игроков его не проверяют. Они относятся к значку как к охранной наклейке на стекле автомобиля: успокаивает, но никто не проверял, работает ли она. Это ошибка. Проверка раздачи занимает несколько минут, когда понимаешь, из каких частей состоит система. А заодно вы узнаете, от чего эта система вас защищает, а от чего нет.
Это руководство — полный протокол аудита для Stake Originals Blackjack и похожих криптоигр в блэкджек. Мы разберём криптографию (SHA-256 и HMAC-SHA256), три входных параметра, которые определяют каждую карту, то, как хеш превращается в порядок карт в колоде, и пошаговую процедуру, которую можно выполнить после любой сессии. Затем мы проведём жёсткую границу между тем, что Provably Fair доказывает, и тем, чего не доказывает. Проверенная колода всё равно несёт в себе преимущество казино, и никакие настройки сида этого не изменят.
Почему «поверьте нам на слово» — это недостаточно
В наземном казино вы можете наблюдать за тасовкой. Вы видите лоток для сброса, ограничительную карту (подрезку) и руки дилера. Мошенничество возможно, но оно физически ограничено и поддаётся наблюдению. Онлайн-блэкджек на ГСЧ убирает всё это. Сервер сам решает, какая карта выйдет следующей, и раньше у вас не было способа узнать, было ли это решение принято до или после того, как программа увидела ваше удвоение на $500.
Традиционные онлайн-казино отвечают на это сертификатами сторонних лабораторий. Такие сертификаты полезны. Если вам нужно полное сравнение моделей доверия, прочитайте наш обзор «ГСЧ против живого дилера». Но отчёт лаборатории — это утверждение о программе на момент тестирования. Он не доказывает ничего о конкретной раздаче, которую вы только что проиграли.
Provably Fair меняет распределение бремени доказательства. Казино берёт на себя обязательство по своей случайности до того, как вы совершите действие. Затем вы получаете инструменты, чтобы проверить раздачу за раздачей, что это обязательство было выполнено.
Три входных параметра: серверный сид, клиентский сид, нонс
Каждая карта, сданная в раунде Provably Fair блэкджека, определяется ровно тремя входными параметрами. Если вы знаете все три и опубликованный алгоритм, вы можете абсолютно точно воспроизвести раздачу на своём компьютере.
1. Серверный сид
Серверный сид — это 64-символьная шестнадцатеричная строка, то есть 256 бит случайности. Казино генерирует её криптографически стойким генератором случайных чисел. Прежде чем вы сделаете хотя бы одну ставку, казино пропускает этот сид через SHA-256 и показывает вам только полученный хеш. Это и есть обязательство (коммитмент).
SHA-256 — односторонняя функция. Вернуться от хеша к сиду невозможно. Казино также не может подобрать другой сид, который даст тот же хеш, поскольку SHA-256 устойчив к коллизиям. Как только этот хеш оказался у вас на экране, казино связано обязательством. Оно не может подменить сид позже так, чтобы несовпадение не стало очевидным в момент вашей проверки.
2. Клиентский сид
Клиентский сид — это ваш вклад. По умолчанию его генерирует ваш браузер, но вы можете ввести любую строку: кличку собаки, случайную фразу, что угодно.
Вот ключевой момент. Вы можете задать или изменить клиентский сид после того, как сервер уже зафиксировал свой хешированный сид. Поэтому казино не может заранее подобрать серверный сид, рассчитанный на плохие для вас результаты именно с вашим клиентским сидом. Оно просто не знает, что вы выберете.
3. Нонс
Нонс — это целочисленный счётчик. Он начинается с 0, когда становится активной новая пара сидов, и увеличивается ровно на 1 с каждой ставкой. Ваша первая раздача при данной паре сидов — нонс 0, вторая — нонс 1, и так далее.
Именно нонс делает каждую раздачу уникальной, хотя оба сида остаются неизменными. Он же даёт каждой сыгранной вами раздаче постоянный, поддающийся проверке адрес: серверный сид + клиентский сид + нонс.
Ключевая концепция
Исход каждой раздачи полностью определяется тройкой (серверный сид, клиентский сид, нонс) ещё до того, как вы нажмёте «Bet». Размер вашей ставки, ваши решения в предыдущих раздачах и история вашего аккаунта входными параметрами не являются. Казино берёт обязательство по серверному сиду через его хеш SHA-256, вы фиксируете клиентский сид, а нонс просто ведёт счёт. Ни одна из сторон не может в одиночку повлиять на результат.
От хеша к картам: как строится раздача
Шаг первый: HMAC-SHA256 генерирует сырые байты
Игра передаёт входные данные в HMAC-SHA256. Это хеш с ключом: серверный сид выступает секретным ключом, а сообщение — это строка, составленная из вашего клиентского сида, нонса и курсора:
HMAC-SHA256(server_seed, "client_seed:nonce:cursor")
Каждый вызов выдаёт 32-байтовый дайджест. Раунду блэкджека может понадобиться больше случайных чисел, чем даёт один дайджест. В таком случае курсор увеличивается (0, 1, 2…) и генерируется новый 32-байтовый блок. Так для каждой отдельной раздачи получается длинный детерминированный поток непредсказуемых байтов.
Шаг второй: байты превращаются в числа с плавающей точкой из [0, 1)
Дайджест делится на 4-байтовые фрагменты, так что каждый 32-байтовый блок даёт восемь чисел. Каждый фрагмент преобразуется в число с плавающей точкой от 0 (включительно) до 1 (не включая) с помощью позиционного деления:
float = b0/256 + b1/256² + b2/256³ + b3/256⁴
Первый байт имеет наибольший вес, четвёртый — наименьший. В результате получается равномерно распределённое число с точностью около 32 бит, чего более чем достаточно, чтобы выбрать одну из 52 карт без измеримого смещения.
Шаг третий: Фишер — Йейтс строит неизменяемую колоду
В реализациях на основе тасовки эти числа управляют перемешиванием по алгоритму Фишера — Йейтса:
- Берём упорядоченный массив карт с индексами от 0 до 51.
- Идём от последней позиции к первой.
- На каждой позиции i умножаем следующее число на (i + 1) и берём целую часть. Получается индекс обмена j от 0 до i.
- Меняем местами карту i и карту j.
Фишер — Йейтс считается золотым стандартом, потому что он создаёт каждый из 52! возможных порядков колоды с одинаковой вероятностью, при условии что входная случайность равномерна. Как только числа зафиксированы, перестановка тоже зафиксирована. Получившаяся колода защищена от подделки в строгом смысле: измените один бит любого входного параметра — и получите совершенно другую колоду. Оставьте все входные данные прежними — и получите ту же самую колоду каждый раз, на любой машине, навсегда.
Внимание:
Не считайте, что каждый оператор использует перетасованную перестановку из 52 карт. Ряд криптоигр в блэкджек, включая опубликованную реализацию Stake Originals, вытягивают каждую карту независимо, напрямую сопоставляя число одному из 52 индексов карт (floor(float × 52)). Фактически это бесконечная колода, которая перетасовывается после каждой карты. Криптографическая гарантия при этом та же, но ваш верификатор должен в точности повторять алгоритм со страницы честности оператора. Если запустить не тот алгоритм, вы получите «несовпадение», которое будет вашей ошибкой, а не ошибкой казино.
Протокол аудита: проверка раздачи шаг за шагом
Вот процедура, которой я пользуюсь сам и которой учу других. Она работает для любой сыгранной вами раздачи, будь то обычный проигрыш или шестикарточные 21 у дилера, которые показались вам подозрительными.
Шаг 1: смените серверный сид, чтобы раскрыть секрет
Пока пара сидов активна, серверный сид остаётся скрытым. Иначе нельзя: его раскрытие позволило бы вам предсказать каждую будущую раздачу. Чтобы провести аудит, откройте настройки Fairness на Stake и смените (rotate) пару сидов. В этот момент казино выводит из обращения старый серверный сид и показывает его открытым текстом. Затем оно фиксирует новый хешированный сид для вашей дальнейшей игры.
Перед сменой запишите три вещи для той раздачи, которую хотите проверить:
- хешированный серверный сид, который вам показывали во время сессии,
- ваш клиентский сид,
- нонс интересующей вас раздачи, указанный в истории ставок.
Шаг 2: проверьте обязательство
Возьмите раскрытый серверный сид и сами вычислите его хеш SHA-256. Используйте локальный инструмент, а не страницу самого казино. В большинстве систем это делается одной командой в терминале. В Python это одна строка: hashlib.sha256(seed.encode()).hexdigest().
Сравните результат посимвольно с хешем-обязательством, который вы записали. Если они совпадают, сид, породивший ваши карты, доказуемо тот же, который казино зафиксировало до вашей ставки. Если не совпадают — прекратите игру и обращайтесь с жалобой. Это единственный сценарий, ради выявления которого и существует Provably Fair.
Шаг 3: независимо воспроизведите раздачу
Теперь пересоздайте карты. Используйте независимый скрипт с открытым исходным кодом, который можно прочитать построчно. Вот минимальный верификатор на Python, охватывающий и модель с тасовкой, и модель независимых вытягиваний:
import hmac, hashlib
def float_stream(server_seed, client_seed, nonce, count):
out, cursor = [], 0
while len(out) < count:
msg = f"{client_seed}:{nonce}:{cursor}".encode()
digest = hmac.new(server_seed.encode(), msg, hashlib.sha256).digest()
for i in range(0, 32, 4):
b = digest[i:i+4]
out.append(b[0]/256 + b[1]/256**2 + b[2]/256**3 + b[3]/256**4)
if len(out) == count:
break
cursor += 1
return out
def fisher_yates_deck(server_seed, client_seed, nonce):
deck = list(range(52))
floats = float_stream(server_seed, client_seed, nonce, 51)
for k, i in enumerate(range(51, 0, -1)):
j = int(floats[k] * (i + 1))
deck[i], deck[j] = deck[j], deck[i]
return deck
def independent_draws(server_seed, client_seed, nonce, n_cards=52):
return [int(f * 52) for f in float_stream(server_seed, client_seed, nonce, n_cards)]
Сопоставьте полученные индексы номиналам и мастям по таблице карт, опубликованной на странице честности оператора. Затем сравните первые несколько карт с историей вашей раздачи: ваша первая карта, открытая карта дилера, ваша вторая карта, закрытая карта дилера, а затем добираемые карты в порядке игры.
Если последовательность совпадает, раздача была проведена именно так, как было зафиксировано. Ваши решения влияли на то, какие карты вы получали, но никогда не меняли порядок карт, ожидающих в потоке.
Совет эксперта (Marcus Vance):
Никогда не полагайтесь только на встроенный верификатор самого казино. Он удобен, но вы просите подсудимого самому оценить собственный экзамен. Выполняйте проверку хеша и восстановление раздачи локально, кодом, который вы прочитали. Кроме того, задавайте клиентский сид вручную как новую случайную строку после появления каждого нового серверного хеша. Именно такой порядок делает схему обязательств неуязвимой, так что сделайте это привычкой.
Что Provably Fair доказывает, а что НЕТ
Именно здесь большинство игроков ошибаются, причём в обе стороны. Одни думают, что Provably Fair означает «казино эту игру не обыграть». Другие считают это маркетинговой пустышкой. Правда вполне конкретна:
| Утверждение | Доказано Provably Fair? | Почему |
|---|---|---|
| Карты не менялись после того, как казино увидело вашу ставку | Да | Серверный сид зафиксирован через SHA-256 до ставки |
| Казино не подбирало сид под ваш клиентский сид | Да (если вы задали клиентский сид после обязательства) | Казино не может предугадать сид, который вы выберете позже |
| В игре нет преимущества казино | Нет | Преимущество заложено в правилах и выплатах, а не в тасовке |
| Серверные сиды генерировались с надёжной энтропией | Напрямую нет | Обязательство доказывает согласованность, но не качество генерации сида |
| Казино выплатит выигрыш при выводе средств | Нет | Это вопрос операционной деятельности и лицензирования, а не криптографии |
| Подсчёт карт может принести выигрыш | Нет | Пересев на каждую раздачу или независимые вытягивания стирают память колоды |
Что касается качества генерации сида: обязательство доказывает, что казино не подменяло сиды. Вопрос о том, берёт ли его генератор сидов данные из корректно инициализированного криптостойкого ГПСЧ, — отдельный. Он разобран в анализе энтропии криптографического ГПСЧ на BlackjackMath.org.
Что касается подсчёта: каждая раздача генерируется заново из нового нонса, поэтому нет истощающегося шуза, за которым можно следить. Наша проверка реальности подсчёта карт онлайн объясняет, почему это убивает традиционную игру с преимуществом в онлайне.
Преимущество казино по-прежнему заложено в правилах
Скажу прямо: идеально честная тасовка невыгодной игры — по-прежнему невыгодная игра. Provably Fair гарантирует, что колода случайна. Преимущество казино проистекает из правил: дилер действует последним, вы получаете перебор первыми, а структура выплат фиксирована.
У Stake Originals Blackjack преимущество казино составляет примерно 0,57% при идеальной базовой стратегии. Эта цифра следует из набора правил: дилер останавливается на мягких 17, блэкджек платит 3:2, саррендера нет, а модель колоды фактически бесконечная.
Вот как отдельные правила смещают преимущество. Это приблизительные значения относительно стандартной многоколодной базы:
| Правило | Выгодный вариант | Невыгодный вариант | Прибл. влияние на преимущество |
|---|---|---|---|
| Выплата за блэкджек | 3:2 | 6:5 | ≈ +1,4% в пользу казино |
| Дилер на мягких 17 | Стоит (S17) | Берёт карту (H17) | ≈ +0,2% |
| Саррендер | Доступен поздний саррендер | Саррендера нет | ≈ +0,08% |
| Удвоение после сплита | Разрешено | Не разрешено | ≈ +0,14% |
| Модель колоды | Одна колода | Бесконечная колода / 8 колод | ≈ +0,5% до +0,6% |
Хотите увидеть, как именно количество колод и отдельные правила накладываются друг на друга? Разберите расчёт преимущества казино для правил одноколодной игры на BlackjackMath.org. Все выкладки находятся там, и повторять их, чтобы действовать согласно выводам, вам не нужно.
Строка о выплатах важнее всего. Криптографически идеальная игра 6:5 хуже, чем неказистая на вид игра 3:2, причём всегда. Наше руководство по выплатам 3:2 и 6:5 показывает ущерб в долларах. Кроме того, вы можете ввести набор правил любой игры в наш инструмент Table Grader и оценить её до начала игры.
Развенчание мифов о сидах
Миф: «Смена клиентского сида сбрасывает неудачу».
Нет, не сбрасывает. Каждая пара сидов порождает поток исходов с одинаковыми статистическими свойствами. Смена клиентского сида заменяет одну непредсказуемую последовательность другой, столь же непредсказуемой. Математическое ожидание на раздачу до и после идентично.
Смена сидов — хорошая практика для аудита, потому что она раскрывает старый серверный сид. На ваши ожидаемые результаты она не влияет вообще. Полосы проигрышей — это дисперсия, а дисперсии безразлично, как называется ваш сид.
Миф: «Когда я ставлю крупно, карты оборачиваются против меня».
Взгляните на входные параметры ещё раз: серверный сид, клиентский сид, нонс. Размера ставки среди них нет. Карты для нонса 47 были определены в тот момент, когда серверный хеш был зафиксирован, а ваш клиентский сид задан, задолго до того, как вы решили поставить $10 или $1000.
Если вы помните жестокую раздачу с крупной ставкой, проверьте её. Вы обнаружите, что карты в точности соответствуют обязательству. То, что вы испытываете, — это искажение памяти. Крупные проигрыши запоминаются, а крупные выигрыши кажутся заслуженными.
Миф: «Если я найду закономерность в прошлых раздачах, смогу предсказать следующие».
Выход HMAC-SHA256 без ключа вычислительно неотличим от случайного. Закономерности, которые вы замечаете в прошлых раздачах, — это шум. Для предсказания будущих раздач потребовался бы нераскрытый серверный сид, а это означало бы взлом SHA-256.
Внимание:
Будьте крайне осторожны с теми, кто продаёт программы-«предикторы сидов», сигнальные боты в Telegram или системы «паттернов нонса». Ни одна из них не может работать против корректно реализованной схемы обязательств. Многие из них — вредоносное ПО, созданное для кражи сессионных cookie или ключей кошельков. Легитимный верификатор всегда смотрит только назад, на раскрытые сиды. Он никогда не предсказывает вперёд.
Практическая процедура для сессии
Вот чек-лист, которым я пользуюсь на любой платформе с Provably Fair блэкджеком:
- Перед игрой: проверьте панель правил. Вам нужны 3:2, S17 и возможность удвоения и сплита. Оцените игру нашим инструментом Table Grader. Помните, что честная тасовка не исправляет плохие правила.
- Настройка сидов: смените пару на новую. Сделайте скриншот нового хешированного серверного сида, затем задайте собственный случайный клиентский сид.
- Во время игры: применяйте идеальную базовую стратегию для правил данной игры. Игнорируйте суеверия о сидах и определяйте размер ставок по банкроллу, а не «по ощущениям».
- После сессии: смените сиды, чтобы раскрыть старый серверный сид. Сверьте его хеш SHA-256 со скриншотом, затем выборочно проверьте несколько раздач своим локальным скриптом. В первую очередь проверяйте крупные или подозрительные.
- Ведите записи: сохраняйте сиды и нонсы в простой таблице. Если когда-нибудь возникнет спор, у вас будет криптографическое доказательство, а не просто жалоба.
Выбор места для игры — это не только криптография: правила, лимиты, лицензия и репутация по выводу средств тоже имеют значение. Наш хаб сравнения казино (1win & Stake) разбирает эти факторы бок о бок.
Итог
Provably Fair — это настоящая криптография, решающая одну конкретную задачу. Казино берёт обязательство по серверному сиду, хешированному SHA-256, до вашей ставки. Вы добавляете клиентский сид, который оно не может предугадать. Нонс даёт каждой раздаче постоянный воспроизводимый адрес. Меняйте сиды, проверяйте хеш и восстанавливайте раздачу своим скриптом — и вы будете точно знать, что ни одна карта не менялась после вашей ставки. Чего эта система не сделает, так это не уничтожит преимущество казино. Stake Originals Blackjack по-прежнему удерживает около 0,57% за счёт своих правил, и никакая смена сида, хитрости с размером ставки или система паттернов эту цифру не сдвинут. Проверяйте тасовку, оценивайте правила, играйте по идеальной базовой стратегии и управляйте банкроллом. Это полный набор инструментов честного игрока.
