[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-article-provably-fair-rng-explained-ru":3,"mdc-mrdvrw-key":78},{"id":4,"slug":5,"status":6,"section":7,"category":8,"author":9,"publish_date":10,"read_time":11,"image":12,"embedded_components":13,"related_calculators":13,"related_articles":14,"title":15,"description":16,"keywords":17,"content":26,"faq":27,"availableLocales":73},"e9e77cbe-752e-46fa-880b-37532301b050","provably-fair-rng-explained","published","casino","guides","Evgeniy Volkov","2026-04-22",14,"\u002Fimages\u002Fblog\u002Fprovably-fair-rng-explained.webp","[]",[],"Provably Fair RNG: Техническое руководство (2026)","Provably Fair RNG — как HMAC-SHA256 превращает сиды в dice-броски, crash-множители и карты. Полная математика + live верификатор (2026).",[18,19,20,21,22,23,24,25],"provably fair генерация случайных чисел","provably fair rng","hmac-sha256 rng","csprng provably fair","chainlink vrf казино","provably fair формула костей","provably fair формула краша","pf rng поверхность атаки","# Provably Fair — Генерирование случайных чисел объяснено (2026)\n\nТы только что поставил 0.5 BTC на крипто-дайс игру. На экране выпало `37.42` и ты проиграл. Ты открываешь панель честности и видишь хэш серверного сида, твой клиентский сид и nonce — четыре значения, которые якобы доказывают, что ничего не было сфальсифицировано. Но как эти четыре значения *стали* 37.42? Что именно превратило случайные символы в конкретный результат дайса?\n\nВот в чём суть: всё обещание Provably Fair зависит от одного конкретного действия — преобразования криптографического хэша в результат игры. Если не разобраться в этом преобразовании, Provably Fair кажется магическим маркетингом. Если разобраться, ты сможешь проверить любое PF казино примерно за 60 секунд, заметить поддельные реализации с первого взгляда и точно знать, какие атаки протокол может отразить, а какие нет.\n\nЭто руководство проведёт тебя через **генерирование случайных чисел в Provably Fair** так, как разработчик строил бы это в 2026 году — CSPRNG примитивы под капотом, формула HMAC-SHA256, которая превращает сиды в числа, разные схемы маппинга для дайса, крэша и карт, и поверхность атак, которая остаётся даже когда математика идеальна. В конце ты узнаешь, почему PF RNG криптографически невозможно сломать, какие баги реализации всё ещё их портят, и когда вместо них используется блокчейн-случайность (Chainlink VRF).\n\n## Кратко — Как PF RNG на самом деле генерируют числа\n\nКаждая Provably Fair игра использует одинаковый основной RNG примитив, отличается только маппинг выходных данных. Вот версия на 60 секунд.\n\n| Шаг | Что происходит | Кто это контролирует |\n|---|---|---|\n| 1. Генерируем серверный сид | CSPRNG казино выдаёт случайную строку из 32–64 байт | Казино |\n| 2. Хэшируем и публикуем | SHA-256(server_seed) показывается тебе до раунда | Казино |\n| 3. Собираем клиентский сид + nonce | Твой браузер добавляет клиентский сид; nonce — счётчик раунда | Ты + протокол |\n| 4. Вычисляем HMAC | `hex = HMAC-SHA256(server_seed, client_seed : nonce)` | Детерминировано |\n| 5. Маппируем hex в результат | Срез + модуль + деление = рол дайса, множитель крэша или карта | Детерминировано |\n| 6. Раскрываем и проверяем | После ротации сырой сид раскрывается; кто угодно может повторить шаг 4 | Ты |\n\nМатематика:\n\n$$\\text{outcome} = f\\big(\\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} : \\text{nonce})\\big)$$\n\nГде `f` — функция маппинга, специфичная для игры — `f_dice` возвращает 0-99.99, `f_crash` возвращает множитель, `f_cards` возвращает позиции перетасованной колоды. Часть HMAC идентична во всех PF казино мира.\n\n### Ключевые цифры, которые нужно знать\n\n- **3 входа**: серверный сид + клиентский сид + nonce создают каждый результат\n- **64 hex-символа**: длина SHA-256 \u002F HMAC-SHA256 выхода\n- **128 hex-символов**: длина HMAC-SHA512 (используется BC.Game и PF блэкджек)\n- **~2^256 операций**: что потребуется, чтобы сломать HMAC-SHA256 — астрономически невозможно\n- **0.00–99.99**: стандартный диапазон дайса после маппинга\n- **1.00x до ∞**: стандартный диапазон множителя крэша (ограничен на практике точностью float)\n\n### Честность ≠ Прибыль\n\nТо, что RNG Provably Fair, говорит тебе, что казино не могло манипулировать результатом *после* твоей ставки. Это **не** говорит:\n\n- Разумна ли маржа казино (проверь RTP отдельно)\n- Будет ли казино честить выводы\n- Честны ли бонусы и условия отыгрыша\n- Был ли пул серверных сидов беспристрастным до коммита\n\nПолную поверхность атак мы разберём ниже. Для более широкого сравнения с традиционной сертификацией см. наш гайд [Provably Fair vs RNG-сертифицировано](\u002Fblog\u002Fprovably-fair-vs-rng-certified).\n\n## Что делает RNG \"Provably Fair\"\n\nПеред тем как перейти к формуле, помогает разделить *Provably Fair* от более широкого мира RNG. PF — это конкретное улучшение для CSPRNG, не замена.\n\n### Примитив Commit-Reveal\n\nВесь трюк Provably Fair — это криптографический паттерн, называемый **commit-reveal**.\n\nПеред началом раунда казино коммитится к конкретному серверному сиду, публикуя его SHA-256 хэш. Хэш — это 64-символьный отпечаток пальца, уникально идентифицирующий сид без раскрытия его. Так как SHA-256 не имеет практических коллизионных атак, казино не может потом найти *другой* сид, который даст такой же хэш — они зафиксированы.\n\nПосле раунда (или после того, как ты ротируешь сиды), сырой серверный сид раскрывается. Ты хэшируешь его сам. Если твой хэш совпадает с тем, что было опубликовано до раунда, казино доказало, что они не меняли сиды посередине раунда. В сочетании с твоим клиентским сидом (который они не знали заранее), это делает манипуляцию результатом за раунд криптографически невозможной.\n\nСлой commit-reveal — это то, что отделяет PF от любого другого CSPRNG. Традиционное RNG-сертифицированное казино тоже использует CSPRNG — но ничто не помешает им поменять его в продакшене, как [iTech Labs аудиты доказывают только статистические свойства](https:\u002F\u002Fwww.itechlabs.com), не идентичность во время выполнения.\n\n### HMAC как примитив RNG\n\nHMAC-SHA256 — это реальный генератор случайных чисел внутри каждого PF раунда. Вот почему он работает:\n\n- **Детерминированный**: При одинаковых входах HMAC всегда выдаёт одинаковый выход. Это позволяет тебе проверить.\n- **Односторонний**: По выходу ты не можешь восстановить серверный сид (ключ). Это то, что держит результат непредсказуемым.\n- **Равномерный**: HMAC выходы неотличимы от случайных 256-битных строк. Это то, что держит игру беспристрастной.\n- **С ключом**: Серверный сид действует как секрет, который нужно знать, чтобы воспроизвести выход. Это то, что предотвращает манипуляцию.\n\nТехнически HMAC-SHA256 не является CSPRNG сам по себе — это код аутентификации сообщения. Но когда ключ (серверный сид) генерируется из реального источника энтропии, конструкция эквивалентна CSPRNG для всех практических целей. NIST формализовал это как **HMAC_DRBG** в [SP 800-90A Rev 1](https:\u002F\u002Fcsrc.nist.gov\u002Fpublications\u002Fdetail\u002Fsp\u002F800-90a\u002Frev-1\u002Ffinal), и PF казино по сути переработают этот стандарт с добавлением публичного коммита сида.\n\n### Почему CSPRNG важны (не Math.random)\n\nКаждое легитимное PF казино генерирует серверный сид криптографически защищённым RNG — **не** JavaScript `Math.random()`. Разница важнее, чем кажется большинству игроков:\n\n| Генератор | Предсказуем после видения выхода? | Приемлем для PF? |\n|---|---|---|\n| `Math.random()` (V8 в Chrome) | Да, после ~700 выходов | Никогда |\n| Linux `\u002Fdev\u002Furandom` | Нет | Да |\n| `crypto.getRandomValues` (браузер) | Нет | Да |\n| Node.js `crypto.randomBytes` | Нет | Да |\n| Hardware RNG (Intel RDRAND) | Нет | Да |\n\nЕсли казино тайком сидит в `Math.random()`, квалифицированный атакующий мог бы восстановить сид из достаточного числа публичных выходов и предсказать каждый будущий раунд — даже если математика HMAC идеальна. Вот почему проверка того, что твоё казино действительно использует `crypto.randomBytes` или эквивалент, имеет значение; объяснение [что такое Provably Fair гемблинг](\u002Fblog\u002Fwhat-is-provably-fair-gambling) охватывает полную цепь доверия.\n## Как число фактически генерируется\n\nТеперь сама формула. Это раздел, который стоит добавить в закладки — всё выше было контекстом.\n\n### Три входа, одна формула\n\nКаждый раунд Provably Fair вычисляет:\n\n$$\\text{hex\\_output} = \\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} \\; : \\; \\text{nonce})$$\n\nВ псевдокоде:\n\n```\nfunction pfHmac(serverSeed, clientSeed, nonce) {\n  const message = clientSeed + ':' + nonce\n  const hex = hmacSha256(serverSeed, message)  \u002F\u002F 64-символная hex-строка\n  return hex\n}\n```\n\nДвоеточие `:` — это канонический разделитель на Stake, Primedice, Rainbet и большинстве PF-казино. Несколько (BC.Game, Roobet) используют другие разделители — всегда проверяй документацию честности казино на предмет точного формата.\n\nНа выходе получается 64-символная шестнадцатеричная строка типа `8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d`. Этот hex — сырая случайность — 256 бит непредсказуемости, статистически неотличимая от подбрасывания 256 справедливых монет.\n\n::chart-provably-fair-process\n::\n\n### Пошагово: от выхода HMAC к результату в игре\n\nДавай разберём один раунд полностью.\n\n**Исходные значения:**\n\n- `server_seed = f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4`\n- `client_seed = player-xyz-42`\n- `nonce = 7`\n\n**Шаг 1 — вычислить HMAC:**\n\n```\nHMAC-SHA256(server_seed, \"player-xyz-42:7\")\n= 8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d\n```\n\n**Шаг 2 — извлечь первые 5 символов hex:**\n\n`8b2d4` → преобразовать в десятичное → `569 300`\n\n**Шаг 3 — отобразить на диапазон 0-99.9999:**\n\n```\ndice = (569_300 % 1_000_000) \u002F 10_000\n     = 569_300 \u002F 10_000\n     = 56.93\n```\n\n**Шаг 4 — применить логику ставки:**\n\nЕсли ты поставил \"выпадет меньше 50\" → ты проиграл (56.93 > 50). Если ты поставил \"выпадет меньше 60\" → ты выиграл. Точный результат был определён в момент, когда эти три входа объединились, ещё до того, как запустилась анимация в интерфейсе.\n\n**Шаг 5 — проверить:**\n\nПосле раунда ты получаешь открытый `server_seed`. Ты его хэшируешь — SHA-256 совпадает с предварительно заверенным хэшем? Хорошо. Ты повторно запускаешь шаги 1-3 — воспроизвёл `56.93`? Хорошо. Раунд криптографически подтверждён как честный.\n\nДля полного пошагового разбора с копипастой значений и скриншотами, см. [как проверить Provably Fair раунд](\u002Fblog\u002Fhow-to-verify-provably-fair).\n\n### Разные игры, разные формулы\n\nВызов HMAC всегда идентичен. Меняется шаг 3 — как hex отображается на конкретный результат игры.\n\n| Игра | Срез hex | Формула | Диапазон выхода |\n|---|---|---|---|\n| **Dice** | Первые 5 символов | `(int % 1e6) \u002F 1e4` | 0.0000-99.9999 |\n| **Crash** | Первые 8 символов | `floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100` | 1.00x и выше |\n| **Coinflip** | Первые 2 символа | `int % 2` (0 или 1) | Орёл\u002FРешка |\n| **Roulette** | Первые 2 символа | `int % 37` (Европейская) или `% 38` (Американская) | 0-36 или 0-37 |\n| **Plinko** | Первые 4 символа × n бросков | `int % rows` за бросок | Путь через колышки |\n| **Blackjack (HMAC-SHA512)** | 4 символа за карту | `int % 52` с логикой замещения | Позиция в колоде |\n\nКаждое отображение разработано так, чтобы быть равномерным по всему диапазону выхода — модульная арифметика над равномерно случайным hex-значением сохраняет равномерность. Вот почему PF-игры могут заявлять об честном RTP без манипуляции отдельными раундами со стороны казино. *Формула отображения* настраивается, чтобы попасть в целевой перевес дома казино, а не сама случайность.\n\n## От hex-строки к результату в игре (с математикой)\n\nОтображение для dice стоит разобрать подробнее, потому что это самый наглядный случай — и потому что это показывает, почему распределение Provably Fair в dice действительно равномерно при правильной реализации.\n\n### Отображение Dice (0-99.9999)\n\nDice на Stake использует первые 5 символов hex, что даёт 20 бит = 1 048 576 возможных значений. Отображение выглядит так:\n\n$$\\text{dice} = \\frac{(\\text{int}(\\text{hex}_{0:5}) \\; \\text{mod} \\; 10^6)}{10^4}$$\n\nЗачем модуль 1 000 000, если срез может достигать 1 048 575? Потому что без модуля значения 1 000 000-1 048 575 отобразились бы на 100.0000-104.8575, за пределами диапазона dice. Модуль складывает их обратно — но вводит крошечную ошибку (значения 0-48 575 более вероятны, чем 48 576-99 999 в соотношении 2:1). Чтобы исключить смещение, реальные реализации *отклоняют* срезы выше 1 000 000 и переходят к следующему куску hex (символы 5-10, затем 10-15 и т. д.).\n\nПри правильной реализации это даёт идеально равномерное распределение от 0.0000 до 99.9999. Тест из 10 000 бросков показывает практически плоское покрытие — гистограмма ниже воспроизводит то, что ты увидишь с любой легитимной реализацией PF-dice.\n\n::chart-rng-distribution\n::\n\n### Отображение Crash (множитель)\n\nCrash интереснее, потому что выход не равномерный — он сознательно смещён, чтобы создать драматичный геймплей, сохраняя целевой перевес дома.\n\n$$\\text{crash} = \\frac{\\left\\lfloor \\dfrac{100 \\cdot 2^{52} - h}{2^{52} - h} \\right\\rfloor}{100}$$\n\nГде `h = int(hex[0:8])` (32-битное целое число из первых 8 символов hex). С одной оговоркой: если `h mod 33 == 0`, множитель равен 1.00x (мгновенный краш), что создаёт примерно 1% перевес дома на Stake. Другие казино используют разные делители — 25 (Rainbet, примерно 4% перевеса), 50 (варианты с низким перевесом), 100 (очень низкий перевес).\n\nЗапусти эту формулу миллион раз и получишь распределение, где ~50% раундов краша под 2x, ~10% проходят 10x, и может быть 1% достигают 100x. Ожидаемая ценность выходит 0.99 на 1 ставку — недостающий 1% — это перевес дома, встроенный в константы формулы, а не в манипуляцию отдельными раундами.\n\n### Отображение карт (перемешивание колод)\n\nPF blackjack, покер и баккара перемешивают виртуальные колоды с использованием HMAC-SHA512 (более длинный выход = больше карт на вызов хэша). Стандартный алгоритм Fisher-Yates:\n\n```\nfor i = 51 down to 1:\n  j = hmac_int(i) mod (i + 1)\n  swap(deck[i], deck[j])\n```\n\nКаждый вызов `hmac_int(i)` использует 4 символа hex из 128-символного выхода SHA-512. Карты одного раунда полностью определены одним вызовом HMAC, поэтому PF-игры в blackjack часто показывают 13+ целых чисел в десятичном преобразовании на панели проверки — по одному за замену карты. Для конкретной реализации на Stake и BC.Game см. [руководство по Provably Fair blackjack](\u002Fblog\u002Fprovably-fair-blackjack).\n## Традиционный ГСЧ vs Provably Fair ГСЧ\n\nНа уровне ГСЧ конкретно (а не всего стека справедливости), PF — это строгий надмножество сертифицированного CSPRNG.\n\n### Где традиционные ГСЧ отстают\n\nСертифицированные ГСЧ от eCOGRA, iTech Labs и GLI все криптографически безопасны — математика такая же сильная, как у PF. Проблема не в примитиве, а в **модели доверия во время выполнения**:\n\n- Сертифицированный ГСЧ находится на сервере казино, проверяется один раз\n- Ты никогда не видишь его выход напрямую, только конечное состояние игры\n- Ничего не заставляет казино продолжать запускать сертифицированный код в боевой среде\n- Спор по конкретному раунду невозможно разрешить в реальном времени\n\nЕсли сертифицированный слот-движок Pragmatic Play тихо запускает другой ГСЧ в боевой среде Roobet, чем тот, что тестировала eCOGRA, никакая проверка сертификата это не поймает. Зазор закрывается только с открытой проверкой каждый раунд.\n\n### Что PF добавляет к примитиву\n\nProvably Fair берет ту же криптографическую основу и открывает её. Конкретно:\n\n- Хэш серверного сида публикуется *до* твоей ставки (обязательство)\n- Твой клиентский сид участвует в входе HMAC (совместное подписание)\n- Исходный серверный сид раскрывается после раунда (раскрытие)\n- Вычисление детерминировано и воспроизводимо в любом браузере (проверка)\n\nВот вся разница. Один и тот же HMAC, один и тот же CSPRNG — с четырьмя дополнительными слоями прозрачности сверху. Для более глубокого разбора того, как оба подхода соотносятся, см. [provably fair vs RNG certified](\u002Fblog\u002Fprovably-fair-vs-rng-certified).\n\n## Блокчейн-случайность — Chainlink VRF и игры в сети\n\nProvably Fair ГСЧ хорошо работает для централизованных крипто-казино. Но что насчет полностью децентрализованных приложений — лотерей в сети, назначения характеристик NFT, кубиков в сети? Здесь вступает в силу другое решение.\n\n### Почему блокчейны не могут генерировать безопасные случайные числа\n\nКаждый блокчейн детерминирован по замыслу — каждый валидатор должен получить одно и то же состояние из одних и тех же входов, иначе консенсус нарушается. Это делает случайность структурно сложной:\n\n- `block.timestamp` контролируется майнером в пределах нескольких секунд\n- `block.blockhash` может быть манипулирован майнерами, удерживающими блоки\n- `block.prevrandao` (после слияния Ethereum) лучше, но всё ещё может быть смещен валидаторами\n- Любой источник энтропии в сети может быть прочитан контрактом *до* того, как его использовать, что лишает смысла\n\nНаивные лотереи dApp, использовавшие blockhash, были в прошлом дренированы. Экономический стимул манипулировать джекпотом в $1M может заставить майнера рационально удерживать блок.\n\n### Как Chainlink VRF это решает\n\n**Chainlink VRF** (Verifiable Random Function) генерирует случайность вне сети и доставляет её в сеть с криптографическим доказательством. Процесс:\n\n1. Смарт-контракт запрашивает случайное число\n2. Оракул Chainlink генерирует значение вне сети, используя свой приватный ключ + сид запроса\n3. Доказательство — это [BLS-подпись](https:\u002F\u002Fdocs.chain.link\u002Fvrf), которую любой может проверить против публичного ключа оракула\n4. И значение, и доказательство публикуются обратно в сеть в одной транзакции\n5. Контракт проверяет доказательство перед использованием значения\n\nКритическое свойство: потому что доказательство связывает случайное значение с приватным ключом оракула и сидом запроса, оракул не может выбирать удобные значения. Любое отклонение математически обнаруживаемо.\n\n### Когда использовать VRF vs HMAC-базированный PF\n\n| Вариант использования | Лучший выбор | Почему |\n|---|---|---|\n| Централизованные кубики\u002Fкраш | HMAC-базированный PF | Проще, дешевле, такие же гарантии |\n| Лотерея в сети | Chainlink VRF | Без доверия, без центрального оператора |\n| Назначение характеристик NFT | Chainlink VRF | Неманипулируемая редкость |\n| Централизованный блэкджек | HMAC-базированный PF | Chainlink VRF слишком дорого за карту |\n| DeFi-игра с большим джекпотом | Chainlink VRF | Риск манипуляции майнером слишком высок |\n\nБольшинство крипто-казино в 2026 году всё ещё используют HMAC-базированный PF, потому что он быстр, дешев и уже хорошо понят. VRF — это то место, где сияют децентрализованные игры DeFi, NFT и полностью децентрализованные игры. Наш рейтинг [provably fair Bitcoin games](\u002Fblog\u002Fprovably-fair-bitcoin-games) специально фильтрует по тому, какую реализацию PF использует каждое казино.\nЕсли хочешь стресс-тестить эти концепции на живом казино, в [каталоге provably fair](\u002Fcasino\u002Fprovably-fair) перечислены реализации, которые можно проверить без депозита — большинство публикуют хэши server seed на открытом эндпоинте.\n\n## Уязвимости RNG в Provably Fair\n\nКриптографически идеальный PF RNG всё равно может сломаться при плохой реализации. Вот что переживает проверку математики.\n\n### Атака на смещённый пул сидов\n\nСамая реалистичная атака — и одна из причин, почему ротация клиентского сида имеет значение.\n\nНечестное казино заранее генерирует тысячи кандидатов на серверные сиды. Для каждого оно вычисляет исходы против распространённых паттернов клиентского сида (форматы браузера по умолчанию, частые слова). Оно развёртывает только те сиды, которые случайно дают больше проигрышей, чем побед против предсказуемых клиентских сидов.\n\nКаждый развёрнутый сид по-прежнему хеширует корректно до своего предварительно обязательного хэша. Математика commit-reveal проходит проверку. Но пул доступных сидов был отобран вишнёвым сбором до того, как любой игрок их увидел, и долгосрочное преимущество казино незаметно превышает заявленный RTP.\n\n#### Почему ротация это блокирует\n\nАтаки на смещённые сиды требуют, чтобы казино знало твой будущий клиентский сид *до* фиксации серверного сида. Ротируй свой клиентский сид каждые 50–100 ставок и предварительные вычисления казино становятся бесполезными — оно зафиксировало серверный сид до того, как узнало новый клиентский сид, поэтому не может направлять исходы.\n\nПоэтому легитимные казино дают тебе ротировать мгновенно. PF казино, которое отказывается от ротации клиентского сида (или автоматически переделывает клиентский сид по собственному расписанию, а не твоему) — сигнализирует, что уязвимость открыта. Гайд [клиентский сид vs серверный сид](\u002Fblog\u002Fclient-seed-vs-server-seed) охватывает весь workflow ротации.\n\n### Слабые источники энтропии\n\nЕсли генерация серверного сида использует предсказуемую энтропию, протокол commit-reveal по-прежнему запускается, но атакующий может предсказать сиды.\n\n#### Ловушка Math.random\n\nJavaScript `Math.random()` — это вариант линейного конгруэнтного генератора. После наблюдения ~700 последовательных выходов атакующий может реконструировать полное внутреннее состояние и предсказать каждый последующий выход. Если PF казино использует Math.random для генерации серверного сида:\n\n1. Атакующий играет 700+ раундов, собирая каждый раскрытый серверный сид\n2. Атакующий реконструирует состояние PRNG\n3. Атакующий предсказывает следующий хэшированный серверный сид *до* его фиксации\n4. Атакующий ставит с полным знанием исхода\n\nЗащита: казино должны использовать `crypto.randomBytes(32)` (Node.js), `crypto.getRandomValues(new Uint8Array(32))` (браузер) или аппаратный RNG. Разница — одна строка кода, но разрыв в безопасности полный.\n\n### Красные флаги реализации\n\nКороткий чеклист сигналов, что PF RNG небезопасен:\n\n- Нет кнопки ротации клиентского сида или ротация занимает >5 секунд\n- Клиентский сид автоматически переделывается казино по их расписанию\n- История серверного сида не показывает алгоритм или ширину слайса\n- Инструмент верификации работает только на собственном сайте казино (не локально)\n- Опубликованный алгоритм хеширования не указан — \"SHA-256 где-то\" недостаточно; нужна точная формула\n- Раскрытые серверные сиды не совпадают с их предварительно зафиксированными хэшами ни в одном раунде\n\nЛюбой из этих флагов говорит, что заявление о PF — это маркетинговый лак поверх обычного RNG. Для сравнения сторон по сторонам, какие казино действительно публикуют свой PF код, см. рейтинг [provably fair Bitcoin игр](\u002Fblog\u002Fprovably-fair-bitcoin-games).\n\n## Попробуй сам — интерактивный верификатор\n\nМатематика перестаёт быть абстрактной в момент, когда ты запускаешь её на своих сидах. Вставь любые четыре значения из панели справедливости твоего казино в верификатор ниже — всё выполняется в твоём браузере через Web Crypto API, никакие данные не отправляются на наш сервер.\n\n::inline-provably-fair-verifier\n::\n\nПрактический совет: если под рукой нет реальной ставки в PF казино, попробуй эти одноразовые тестовые значения, чтобы увидеть проверенный раунд:\n\n- Хэш серверного сида: `bf3c0a9b0f4b3c8e8f4f0c5f0c4e8b7d8f3e2a1c9f6e3b7c4d5a8e2f9b1c6d3a` (пример только — не совпадёт с реальными хэшами)\n- Серверный сид: `f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4`\n- Клиентский сид: `demo-player`\n- Nonce: `1`\n\nРезультат показывает вердикт PASS \u002F FAIL на совпадение хэша плюс реконструированные исходы дайса и краша. Та же логика работает за [Aviator provably fair калькулятором](\u002Fblog\u002Fprovably-fair-aviator-calculator) для crash-игры Spribe, и наш полный верификатор на [provably fair хабе](\u002Fcasino\u002Fprovably-fair) покрывает каждое мейнстримное PF казино. Для подбора размера ставок при известном RTP после подтверждения, что RNG легитимен, сочетай с нашим [RTP калькулятором](\u002Fcasino\u002Frtp-calculator), [калькулятором преимущества казино](\u002Fcasino\u002Fhouse-edge-calculator) и [калькулятором банкролла](\u002Fcasino\u002Fbankroll-calculator).\n\n**Суть:** математика пуленепробиваема только если казино реально публикует хэш до ставки. Перепроверяй каждую реализацию через [хаб provably fair](\u002Fcasino\u002Fprovably-fair) — мы отмечаем, правильно ли площадка фиксирует seed и где выставлен хэш.\n\n## FAQ",[28,31,34,37,40,43,46,49,52,55,58,61,64,67,70],{"answer":29,"question":30},"Provably Fair RNG берёт три входа — серверный сид казино (скрыт за хэшем SHA-256), твой клиентский сид и nonce — и подаёт их в HMAC-SHA256. Шестнадцатеричный результат затем преобразуется в бросок костей, множитель краша или карту. Так как хэш серверного сида публикуется до твоей ставки, казино не может его изменить потом, и весь расчёт детерминирован: любой, у кого есть эти три входа, может воспроизвести точный результат в браузере.","Как на самом деле работает provably fair генерация случайных чисел?",{"answer":32,"question":33},"Псевдокод: `hex = HMAC_SHA256(server_seed, client_seed + ':' + nonce); dice = (parseInt(hex.slice(0,10), 16) % 1_000_000) \u002F 10_000;`. Вызов HMAC использует серверный сид как ключ и строку (клиентский сид + nonce) как сообщение. Берёшь первые 10 символов hex, преобразуешь в десятичное, берёшь модуль 1 000 000, делишь на 10 000 — получаешь бросок костей от 0 до 99,9999. Разные игры (краш, карты) изменяют только преобразование результата, никогда не трогая сам HMAC.","Как генерировать случайное число — псевдокод для provably fair?",{"answer":35,"question":36},"Нет — не без серверного сида, который остаётся скрыт до ротации. HMAC-SHA256 — это односторонняя функция: даже зная выход и сообщение, ты не сможешь восстановить ключ за реальное время. Единственный способ предсказать исходы — если казино слило активный серверный сид до конца раунда, что сразу обнаружится, потому что раскрытый сид не совпадёт с опубликованным хэшем. В 2026 году не известны практические атаки на SHA-256, которые это изменили бы.","Можно ли предсказать provably fair?",{"answer":38,"question":39},"Сам алгоритм невозможно взломать — SHA-256 и HMAC-SHA256 не имеют практических атак на поиск прообраза или восстановление ключа. Реальные поверхности атак — это ошибки реализации: казино, использующее слабую энтропию (типа JavaScript's Math.random) для генерации серверного сида, казино, отказывающееся ротировать сиды, или смещённые пулы сидов, где казино предвычисляет проигрышные исходы для популярных клиентских сидов. Ничего из этого не ломает математику — ломается только настройка вокруг неё. Ротируй свой клиентский сид каждые 50-100 ставок и ты победишь все известные атаки.","Как взломать алгоритм provably fair?",{"answer":41,"question":42},"HMAC-SHA256 технически не является CSPRNG сам по себе, но ведёт себя как один, когда его использует криптографически случайный серверный сид. Результат неотличим от случайного для тех, кто не знает ключ, что ровно то свойство, которое требует provably fair гемблинг. NIST SP 800-90A Rev 1 определяет HMAC_DRBG (детерминированный генератор случайных битов на основе HMAC), который многие PF казино реализуют как основу своего генератора чисел.","Является ли HMAC-SHA256 на самом деле CSPRNG?",{"answer":44,"question":45},"Не нужен Excel для этого — используй JavaScript в консоли браузера. Запусти цикл: `for (let i=0; i\u003C10000; i++) console.log(await pfDice(serverSeed, clientSeed, i))` с тем же HMAC-SHA256 + преобразованием костей, что использует казино. Построй гистограмму — она должна быть равномерно распределена по 0-99,99 без видимых смещений. Excel's `RAND()` не криптографичен и не совпадёт с выходом PF казино; используй его только для проверки формы распределения, не точных значений.","Как генерировать 10 000 случайных чисел в Excel для тестирования PF казино?",{"answer":47,"question":48},"HMAC — это хэширующая функция с ключом — она позволяет серверному сиду выступать как секретный 'ключ', который необходимо знать, чтобы воспроизвести выход. Обычный SHA-256 не имеет этого свойства ключа: SHA-256(server_seed + client_seed + nonce) всё ещё работал бы детерминированно, но он уязвим для атак расширения длины, где злоумышленник мог бы вычислить новый хэш с более длинным сообщением без знания ключа. HMAC оборачивает SHA-256 в конструкцию, которая устраняет расширение длины, поэтому каждое современное PF казино использует HMAC.","Почему использовать HMAC вместо обычного SHA-256?",{"answer":50,"question":51},"Не из коробки. Блокчейны детерминированы — каждый валидатор должен выдать один результат из одних и тех же входов, поэтому нет встроенного источника энтропии. Если dApp пытался использовать хэш блока, временную метку или prevrandao как случайность, майнеры могли бы их манипулировать. Решение — произвольная случайность, доставляемая оракулом, типа Chainlink VRF, который генерирует число офф-чейне с верифицируемым криптографическим доказательством и постит оба на цепь. Для ончейн NFT дропов, лотерей и некоторых крипто казино VRF в основном заменил наивные схемы с хэшем блока.","Может ли блокчейн генерировать provably fair случайные числа?",{"answer":53,"question":54},"PRNG (генератор псевдослучайных чисел) детерминирован, но не защищён — предсказуем при достаточном объёме выходов (типа Math.random). CSPRNG (криптографически защищённый PRNG) детерминирован *и* непредсказуем даже при знании предыдущих выходов, используя криптографические примитивы типа HMAC-DRBG, AES-CTR или ChaCha20. PF RNG — это CSPRNG, обёрнутый в протокол коммит-раскрытия: казино публикует хэш сида до твоей ставки, так что ты можешь после раунда проверить, что казино не изменило сид. PF RNG = CSPRNG + прозрачность.","В чём разница между PRNG, CSPRNG и PF RNG?",{"answer":56,"question":57},"Редко. Большинство крупных студий слотов (Pragmatic Play, NetEnt, Play'n GO, Hacksaw) используют проприетарные CSPRNG, проверенные eCOGRA или iTech Labs — не provably fair. Механика слишком сложная (каскадные барабаны, триггеры бонусов, покупка фич) для чистого преобразования в один HMAC выход. Provably fair слоты существуют — BGaming, Spribe и Turbo выпускают некоторые титулы с PF — но они более простые. Для глубокого сравнения этих двух моделей доверия смотри provably fair vs RNG сертифицированное разбор.","Работает ли provably fair для автоматов?",{"answer":59,"question":60},"Stake-style PF костей берёт выход HMAC-SHA256, срезает первые 5 шестнадцатеричных символов (иногда 8-10), преобразует в десятичное, затем применяет модуль 1 000 000 и делит на 10 000, чтобы получить значение от 0 до 99,9999. Если результат выше 99,9999 (статистическая редкость), срез продвигается на следующий кусок шестнадцатеричной строки. Это сохраняет равномерное распределение без смещения от урезания hex. Инструменты верификации требуют точную ширину среза и делитель для каждого казино, поэтому иногда универсальный верификатор показывает немного другое число, чем UI казино.","Как работает преобразование PF костей?",{"answer":62,"question":63},"Краш использует другую формулу. Первые 8 шестнадцатеричных символов выхода HMAC преобразуются в целое число `h`. Если `h` делится на специфичный фактор преимущества дома (33 на Stake), множитель краша — 1,00 (мгновенный крах). Иначе множитель — `floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100`. Это производит распределение, смещённое в сторону низких множителей (большинство раундов падают до 2x), но с длинным правым хвостом, награждающим терпеливые ставки. RTP ~99%, если фактор преимущества дома — 1%.","Как работает преобразование PF краша?",{"answer":65,"question":66},"Весь протокол рушится. Math.random в JavaScript инициализируется системными часами и производит предсказуемый выход — игрок, который знает приблизительное серверное время, может предвычислить все будущие серверные сиды и выиграть каждую ставку. Любое PF казино, использующее некриптографическую энтропию (Math.random, сиды на основе времени, предсказуемые счётчики) — это эффективно неаудированное, даже если показывает хэши сидов. Авторитетные казино используют crypto.randomBytes (Node.js) или crypto.getRandomValues (браузеры), поддерживаемые пулами энтропии ОС.","Что происходит, если казино использует Math.random для своего серверного сида?",{"answer":68,"question":69},"Для проверки хэша — да, SHA-256 универсален. Для результата игры — частично. Большинство PF костей используют одну и ту же HMAC-SHA256 + первые-5-hex-символов формулу, поэтому универсальный верификатор костей правильно воспроизводит Stake, Primedice, Rainbet и большинство Originals. Преобразования краша и блэкджека различаются по казино, и некоторые используют HMAC-SHA512 вместо SHA-256 для карточных игр. Когда хэш совпадает, но число результата отличается, переключись на официальный верификатор казино или проверь документацию честности.","Могу ли я использовать один верификатор для всех provably fair казино?",{"answer":71,"question":72},"На обозримое будущее — да. SHA-256 потребовал бы примерно 2^128 квантовых операций для взлома алгоритмом Гровера — всё ещё вычислительно невозможно. HMAC-SHA256 добавляет ещё один слой сверху. Усилие NIST по стандартизации постквантовой криптографии не нацелено на SHA-256 или HMAC, потому что они остаются защищёнными даже против крупномасштабных квантовых компьютеров. Криптография с открытым ключом (RSA, ECDSA) — вот что уязвимо для квантовых атак, не симметричные хэши. Provably fair RNG останется безопасным в 2030-е годы и далее, если не произойдёт теоретический прорыв.","Безопасна ли provably fair RNG в долгосрочной перспективе против квантовых компьютеров?",[74,75,76,77],"ru","de","tr","en",{"data":79,"body":80},{},{"type":81,"children":82},"root",[83,92,115,120,133,139,144,286,291,561,597,604,669,675,694,717,731,737,749,755,766,778,783,798,804,809,852,873,879,898,1032,1059,1065,1070,1076,1081,1292,1297,1309,1321,1334,1338,1344,1349,1357,1387,1395,1404,1412,1429,1437,1446,1454,1459,1467,1487,1499,1505,1510,1737,1749,1755,1760,1766,1771,2273,2285,2290,2294,2300,2305,2828,2848,2853,2859,2864,2873,2893,2899,2904,2910,2921,2944,2949,2955,2960,2990,3001,3007,3012,3018,3023,3070,3075,3081,3091,3129,3134,3140,3253,3274,3280,3285,3291,3296,3301,3306,3313,3324,3337,3343,3348,3354,3366,3395,3416,3422,3427,3460,3471,3477,3482,3486,3491,3539,3582,3599],{"type":84,"tag":85,"props":86,"children":88},"element","h2",{"id":87},"provably-fair-генерирование-случайных-чисел-объяснено-2026",[89],{"type":90,"value":91},"text","Provably Fair — Генерирование случайных чисел объяснено (2026)",{"type":84,"tag":93,"props":94,"children":95},"p",{},[96,98,105,107,113],{"type":90,"value":97},"Ты только что поставил 0.5 BTC на крипто-дайс игру. На экране выпало ",{"type":84,"tag":99,"props":100,"children":102},"code",{"className":101},[],[103],{"type":90,"value":104},"37.42",{"type":90,"value":106}," и ты проиграл. Ты открываешь панель честности и видишь хэш серверного сида, твой клиентский сид и nonce — четыре значения, которые якобы доказывают, что ничего не было сфальсифицировано. Но как эти четыре значения ",{"type":84,"tag":108,"props":109,"children":110},"em",{},[111],{"type":90,"value":112},"стали",{"type":90,"value":114}," 37.42? Что именно превратило случайные символы в конкретный результат дайса?",{"type":84,"tag":93,"props":116,"children":117},{},[118],{"type":90,"value":119},"Вот в чём суть: всё обещание Provably Fair зависит от одного конкретного действия — преобразования криптографического хэша в результат игры. Если не разобраться в этом преобразовании, Provably Fair кажется магическим маркетингом. Если разобраться, ты сможешь проверить любое PF казино примерно за 60 секунд, заметить поддельные реализации с первого взгляда и точно знать, какие атаки протокол может отразить, а какие нет.",{"type":84,"tag":93,"props":121,"children":122},{},[123,125,131],{"type":90,"value":124},"Это руководство проведёт тебя через ",{"type":84,"tag":126,"props":127,"children":128},"strong",{},[129],{"type":90,"value":130},"генерирование случайных чисел в Provably Fair",{"type":90,"value":132}," так, как разработчик строил бы это в 2026 году — CSPRNG примитивы под капотом, формула HMAC-SHA256, которая превращает сиды в числа, разные схемы маппинга для дайса, крэша и карт, и поверхность атак, которая остаётся даже когда математика идеальна. В конце ты узнаешь, почему PF RNG криптографически невозможно сломать, какие баги реализации всё ещё их портят, и когда вместо них используется блокчейн-случайность (Chainlink VRF).",{"type":84,"tag":85,"props":134,"children":136},{"id":135},"кратко-как-pf-rng-на-самом-деле-генерируют-числа",[137],{"type":90,"value":138},"Кратко — Как PF RNG на самом деле генерируют числа",{"type":84,"tag":93,"props":140,"children":141},{},[142],{"type":90,"value":143},"Каждая Provably Fair игра использует одинаковый основной RNG примитив, отличается только маппинг выходных данных. Вот версия на 60 секунд.",{"type":84,"tag":145,"props":146,"children":147},"table",{},[148,171],{"type":84,"tag":149,"props":150,"children":151},"thead",{},[152],{"type":84,"tag":76,"props":153,"children":154},{},[155,161,166],{"type":84,"tag":156,"props":157,"children":158},"th",{},[159],{"type":90,"value":160},"Шаг",{"type":84,"tag":156,"props":162,"children":163},{},[164],{"type":90,"value":165},"Что происходит",{"type":84,"tag":156,"props":167,"children":168},{},[169],{"type":90,"value":170},"Кто это контролирует",{"type":84,"tag":172,"props":173,"children":174},"tbody",{},[175,194,211,229,251,268],{"type":84,"tag":76,"props":176,"children":177},{},[178,184,189],{"type":84,"tag":179,"props":180,"children":181},"td",{},[182],{"type":90,"value":183},"1. Генерируем серверный сид",{"type":84,"tag":179,"props":185,"children":186},{},[187],{"type":90,"value":188},"CSPRNG казино выдаёт случайную строку из 32–64 байт",{"type":84,"tag":179,"props":190,"children":191},{},[192],{"type":90,"value":193},"Казино",{"type":84,"tag":76,"props":195,"children":196},{},[197,202,207],{"type":84,"tag":179,"props":198,"children":199},{},[200],{"type":90,"value":201},"2. Хэшируем и публикуем",{"type":84,"tag":179,"props":203,"children":204},{},[205],{"type":90,"value":206},"SHA-256(server_seed) показывается тебе до раунда",{"type":84,"tag":179,"props":208,"children":209},{},[210],{"type":90,"value":193},{"type":84,"tag":76,"props":212,"children":213},{},[214,219,224],{"type":84,"tag":179,"props":215,"children":216},{},[217],{"type":90,"value":218},"3. Собираем клиентский сид + nonce",{"type":84,"tag":179,"props":220,"children":221},{},[222],{"type":90,"value":223},"Твой браузер добавляет клиентский сид; nonce — счётчик раунда",{"type":84,"tag":179,"props":225,"children":226},{},[227],{"type":90,"value":228},"Ты + протокол",{"type":84,"tag":76,"props":230,"children":231},{},[232,237,246],{"type":84,"tag":179,"props":233,"children":234},{},[235],{"type":90,"value":236},"4. Вычисляем HMAC",{"type":84,"tag":179,"props":238,"children":239},{},[240],{"type":84,"tag":99,"props":241,"children":243},{"className":242},[],[244],{"type":90,"value":245},"hex = HMAC-SHA256(server_seed, client_seed : nonce)",{"type":84,"tag":179,"props":247,"children":248},{},[249],{"type":90,"value":250},"Детерминировано",{"type":84,"tag":76,"props":252,"children":253},{},[254,259,264],{"type":84,"tag":179,"props":255,"children":256},{},[257],{"type":90,"value":258},"5. Маппируем hex в результат",{"type":84,"tag":179,"props":260,"children":261},{},[262],{"type":90,"value":263},"Срез + модуль + деление = рол дайса, множитель крэша или карта",{"type":84,"tag":179,"props":265,"children":266},{},[267],{"type":90,"value":250},{"type":84,"tag":76,"props":269,"children":270},{},[271,276,281],{"type":84,"tag":179,"props":272,"children":273},{},[274],{"type":90,"value":275},"6. Раскрываем и проверяем",{"type":84,"tag":179,"props":277,"children":278},{},[279],{"type":90,"value":280},"После ротации сырой сид раскрывается; кто угодно может повторить шаг 4",{"type":84,"tag":179,"props":282,"children":283},{},[284],{"type":90,"value":285},"Ты",{"type":84,"tag":93,"props":287,"children":288},{},[289],{"type":90,"value":290},"Математика:",{"type":84,"tag":93,"props":292,"children":293},{},[294],{"type":84,"tag":295,"props":296,"children":299},"span",{"className":297},[298],"katex",[300,399],{"type":84,"tag":295,"props":301,"children":304},{"className":302},[303],"katex-mathml",[305],{"type":84,"tag":306,"props":307,"children":309},"math",{"xmlns":308},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[310],{"type":84,"tag":311,"props":312,"children":313},"semantics",{},[314,392],{"type":84,"tag":315,"props":316,"children":317},"mrow",{},[318,324,330,336,344,349,353,358,363,368,373,378,383,388],{"type":84,"tag":319,"props":320,"children":321},"mtext",{},[322],{"type":90,"value":323},"outcome",{"type":84,"tag":325,"props":326,"children":327},"mo",{},[328],{"type":90,"value":329},"=",{"type":84,"tag":331,"props":332,"children":333},"mi",{},[334],{"type":90,"value":335},"f",{"type":84,"tag":325,"props":337,"children":341},{"fence":338,"stretchy":339,"minsize":340,"maxsize":340},"false","true","1.2em",[342],{"type":90,"value":343},"(",{"type":84,"tag":319,"props":345,"children":346},{},[347],{"type":90,"value":348},"HMAC-SHA256",{"type":84,"tag":325,"props":350,"children":351},{"stretchy":338},[352],{"type":90,"value":343},{"type":84,"tag":319,"props":354,"children":355},{},[356],{"type":90,"value":357},"server_seed",{"type":84,"tag":325,"props":359,"children":360},{"separator":339},[361],{"type":90,"value":362},",",{"type":84,"tag":319,"props":364,"children":365},{},[366],{"type":90,"value":367},"  ",{"type":84,"tag":319,"props":369,"children":370},{},[371],{"type":90,"value":372},"client_seed",{"type":84,"tag":325,"props":374,"children":375},{},[376],{"type":90,"value":377},":",{"type":84,"tag":319,"props":379,"children":380},{},[381],{"type":90,"value":382},"nonce",{"type":84,"tag":325,"props":384,"children":385},{"stretchy":338},[386],{"type":90,"value":387},")",{"type":84,"tag":325,"props":389,"children":390},{"fence":338,"stretchy":339,"minsize":340,"maxsize":340},[391],{"type":90,"value":387},{"type":84,"tag":393,"props":394,"children":396},"annotation",{"encoding":395},"application\u002Fx-tex",[397],{"type":90,"value":398},"\\text{outcome} = f\\big(\\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} : \\text{nonce})\\big)",{"type":84,"tag":295,"props":400,"children":403},{"className":401,"ariaHidden":339},[402],"katex-html",[404,441,529],{"type":84,"tag":295,"props":405,"children":408},{"className":406},[407],"base",[409,415,425,431,437],{"type":84,"tag":295,"props":410,"children":414},{"className":411,"style":413},[412],"strut","height:0.6151em;",[],{"type":84,"tag":295,"props":416,"children":419},{"className":417},[418,90],"mord",[420],{"type":84,"tag":295,"props":421,"children":423},{"className":422},[418],[424],{"type":90,"value":323},{"type":84,"tag":295,"props":426,"children":430},{"className":427,"style":429},[428],"mspace","margin-right:0.2778em;",[],{"type":84,"tag":295,"props":432,"children":435},{"className":433},[434],"mrel",[436],{"type":90,"value":329},{"type":84,"tag":295,"props":438,"children":440},{"className":439,"style":429},[428],[],{"type":84,"tag":295,"props":442,"children":444},{"className":443},[407],[445,450,457,468,477,483,492,498,502,507,516,520,525],{"type":84,"tag":295,"props":446,"children":449},{"className":447,"style":448},[412],"height:1.2em;vertical-align:-0.35em;",[],{"type":84,"tag":295,"props":451,"children":455},{"className":452,"style":454},[418,453],"mathnormal","margin-right:0.1076em;",[456],{"type":90,"value":335},{"type":84,"tag":295,"props":458,"children":460},{"className":459},[418],[461],{"type":84,"tag":295,"props":462,"children":466},{"className":463},[464,465],"delimsizing","size1",[467],{"type":90,"value":343},{"type":84,"tag":295,"props":469,"children":471},{"className":470},[418,90],[472],{"type":84,"tag":295,"props":473,"children":475},{"className":474},[418],[476],{"type":90,"value":348},{"type":84,"tag":295,"props":478,"children":481},{"className":479},[480],"mopen",[482],{"type":90,"value":343},{"type":84,"tag":295,"props":484,"children":486},{"className":485},[418,90],[487],{"type":84,"tag":295,"props":488,"children":490},{"className":489},[418],[491],{"type":90,"value":357},{"type":84,"tag":295,"props":493,"children":496},{"className":494},[495],"mpunct",[497],{"type":90,"value":362},{"type":84,"tag":295,"props":499,"children":501},{"className":500,"style":429},[428],[],{"type":84,"tag":295,"props":503,"children":506},{"className":504,"style":505},[428],"margin-right:0.1667em;",[],{"type":84,"tag":295,"props":508,"children":510},{"className":509},[418,90],[511],{"type":84,"tag":295,"props":512,"children":514},{"className":513},[418],[515],{"type":90,"value":372},{"type":84,"tag":295,"props":517,"children":519},{"className":518,"style":429},[428],[],{"type":84,"tag":295,"props":521,"children":523},{"className":522},[434],[524],{"type":90,"value":377},{"type":84,"tag":295,"props":526,"children":528},{"className":527,"style":429},[428],[],{"type":84,"tag":295,"props":530,"children":532},{"className":531},[407],[533,537,546,552],{"type":84,"tag":295,"props":534,"children":536},{"className":535,"style":448},[412],[],{"type":84,"tag":295,"props":538,"children":540},{"className":539},[418,90],[541],{"type":84,"tag":295,"props":542,"children":544},{"className":543},[418],[545],{"type":90,"value":382},{"type":84,"tag":295,"props":547,"children":550},{"className":548},[549],"mclose",[551],{"type":90,"value":387},{"type":84,"tag":295,"props":553,"children":555},{"className":554},[418],[556],{"type":84,"tag":295,"props":557,"children":559},{"className":558},[464,465],[560],{"type":90,"value":387},{"type":84,"tag":93,"props":562,"children":563},{},[564,566,571,573,579,581,587,589,595],{"type":90,"value":565},"Где ",{"type":84,"tag":99,"props":567,"children":569},{"className":568},[],[570],{"type":90,"value":335},{"type":90,"value":572}," — функция маппинга, специфичная для игры — ",{"type":84,"tag":99,"props":574,"children":576},{"className":575},[],[577],{"type":90,"value":578},"f_dice",{"type":90,"value":580}," возвращает 0-99.99, ",{"type":84,"tag":99,"props":582,"children":584},{"className":583},[],[585],{"type":90,"value":586},"f_crash",{"type":90,"value":588}," возвращает множитель, ",{"type":84,"tag":99,"props":590,"children":592},{"className":591},[],[593],{"type":90,"value":594},"f_cards",{"type":90,"value":596}," возвращает позиции перетасованной колоды. Часть HMAC идентична во всех PF казино мира.",{"type":84,"tag":598,"props":599,"children":601},"h3",{"id":600},"ключевые-цифры-которые-нужно-знать",[602],{"type":90,"value":603},"Ключевые цифры, которые нужно знать",{"type":84,"tag":605,"props":606,"children":607},"ul",{},[608,619,629,639,649,659],{"type":84,"tag":609,"props":610,"children":611},"li",{},[612,617],{"type":84,"tag":126,"props":613,"children":614},{},[615],{"type":90,"value":616},"3 входа",{"type":90,"value":618},": серверный сид + клиентский сид + nonce создают каждый результат",{"type":84,"tag":609,"props":620,"children":621},{},[622,627],{"type":84,"tag":126,"props":623,"children":624},{},[625],{"type":90,"value":626},"64 hex-символа",{"type":90,"value":628},": длина SHA-256 \u002F HMAC-SHA256 выхода",{"type":84,"tag":609,"props":630,"children":631},{},[632,637],{"type":84,"tag":126,"props":633,"children":634},{},[635],{"type":90,"value":636},"128 hex-символов",{"type":90,"value":638},": длина HMAC-SHA512 (используется BC.Game и PF блэкджек)",{"type":84,"tag":609,"props":640,"children":641},{},[642,647],{"type":84,"tag":126,"props":643,"children":644},{},[645],{"type":90,"value":646},"~2^256 операций",{"type":90,"value":648},": что потребуется, чтобы сломать HMAC-SHA256 — астрономически невозможно",{"type":84,"tag":609,"props":650,"children":651},{},[652,657],{"type":84,"tag":126,"props":653,"children":654},{},[655],{"type":90,"value":656},"0.00–99.99",{"type":90,"value":658},": стандартный диапазон дайса после маппинга",{"type":84,"tag":609,"props":660,"children":661},{},[662,667],{"type":84,"tag":126,"props":663,"children":664},{},[665],{"type":90,"value":666},"1.00x до ∞",{"type":90,"value":668},": стандартный диапазон множителя крэша (ограничен на практике точностью float)",{"type":84,"tag":598,"props":670,"children":672},{"id":671},"честность-прибыль",[673],{"type":90,"value":674},"Честность ≠ Прибыль",{"type":84,"tag":93,"props":676,"children":677},{},[678,680,685,687,692],{"type":90,"value":679},"То, что RNG Provably Fair, говорит тебе, что казино не могло манипулировать результатом ",{"type":84,"tag":108,"props":681,"children":682},{},[683],{"type":90,"value":684},"после",{"type":90,"value":686}," твоей ставки. Это ",{"type":84,"tag":126,"props":688,"children":689},{},[690],{"type":90,"value":691},"не",{"type":90,"value":693}," говорит:",{"type":84,"tag":605,"props":695,"children":696},{},[697,702,707,712],{"type":84,"tag":609,"props":698,"children":699},{},[700],{"type":90,"value":701},"Разумна ли маржа казино (проверь RTP отдельно)",{"type":84,"tag":609,"props":703,"children":704},{},[705],{"type":90,"value":706},"Будет ли казино честить выводы",{"type":84,"tag":609,"props":708,"children":709},{},[710],{"type":90,"value":711},"Честны ли бонусы и условия отыгрыша",{"type":84,"tag":609,"props":713,"children":714},{},[715],{"type":90,"value":716},"Был ли пул серверных сидов беспристрастным до коммита",{"type":84,"tag":93,"props":718,"children":719},{},[720,722,729],{"type":90,"value":721},"Полную поверхность атак мы разберём ниже. Для более широкого сравнения с традиционной сертификацией см. наш гайд ",{"type":84,"tag":723,"props":724,"children":726},"a",{"href":725},"\u002Fblog\u002Fprovably-fair-vs-rng-certified",[727],{"type":90,"value":728},"Provably Fair vs RNG-сертифицировано",{"type":90,"value":730},".",{"type":84,"tag":85,"props":732,"children":734},{"id":733},"что-делает-rng-provably-fair",[735],{"type":90,"value":736},"Что делает RNG \"Provably Fair\"",{"type":84,"tag":93,"props":738,"children":739},{},[740,742,747],{"type":90,"value":741},"Перед тем как перейти к формуле, помогает разделить ",{"type":84,"tag":108,"props":743,"children":744},{},[745],{"type":90,"value":746},"Provably Fair",{"type":90,"value":748}," от более широкого мира RNG. PF — это конкретное улучшение для CSPRNG, не замена.",{"type":84,"tag":598,"props":750,"children":752},{"id":751},"примитив-commit-reveal",[753],{"type":90,"value":754},"Примитив Commit-Reveal",{"type":84,"tag":93,"props":756,"children":757},{},[758,760,765],{"type":90,"value":759},"Весь трюк Provably Fair — это криптографический паттерн, называемый ",{"type":84,"tag":126,"props":761,"children":762},{},[763],{"type":90,"value":764},"commit-reveal",{"type":90,"value":730},{"type":84,"tag":93,"props":767,"children":768},{},[769,771,776],{"type":90,"value":770},"Перед началом раунда казино коммитится к конкретному серверному сиду, публикуя его SHA-256 хэш. Хэш — это 64-символьный отпечаток пальца, уникально идентифицирующий сид без раскрытия его. Так как SHA-256 не имеет практических коллизионных атак, казино не может потом найти ",{"type":84,"tag":108,"props":772,"children":773},{},[774],{"type":90,"value":775},"другой",{"type":90,"value":777}," сид, который даст такой же хэш — они зафиксированы.",{"type":84,"tag":93,"props":779,"children":780},{},[781],{"type":90,"value":782},"После раунда (или после того, как ты ротируешь сиды), сырой серверный сид раскрывается. Ты хэшируешь его сам. Если твой хэш совпадает с тем, что было опубликовано до раунда, казино доказало, что они не меняли сиды посередине раунда. В сочетании с твоим клиентским сидом (который они не знали заранее), это делает манипуляцию результатом за раунд криптографически невозможной.",{"type":84,"tag":93,"props":784,"children":785},{},[786,788,796],{"type":90,"value":787},"Слой commit-reveal — это то, что отделяет PF от любого другого CSPRNG. Традиционное RNG-сертифицированное казино тоже использует CSPRNG — но ничто не помешает им поменять его в продакшене, как ",{"type":84,"tag":723,"props":789,"children":793},{"href":790,"rel":791},"https:\u002F\u002Fwww.itechlabs.com",[792],"nofollow",[794],{"type":90,"value":795},"iTech Labs аудиты доказывают только статистические свойства",{"type":90,"value":797},", не идентичность во время выполнения.",{"type":84,"tag":598,"props":799,"children":801},{"id":800},"hmac-как-примитив-rng",[802],{"type":90,"value":803},"HMAC как примитив RNG",{"type":84,"tag":93,"props":805,"children":806},{},[807],{"type":90,"value":808},"HMAC-SHA256 — это реальный генератор случайных чисел внутри каждого PF раунда. Вот почему он работает:",{"type":84,"tag":605,"props":810,"children":811},{},[812,822,832,842],{"type":84,"tag":609,"props":813,"children":814},{},[815,820],{"type":84,"tag":126,"props":816,"children":817},{},[818],{"type":90,"value":819},"Детерминированный",{"type":90,"value":821},": При одинаковых входах HMAC всегда выдаёт одинаковый выход. Это позволяет тебе проверить.",{"type":84,"tag":609,"props":823,"children":824},{},[825,830],{"type":84,"tag":126,"props":826,"children":827},{},[828],{"type":90,"value":829},"Односторонний",{"type":90,"value":831},": По выходу ты не можешь восстановить серверный сид (ключ). Это то, что держит результат непредсказуемым.",{"type":84,"tag":609,"props":833,"children":834},{},[835,840],{"type":84,"tag":126,"props":836,"children":837},{},[838],{"type":90,"value":839},"Равномерный",{"type":90,"value":841},": HMAC выходы неотличимы от случайных 256-битных строк. Это то, что держит игру беспристрастной.",{"type":84,"tag":609,"props":843,"children":844},{},[845,850],{"type":84,"tag":126,"props":846,"children":847},{},[848],{"type":90,"value":849},"С ключом",{"type":90,"value":851},": Серверный сид действует как секрет, который нужно знать, чтобы воспроизвести выход. Это то, что предотвращает манипуляцию.",{"type":84,"tag":93,"props":853,"children":854},{},[855,857,862,864,871],{"type":90,"value":856},"Технически HMAC-SHA256 не является CSPRNG сам по себе — это код аутентификации сообщения. Но когда ключ (серверный сид) генерируется из реального источника энтропии, конструкция эквивалентна CSPRNG для всех практических целей. NIST формализовал это как ",{"type":84,"tag":126,"props":858,"children":859},{},[860],{"type":90,"value":861},"HMAC_DRBG",{"type":90,"value":863}," в ",{"type":84,"tag":723,"props":865,"children":868},{"href":866,"rel":867},"https:\u002F\u002Fcsrc.nist.gov\u002Fpublications\u002Fdetail\u002Fsp\u002F800-90a\u002Frev-1\u002Ffinal",[792],[869],{"type":90,"value":870},"SP 800-90A Rev 1",{"type":90,"value":872},", и PF казино по сути переработают этот стандарт с добавлением публичного коммита сида.",{"type":84,"tag":598,"props":874,"children":876},{"id":875},"почему-csprng-важны-не-mathrandom",[877],{"type":90,"value":878},"Почему CSPRNG важны (не Math.random)",{"type":84,"tag":93,"props":880,"children":881},{},[882,884,888,890,896],{"type":90,"value":883},"Каждое легитимное PF казино генерирует серверный сид криптографически защищённым RNG — ",{"type":84,"tag":126,"props":885,"children":886},{},[887],{"type":90,"value":691},{"type":90,"value":889}," JavaScript ",{"type":84,"tag":99,"props":891,"children":893},{"className":892},[],[894],{"type":90,"value":895},"Math.random()",{"type":90,"value":897},". Разница важнее, чем кажется большинству игроков:",{"type":84,"tag":145,"props":899,"children":900},{},[901,922],{"type":84,"tag":149,"props":902,"children":903},{},[904],{"type":84,"tag":76,"props":905,"children":906},{},[907,912,917],{"type":84,"tag":156,"props":908,"children":909},{},[910],{"type":90,"value":911},"Генератор",{"type":84,"tag":156,"props":913,"children":914},{},[915],{"type":90,"value":916},"Предсказуем после видения выхода?",{"type":84,"tag":156,"props":918,"children":919},{},[920],{"type":90,"value":921},"Приемлем для PF?",{"type":84,"tag":172,"props":923,"children":924},{},[925,948,972,994,1016],{"type":84,"tag":76,"props":926,"children":927},{},[928,938,943],{"type":84,"tag":179,"props":929,"children":930},{},[931,936],{"type":84,"tag":99,"props":932,"children":934},{"className":933},[],[935],{"type":90,"value":895},{"type":90,"value":937}," (V8 в Chrome)",{"type":84,"tag":179,"props":939,"children":940},{},[941],{"type":90,"value":942},"Да, после ~700 выходов",{"type":84,"tag":179,"props":944,"children":945},{},[946],{"type":90,"value":947},"Никогда",{"type":84,"tag":76,"props":949,"children":950},{},[951,962,967],{"type":84,"tag":179,"props":952,"children":953},{},[954,956],{"type":90,"value":955},"Linux ",{"type":84,"tag":99,"props":957,"children":959},{"className":958},[],[960],{"type":90,"value":961},"\u002Fdev\u002Furandom",{"type":84,"tag":179,"props":963,"children":964},{},[965],{"type":90,"value":966},"Нет",{"type":84,"tag":179,"props":968,"children":969},{},[970],{"type":90,"value":971},"Да",{"type":84,"tag":76,"props":973,"children":974},{},[975,986,990],{"type":84,"tag":179,"props":976,"children":977},{},[978,984],{"type":84,"tag":99,"props":979,"children":981},{"className":980},[],[982],{"type":90,"value":983},"crypto.getRandomValues",{"type":90,"value":985}," (браузер)",{"type":84,"tag":179,"props":987,"children":988},{},[989],{"type":90,"value":966},{"type":84,"tag":179,"props":991,"children":992},{},[993],{"type":90,"value":971},{"type":84,"tag":76,"props":995,"children":996},{},[997,1008,1012],{"type":84,"tag":179,"props":998,"children":999},{},[1000,1002],{"type":90,"value":1001},"Node.js ",{"type":84,"tag":99,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":90,"value":1007},"crypto.randomBytes",{"type":84,"tag":179,"props":1009,"children":1010},{},[1011],{"type":90,"value":966},{"type":84,"tag":179,"props":1013,"children":1014},{},[1015],{"type":90,"value":971},{"type":84,"tag":76,"props":1017,"children":1018},{},[1019,1024,1028],{"type":84,"tag":179,"props":1020,"children":1021},{},[1022],{"type":90,"value":1023},"Hardware RNG (Intel RDRAND)",{"type":84,"tag":179,"props":1025,"children":1026},{},[1027],{"type":90,"value":966},{"type":84,"tag":179,"props":1029,"children":1030},{},[1031],{"type":90,"value":971},{"type":84,"tag":93,"props":1033,"children":1034},{},[1035,1037,1042,1044,1049,1051,1057],{"type":90,"value":1036},"Если казино тайком сидит в ",{"type":84,"tag":99,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":90,"value":895},{"type":90,"value":1043},", квалифицированный атакующий мог бы восстановить сид из достаточного числа публичных выходов и предсказать каждый будущий раунд — даже если математика HMAC идеальна. Вот почему проверка того, что твоё казино действительно использует ",{"type":84,"tag":99,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":90,"value":1007},{"type":90,"value":1050}," или эквивалент, имеет значение; объяснение ",{"type":84,"tag":723,"props":1052,"children":1054},{"href":1053},"\u002Fblog\u002Fwhat-is-provably-fair-gambling",[1055],{"type":90,"value":1056},"что такое Provably Fair гемблинг",{"type":90,"value":1058}," охватывает полную цепь доверия.",{"type":84,"tag":85,"props":1060,"children":1062},{"id":1061},"как-число-фактически-генерируется",[1063],{"type":90,"value":1064},"Как число фактически генерируется",{"type":84,"tag":93,"props":1066,"children":1067},{},[1068],{"type":90,"value":1069},"Теперь сама формула. Это раздел, который стоит добавить в закладки — всё выше было контекстом.",{"type":84,"tag":598,"props":1071,"children":1073},{"id":1072},"три-входа-одна-формула",[1074],{"type":90,"value":1075},"Три входа, одна формула",{"type":84,"tag":93,"props":1077,"children":1078},{},[1079],{"type":90,"value":1080},"Каждый раунд Provably Fair вычисляет:",{"type":84,"tag":93,"props":1082,"children":1083},{},[1084],{"type":84,"tag":295,"props":1085,"children":1087},{"className":1086},[298],[1088,1159],{"type":84,"tag":295,"props":1089,"children":1091},{"className":1090},[303],[1092],{"type":84,"tag":306,"props":1093,"children":1094},{"xmlns":308},[1095],{"type":84,"tag":311,"props":1096,"children":1097},{},[1098,1154],{"type":84,"tag":315,"props":1099,"children":1100},{},[1101,1106,1110,1114,1118,1122,1126,1130,1134,1138,1142,1146,1150],{"type":84,"tag":319,"props":1102,"children":1103},{},[1104],{"type":90,"value":1105},"hex_output",{"type":84,"tag":325,"props":1107,"children":1108},{},[1109],{"type":90,"value":329},{"type":84,"tag":319,"props":1111,"children":1112},{},[1113],{"type":90,"value":348},{"type":84,"tag":325,"props":1115,"children":1116},{"stretchy":338},[1117],{"type":90,"value":343},{"type":84,"tag":319,"props":1119,"children":1120},{},[1121],{"type":90,"value":357},{"type":84,"tag":325,"props":1123,"children":1124},{"separator":339},[1125],{"type":90,"value":362},{"type":84,"tag":319,"props":1127,"children":1128},{},[1129],{"type":90,"value":367},{"type":84,"tag":319,"props":1131,"children":1132},{},[1133],{"type":90,"value":372},{"type":84,"tag":319,"props":1135,"children":1136},{},[1137],{"type":90,"value":367},{"type":84,"tag":325,"props":1139,"children":1140},{},[1141],{"type":90,"value":377},{"type":84,"tag":319,"props":1143,"children":1144},{},[1145],{"type":90,"value":367},{"type":84,"tag":319,"props":1147,"children":1148},{},[1149],{"type":90,"value":382},{"type":84,"tag":325,"props":1151,"children":1152},{"stretchy":338},[1153],{"type":90,"value":387},{"type":84,"tag":393,"props":1155,"children":1156},{"encoding":395},[1157],{"type":90,"value":1158},"\\text{hex\\_output} = \\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} \\; : \\; \\text{nonce})",{"type":84,"tag":295,"props":1160,"children":1162},{"className":1161,"ariaHidden":339},[402],[1163,1194,1269],{"type":84,"tag":295,"props":1164,"children":1166},{"className":1165},[407],[1167,1172,1181,1185,1190],{"type":84,"tag":295,"props":1168,"children":1171},{"className":1169,"style":1170},[412],"height:1.0044em;vertical-align:-0.31em;",[],{"type":84,"tag":295,"props":1173,"children":1175},{"className":1174},[418,90],[1176],{"type":84,"tag":295,"props":1177,"children":1179},{"className":1178},[418],[1180],{"type":90,"value":1105},{"type":84,"tag":295,"props":1182,"children":1184},{"className":1183,"style":429},[428],[],{"type":84,"tag":295,"props":1186,"children":1188},{"className":1187},[434],[1189],{"type":90,"value":329},{"type":84,"tag":295,"props":1191,"children":1193},{"className":1192,"style":429},[428],[],{"type":84,"tag":295,"props":1195,"children":1197},{"className":1196},[407],[1198,1203,1212,1217,1226,1231,1235,1239,1248,1252,1256,1261,1265],{"type":84,"tag":295,"props":1199,"children":1202},{"className":1200,"style":1201},[412],"height:1.06em;vertical-align:-0.31em;",[],{"type":84,"tag":295,"props":1204,"children":1206},{"className":1205},[418,90],[1207],{"type":84,"tag":295,"props":1208,"children":1210},{"className":1209},[418],[1211],{"type":90,"value":348},{"type":84,"tag":295,"props":1213,"children":1215},{"className":1214},[480],[1216],{"type":90,"value":343},{"type":84,"tag":295,"props":1218,"children":1220},{"className":1219},[418,90],[1221],{"type":84,"tag":295,"props":1222,"children":1224},{"className":1223},[418],[1225],{"type":90,"value":357},{"type":84,"tag":295,"props":1227,"children":1229},{"className":1228},[495],[1230],{"type":90,"value":362},{"type":84,"tag":295,"props":1232,"children":1234},{"className":1233,"style":429},[428],[],{"type":84,"tag":295,"props":1236,"children":1238},{"className":1237,"style":505},[428],[],{"type":84,"tag":295,"props":1240,"children":1242},{"className":1241},[418,90],[1243],{"type":84,"tag":295,"props":1244,"children":1246},{"className":1245},[418],[1247],{"type":90,"value":372},{"type":84,"tag":295,"props":1249,"children":1251},{"className":1250,"style":429},[428],[],{"type":84,"tag":295,"props":1253,"children":1255},{"className":1254,"style":429},[428],[],{"type":84,"tag":295,"props":1257,"children":1259},{"className":1258},[434],[1260],{"type":90,"value":377},{"type":84,"tag":295,"props":1262,"children":1264},{"className":1263,"style":429},[428],[],{"type":84,"tag":295,"props":1266,"children":1268},{"className":1267,"style":429},[428],[],{"type":84,"tag":295,"props":1270,"children":1272},{"className":1271},[407],[1273,1278,1287],{"type":84,"tag":295,"props":1274,"children":1277},{"className":1275,"style":1276},[412],"height:1em;vertical-align:-0.25em;",[],{"type":84,"tag":295,"props":1279,"children":1281},{"className":1280},[418,90],[1282],{"type":84,"tag":295,"props":1283,"children":1285},{"className":1284},[418],[1286],{"type":90,"value":382},{"type":84,"tag":295,"props":1288,"children":1290},{"className":1289},[549],[1291],{"type":90,"value":387},{"type":84,"tag":93,"props":1293,"children":1294},{},[1295],{"type":90,"value":1296},"В псевдокоде:",{"type":84,"tag":1298,"props":1299,"children":1303},"pre",{"className":1300,"code":1302,"language":90},[1301],"language-text","function pfHmac(serverSeed, clientSeed, nonce) {\n  const message = clientSeed + ':' + nonce\n  const hex = hmacSha256(serverSeed, message)  \u002F\u002F 64-символная hex-строка\n  return hex\n}\n",[1304],{"type":84,"tag":99,"props":1305,"children":1307},{"__ignoreMap":1306},"",[1308],{"type":90,"value":1302},{"type":84,"tag":93,"props":1310,"children":1311},{},[1312,1314,1319],{"type":90,"value":1313},"Двоеточие ",{"type":84,"tag":99,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":90,"value":377},{"type":90,"value":1320}," — это канонический разделитель на Stake, Primedice, Rainbet и большинстве PF-казино. Несколько (BC.Game, Roobet) используют другие разделители — всегда проверяй документацию честности казино на предмет точного формата.",{"type":84,"tag":93,"props":1322,"children":1323},{},[1324,1326,1332],{"type":90,"value":1325},"На выходе получается 64-символная шестнадцатеричная строка типа ",{"type":84,"tag":99,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":90,"value":1331},"8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d",{"type":90,"value":1333},". Этот hex — сырая случайность — 256 бит непредсказуемости, статистически неотличимая от подбрасывания 256 справедливых монет.",{"type":84,"tag":1335,"props":1336,"children":1337},"chart-provably-fair-process",{},[],{"type":84,"tag":598,"props":1339,"children":1341},{"id":1340},"пошагово-от-выхода-hmac-к-результату-в-игре",[1342],{"type":90,"value":1343},"Пошагово: от выхода HMAC к результату в игре",{"type":84,"tag":93,"props":1345,"children":1346},{},[1347],{"type":90,"value":1348},"Давай разберём один раунд полностью.",{"type":84,"tag":93,"props":1350,"children":1351},{},[1352],{"type":84,"tag":126,"props":1353,"children":1354},{},[1355],{"type":90,"value":1356},"Исходные значения:",{"type":84,"tag":605,"props":1358,"children":1359},{},[1360,1369,1378],{"type":84,"tag":609,"props":1361,"children":1362},{},[1363],{"type":84,"tag":99,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":90,"value":1368},"server_seed = f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4",{"type":84,"tag":609,"props":1370,"children":1371},{},[1372],{"type":84,"tag":99,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":90,"value":1377},"client_seed = player-xyz-42",{"type":84,"tag":609,"props":1379,"children":1380},{},[1381],{"type":84,"tag":99,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":90,"value":1386},"nonce = 7",{"type":84,"tag":93,"props":1388,"children":1389},{},[1390],{"type":84,"tag":126,"props":1391,"children":1392},{},[1393],{"type":90,"value":1394},"Шаг 1 — вычислить HMAC:",{"type":84,"tag":1298,"props":1396,"children":1399},{"className":1397,"code":1398,"language":90},[1301],"HMAC-SHA256(server_seed, \"player-xyz-42:7\")\n= 8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d\n",[1400],{"type":84,"tag":99,"props":1401,"children":1402},{"__ignoreMap":1306},[1403],{"type":90,"value":1398},{"type":84,"tag":93,"props":1405,"children":1406},{},[1407],{"type":84,"tag":126,"props":1408,"children":1409},{},[1410],{"type":90,"value":1411},"Шаг 2 — извлечь первые 5 символов hex:",{"type":84,"tag":93,"props":1413,"children":1414},{},[1415,1421,1423],{"type":84,"tag":99,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":90,"value":1420},"8b2d4",{"type":90,"value":1422}," → преобразовать в десятичное → ",{"type":84,"tag":99,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":90,"value":1428},"569 300",{"type":84,"tag":93,"props":1430,"children":1431},{},[1432],{"type":84,"tag":126,"props":1433,"children":1434},{},[1435],{"type":90,"value":1436},"Шаг 3 — отобразить на диапазон 0-99.9999:",{"type":84,"tag":1298,"props":1438,"children":1441},{"className":1439,"code":1440,"language":90},[1301],"dice = (569_300 % 1_000_000) \u002F 10_000\n     = 569_300 \u002F 10_000\n     = 56.93\n",[1442],{"type":84,"tag":99,"props":1443,"children":1444},{"__ignoreMap":1306},[1445],{"type":90,"value":1440},{"type":84,"tag":93,"props":1447,"children":1448},{},[1449],{"type":84,"tag":126,"props":1450,"children":1451},{},[1452],{"type":90,"value":1453},"Шаг 4 — применить логику ставки:",{"type":84,"tag":93,"props":1455,"children":1456},{},[1457],{"type":90,"value":1458},"Если ты поставил \"выпадет меньше 50\" → ты проиграл (56.93 > 50). Если ты поставил \"выпадет меньше 60\" → ты выиграл. Точный результат был определён в момент, когда эти три входа объединились, ещё до того, как запустилась анимация в интерфейсе.",{"type":84,"tag":93,"props":1460,"children":1461},{},[1462],{"type":84,"tag":126,"props":1463,"children":1464},{},[1465],{"type":90,"value":1466},"Шаг 5 — проверить:",{"type":84,"tag":93,"props":1468,"children":1469},{},[1470,1472,1477,1479,1485],{"type":90,"value":1471},"После раунда ты получаешь открытый ",{"type":84,"tag":99,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":90,"value":357},{"type":90,"value":1478},". Ты его хэшируешь — SHA-256 совпадает с предварительно заверенным хэшем? Хорошо. Ты повторно запускаешь шаги 1-3 — воспроизвёл ",{"type":84,"tag":99,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":90,"value":1484},"56.93",{"type":90,"value":1486},"? Хорошо. Раунд криптографически подтверждён как честный.",{"type":84,"tag":93,"props":1488,"children":1489},{},[1490,1492,1498],{"type":90,"value":1491},"Для полного пошагового разбора с копипастой значений и скриншотами, см. ",{"type":84,"tag":723,"props":1493,"children":1495},{"href":1494},"\u002Fblog\u002Fhow-to-verify-provably-fair",[1496],{"type":90,"value":1497},"как проверить Provably Fair раунд",{"type":90,"value":730},{"type":84,"tag":598,"props":1500,"children":1502},{"id":1501},"разные-игры-разные-формулы",[1503],{"type":90,"value":1504},"Разные игры, разные формулы",{"type":84,"tag":93,"props":1506,"children":1507},{},[1508],{"type":90,"value":1509},"Вызов HMAC всегда идентичен. Меняется шаг 3 — как hex отображается на конкретный результат игры.",{"type":84,"tag":145,"props":1511,"children":1512},{},[1513,1539],{"type":84,"tag":149,"props":1514,"children":1515},{},[1516],{"type":84,"tag":76,"props":1517,"children":1518},{},[1519,1524,1529,1534],{"type":84,"tag":156,"props":1520,"children":1521},{},[1522],{"type":90,"value":1523},"Игра",{"type":84,"tag":156,"props":1525,"children":1526},{},[1527],{"type":90,"value":1528},"Срез hex",{"type":84,"tag":156,"props":1530,"children":1531},{},[1532],{"type":90,"value":1533},"Формула",{"type":84,"tag":156,"props":1535,"children":1536},{},[1537],{"type":90,"value":1538},"Диапазон выхода",{"type":84,"tag":172,"props":1540,"children":1541},{},[1542,1572,1602,1634,1673,1705],{"type":84,"tag":76,"props":1543,"children":1544},{},[1545,1553,1558,1567],{"type":84,"tag":179,"props":1546,"children":1547},{},[1548],{"type":84,"tag":126,"props":1549,"children":1550},{},[1551],{"type":90,"value":1552},"Dice",{"type":84,"tag":179,"props":1554,"children":1555},{},[1556],{"type":90,"value":1557},"Первые 5 символов",{"type":84,"tag":179,"props":1559,"children":1560},{},[1561],{"type":84,"tag":99,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":90,"value":1566},"(int % 1e6) \u002F 1e4",{"type":84,"tag":179,"props":1568,"children":1569},{},[1570],{"type":90,"value":1571},"0.0000-99.9999",{"type":84,"tag":76,"props":1573,"children":1574},{},[1575,1583,1588,1597],{"type":84,"tag":179,"props":1576,"children":1577},{},[1578],{"type":84,"tag":126,"props":1579,"children":1580},{},[1581],{"type":90,"value":1582},"Crash",{"type":84,"tag":179,"props":1584,"children":1585},{},[1586],{"type":90,"value":1587},"Первые 8 символов",{"type":84,"tag":179,"props":1589,"children":1590},{},[1591],{"type":84,"tag":99,"props":1592,"children":1594},{"className":1593},[],[1595],{"type":90,"value":1596},"floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100",{"type":84,"tag":179,"props":1598,"children":1599},{},[1600],{"type":90,"value":1601},"1.00x и выше",{"type":84,"tag":76,"props":1603,"children":1604},{},[1605,1613,1618,1629],{"type":84,"tag":179,"props":1606,"children":1607},{},[1608],{"type":84,"tag":126,"props":1609,"children":1610},{},[1611],{"type":90,"value":1612},"Coinflip",{"type":84,"tag":179,"props":1614,"children":1615},{},[1616],{"type":90,"value":1617},"Первые 2 символа",{"type":84,"tag":179,"props":1619,"children":1620},{},[1621,1627],{"type":84,"tag":99,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":90,"value":1626},"int % 2",{"type":90,"value":1628}," (0 или 1)",{"type":84,"tag":179,"props":1630,"children":1631},{},[1632],{"type":90,"value":1633},"Орёл\u002FРешка",{"type":84,"tag":76,"props":1635,"children":1636},{},[1637,1645,1649,1668],{"type":84,"tag":179,"props":1638,"children":1639},{},[1640],{"type":84,"tag":126,"props":1641,"children":1642},{},[1643],{"type":90,"value":1644},"Roulette",{"type":84,"tag":179,"props":1646,"children":1647},{},[1648],{"type":90,"value":1617},{"type":84,"tag":179,"props":1650,"children":1651},{},[1652,1658,1660,1666],{"type":84,"tag":99,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":90,"value":1657},"int % 37",{"type":90,"value":1659}," (Европейская) или ",{"type":84,"tag":99,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":90,"value":1665},"% 38",{"type":90,"value":1667}," (Американская)",{"type":84,"tag":179,"props":1669,"children":1670},{},[1671],{"type":90,"value":1672},"0-36 или 0-37",{"type":84,"tag":76,"props":1674,"children":1675},{},[1676,1684,1689,1700],{"type":84,"tag":179,"props":1677,"children":1678},{},[1679],{"type":84,"tag":126,"props":1680,"children":1681},{},[1682],{"type":90,"value":1683},"Plinko",{"type":84,"tag":179,"props":1685,"children":1686},{},[1687],{"type":90,"value":1688},"Первые 4 символа × n бросков",{"type":84,"tag":179,"props":1690,"children":1691},{},[1692,1698],{"type":84,"tag":99,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":90,"value":1697},"int % rows",{"type":90,"value":1699}," за бросок",{"type":84,"tag":179,"props":1701,"children":1702},{},[1703],{"type":90,"value":1704},"Путь через колышки",{"type":84,"tag":76,"props":1706,"children":1707},{},[1708,1716,1721,1732],{"type":84,"tag":179,"props":1709,"children":1710},{},[1711],{"type":84,"tag":126,"props":1712,"children":1713},{},[1714],{"type":90,"value":1715},"Blackjack (HMAC-SHA512)",{"type":84,"tag":179,"props":1717,"children":1718},{},[1719],{"type":90,"value":1720},"4 символа за карту",{"type":84,"tag":179,"props":1722,"children":1723},{},[1724,1730],{"type":84,"tag":99,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":90,"value":1729},"int % 52",{"type":90,"value":1731}," с логикой замещения",{"type":84,"tag":179,"props":1733,"children":1734},{},[1735],{"type":90,"value":1736},"Позиция в колоде",{"type":84,"tag":93,"props":1738,"children":1739},{},[1740,1742,1747],{"type":90,"value":1741},"Каждое отображение разработано так, чтобы быть равномерным по всему диапазону выхода — модульная арифметика над равномерно случайным hex-значением сохраняет равномерность. Вот почему PF-игры могут заявлять об честном RTP без манипуляции отдельными раундами со стороны казино. ",{"type":84,"tag":108,"props":1743,"children":1744},{},[1745],{"type":90,"value":1746},"Формула отображения",{"type":90,"value":1748}," настраивается, чтобы попасть в целевой перевес дома казино, а не сама случайность.",{"type":84,"tag":85,"props":1750,"children":1752},{"id":1751},"от-hex-строки-к-результату-в-игре-с-математикой",[1753],{"type":90,"value":1754},"От hex-строки к результату в игре (с математикой)",{"type":84,"tag":93,"props":1756,"children":1757},{},[1758],{"type":90,"value":1759},"Отображение для dice стоит разобрать подробнее, потому что это самый наглядный случай — и потому что это показывает, почему распределение Provably Fair в dice действительно равномерно при правильной реализации.",{"type":84,"tag":598,"props":1761,"children":1763},{"id":1762},"отображение-dice-0-999999",[1764],{"type":90,"value":1765},"Отображение Dice (0-99.9999)",{"type":84,"tag":93,"props":1767,"children":1768},{},[1769],{"type":90,"value":1770},"Dice на Stake использует первые 5 символов hex, что даёт 20 бит = 1 048 576 возможных значений. Отображение выглядит так:",{"type":84,"tag":93,"props":1772,"children":1773},{},[1774],{"type":84,"tag":295,"props":1775,"children":1777},{"className":1776},[298],[1778,1899],{"type":84,"tag":295,"props":1779,"children":1781},{"className":1780},[303],[1782],{"type":84,"tag":306,"props":1783,"children":1784},{"xmlns":308},[1785],{"type":84,"tag":311,"props":1786,"children":1787},{},[1788,1894],{"type":84,"tag":315,"props":1789,"children":1790},{},[1791,1796,1800],{"type":84,"tag":319,"props":1792,"children":1793},{},[1794],{"type":90,"value":1795},"dice",{"type":84,"tag":325,"props":1797,"children":1798},{},[1799],{"type":90,"value":329},{"type":84,"tag":1801,"props":1802,"children":1803},"mfrac",{},[1804,1882],{"type":84,"tag":315,"props":1805,"children":1806},{},[1807,1811,1816,1820,1847,1851,1855,1860,1864,1878],{"type":84,"tag":325,"props":1808,"children":1809},{"stretchy":338},[1810],{"type":90,"value":343},{"type":84,"tag":319,"props":1812,"children":1813},{},[1814],{"type":90,"value":1815},"int",{"type":84,"tag":325,"props":1817,"children":1818},{"stretchy":338},[1819],{"type":90,"value":343},{"type":84,"tag":1821,"props":1822,"children":1823},"msub",{},[1824,1829],{"type":84,"tag":319,"props":1825,"children":1826},{},[1827],{"type":90,"value":1828},"hex",{"type":84,"tag":315,"props":1830,"children":1831},{},[1832,1838,1842],{"type":84,"tag":1833,"props":1834,"children":1835},"mn",{},[1836],{"type":90,"value":1837},"0",{"type":84,"tag":325,"props":1839,"children":1840},{},[1841],{"type":90,"value":377},{"type":84,"tag":1833,"props":1843,"children":1844},{},[1845],{"type":90,"value":1846},"5",{"type":84,"tag":325,"props":1848,"children":1849},{"stretchy":338},[1850],{"type":90,"value":387},{"type":84,"tag":319,"props":1852,"children":1853},{},[1854],{"type":90,"value":367},{"type":84,"tag":319,"props":1856,"children":1857},{},[1858],{"type":90,"value":1859},"mod",{"type":84,"tag":319,"props":1861,"children":1862},{},[1863],{"type":90,"value":367},{"type":84,"tag":1865,"props":1866,"children":1867},"msup",{},[1868,1873],{"type":84,"tag":1833,"props":1869,"children":1870},{},[1871],{"type":90,"value":1872},"10",{"type":84,"tag":1833,"props":1874,"children":1875},{},[1876],{"type":90,"value":1877},"6",{"type":84,"tag":325,"props":1879,"children":1880},{"stretchy":338},[1881],{"type":90,"value":387},{"type":84,"tag":1865,"props":1883,"children":1884},{},[1885,1889],{"type":84,"tag":1833,"props":1886,"children":1887},{},[1888],{"type":90,"value":1872},{"type":84,"tag":1833,"props":1890,"children":1891},{},[1892],{"type":90,"value":1893},"4",{"type":84,"tag":393,"props":1895,"children":1896},{"encoding":395},[1897],{"type":90,"value":1898},"\\text{dice} = \\frac{(\\text{int}(\\text{hex}_{0:5}) \\; \\text{mod} \\; 10^6)}{10^4}",{"type":84,"tag":295,"props":1900,"children":1902},{"className":1901,"ariaHidden":339},[402],[1903,1934],{"type":84,"tag":295,"props":1904,"children":1906},{"className":1905},[407],[1907,1912,1921,1925,1930],{"type":84,"tag":295,"props":1908,"children":1911},{"className":1909,"style":1910},[412],"height:0.6944em;",[],{"type":84,"tag":295,"props":1913,"children":1915},{"className":1914},[418,90],[1916],{"type":84,"tag":295,"props":1917,"children":1919},{"className":1918},[418],[1920],{"type":90,"value":1795},{"type":84,"tag":295,"props":1922,"children":1924},{"className":1923,"style":429},[428],[],{"type":84,"tag":295,"props":1926,"children":1928},{"className":1927},[434],[1929],{"type":90,"value":329},{"type":84,"tag":295,"props":1931,"children":1933},{"className":1932,"style":429},[428],[],{"type":84,"tag":295,"props":1935,"children":1937},{"className":1936},[407],[1938,1943],{"type":84,"tag":295,"props":1939,"children":1942},{"className":1940,"style":1941},[412],"height:1.4539em;vertical-align:-0.345em;",[],{"type":84,"tag":295,"props":1944,"children":1946},{"className":1945},[418],[1947,1952,2269],{"type":84,"tag":295,"props":1948,"children":1951},{"className":1949},[480,1950],"nulldelimiter",[],{"type":84,"tag":295,"props":1953,"children":1955},{"className":1954},[1801],[1956],{"type":84,"tag":295,"props":1957,"children":1961},{"className":1958},[1959,1960],"vlist-t","vlist-t2",[1962,2257],{"type":84,"tag":295,"props":1963,"children":1966},{"className":1964},[1965],"vlist-r",[1967,2252],{"type":84,"tag":295,"props":1968,"children":1972},{"className":1969,"style":1971},[1970],"vlist","height:1.1089em;",[1973,2047,2061],{"type":84,"tag":295,"props":1974,"children":1976},{"style":1975},"top:-2.655em;",[1977,1983],{"type":84,"tag":295,"props":1978,"children":1982},{"className":1979,"style":1981},[1980],"pstrut","height:3em;",[],{"type":84,"tag":295,"props":1984,"children":1990},{"className":1985},[1986,1987,1988,1989],"sizing","reset-size6","size3","mtight",[1991],{"type":84,"tag":295,"props":1992,"children":1994},{"className":1993},[418,1989],[1995,2001],{"type":84,"tag":295,"props":1996,"children":1998},{"className":1997},[418,1989],[1999],{"type":90,"value":2000},"1",{"type":84,"tag":295,"props":2002,"children":2004},{"className":2003},[418,1989],[2005,2010],{"type":84,"tag":295,"props":2006,"children":2008},{"className":2007},[418,1989],[2009],{"type":90,"value":1837},{"type":84,"tag":295,"props":2011,"children":2014},{"className":2012},[2013],"msupsub",[2015],{"type":84,"tag":295,"props":2016,"children":2018},{"className":2017},[1959],[2019],{"type":84,"tag":295,"props":2020,"children":2022},{"className":2021},[1965],[2023],{"type":84,"tag":295,"props":2024,"children":2027},{"className":2025,"style":2026},[1970],"height:0.7463em;",[2028],{"type":84,"tag":295,"props":2029,"children":2031},{"style":2030},"top:-2.786em;margin-right:0.0714em;",[2032,2037],{"type":84,"tag":295,"props":2033,"children":2036},{"className":2034,"style":2035},[1980],"height:2.5em;",[],{"type":84,"tag":295,"props":2038,"children":2041},{"className":2039},[1986,2040,465,1989],"reset-size3",[2042],{"type":84,"tag":295,"props":2043,"children":2045},{"className":2044},[418,1989],[2046],{"type":90,"value":1893},{"type":84,"tag":295,"props":2048,"children":2050},{"style":2049},"top:-3.23em;",[2051,2055],{"type":84,"tag":295,"props":2052,"children":2054},{"className":2053,"style":1981},[1980],[],{"type":84,"tag":295,"props":2056,"children":2060},{"className":2057,"style":2059},[2058],"frac-line","border-bottom-width:0.04em;",[],{"type":84,"tag":295,"props":2062,"children":2064},{"style":2063},"top:-3.485em;",[2065,2069],{"type":84,"tag":295,"props":2066,"children":2068},{"className":2067,"style":1981},[1980],[],{"type":84,"tag":295,"props":2070,"children":2072},{"className":2071},[1986,1987,1988,1989],[2073],{"type":84,"tag":295,"props":2074,"children":2076},{"className":2075},[418,1989],[2077,2082,2091,2096,2176,2181,2186,2195,2199,2204,2247],{"type":84,"tag":295,"props":2078,"children":2080},{"className":2079},[480,1989],[2081],{"type":90,"value":343},{"type":84,"tag":295,"props":2083,"children":2085},{"className":2084},[418,90,1989],[2086],{"type":84,"tag":295,"props":2087,"children":2089},{"className":2088},[418,1989],[2090],{"type":90,"value":1815},{"type":84,"tag":295,"props":2092,"children":2094},{"className":2093},[480,1989],[2095],{"type":90,"value":343},{"type":84,"tag":295,"props":2097,"children":2099},{"className":2098},[418,1989],[2100,2109],{"type":84,"tag":295,"props":2101,"children":2103},{"className":2102},[418,90,1989],[2104],{"type":84,"tag":295,"props":2105,"children":2107},{"className":2106},[418,1989],[2108],{"type":90,"value":1828},{"type":84,"tag":295,"props":2110,"children":2112},{"className":2111},[2013],[2113],{"type":84,"tag":295,"props":2114,"children":2116},{"className":2115},[1959,1960],[2117,2164],{"type":84,"tag":295,"props":2118,"children":2120},{"className":2119},[1965],[2121,2157],{"type":84,"tag":295,"props":2122,"children":2125},{"className":2123,"style":2124},[1970],"height:0.3173em;",[2126],{"type":84,"tag":295,"props":2127,"children":2129},{"style":2128},"top:-2.357em;margin-right:0.0714em;",[2130,2134],{"type":84,"tag":295,"props":2131,"children":2133},{"className":2132,"style":2035},[1980],[],{"type":84,"tag":295,"props":2135,"children":2137},{"className":2136},[1986,2040,465,1989],[2138],{"type":84,"tag":295,"props":2139,"children":2141},{"className":2140},[418,1989],[2142,2147,2152],{"type":84,"tag":295,"props":2143,"children":2145},{"className":2144},[418,1989],[2146],{"type":90,"value":1837},{"type":84,"tag":295,"props":2148,"children":2150},{"className":2149},[434,1989],[2151],{"type":90,"value":377},{"type":84,"tag":295,"props":2153,"children":2155},{"className":2154},[418,1989],[2156],{"type":90,"value":1846},{"type":84,"tag":295,"props":2158,"children":2161},{"className":2159},[2160],"vlist-s",[2162],{"type":90,"value":2163},"​",{"type":84,"tag":295,"props":2165,"children":2167},{"className":2166},[1965],[2168],{"type":84,"tag":295,"props":2169,"children":2172},{"className":2170,"style":2171},[1970],"height:0.143em;",[2173],{"type":84,"tag":295,"props":2174,"children":2175},{},[],{"type":84,"tag":295,"props":2177,"children":2179},{"className":2178},[549,1989],[2180],{"type":90,"value":387},{"type":84,"tag":295,"props":2182,"children":2185},{"className":2183,"style":2184},[428,1989],"margin-right:0.3253em;",[],{"type":84,"tag":295,"props":2187,"children":2189},{"className":2188},[418,90,1989],[2190],{"type":84,"tag":295,"props":2191,"children":2193},{"className":2192},[418,1989],[2194],{"type":90,"value":1859},{"type":84,"tag":295,"props":2196,"children":2198},{"className":2197,"style":2184},[428,1989],[],{"type":84,"tag":295,"props":2200,"children":2202},{"className":2201},[418,1989],[2203],{"type":90,"value":2000},{"type":84,"tag":295,"props":2205,"children":2207},{"className":2206},[418,1989],[2208,2213],{"type":84,"tag":295,"props":2209,"children":2211},{"className":2210},[418,1989],[2212],{"type":90,"value":1837},{"type":84,"tag":295,"props":2214,"children":2216},{"className":2215},[2013],[2217],{"type":84,"tag":295,"props":2218,"children":2220},{"className":2219},[1959],[2221],{"type":84,"tag":295,"props":2222,"children":2224},{"className":2223},[1965],[2225],{"type":84,"tag":295,"props":2226,"children":2229},{"className":2227,"style":2228},[1970],"height:0.8913em;",[2230],{"type":84,"tag":295,"props":2231,"children":2233},{"style":2232},"top:-2.931em;margin-right:0.0714em;",[2234,2238],{"type":84,"tag":295,"props":2235,"children":2237},{"className":2236,"style":2035},[1980],[],{"type":84,"tag":295,"props":2239,"children":2241},{"className":2240},[1986,2040,465,1989],[2242],{"type":84,"tag":295,"props":2243,"children":2245},{"className":2244},[418,1989],[2246],{"type":90,"value":1877},{"type":84,"tag":295,"props":2248,"children":2250},{"className":2249},[549,1989],[2251],{"type":90,"value":387},{"type":84,"tag":295,"props":2253,"children":2255},{"className":2254},[2160],[2256],{"type":90,"value":2163},{"type":84,"tag":295,"props":2258,"children":2260},{"className":2259},[1965],[2261],{"type":84,"tag":295,"props":2262,"children":2265},{"className":2263,"style":2264},[1970],"height:0.345em;",[2266],{"type":84,"tag":295,"props":2267,"children":2268},{},[],{"type":84,"tag":295,"props":2270,"children":2272},{"className":2271},[549,1950],[],{"type":84,"tag":93,"props":2274,"children":2275},{},[2276,2278,2283],{"type":90,"value":2277},"Зачем модуль 1 000 000, если срез может достигать 1 048 575? Потому что без модуля значения 1 000 000-1 048 575 отобразились бы на 100.0000-104.8575, за пределами диапазона dice. Модуль складывает их обратно — но вводит крошечную ошибку (значения 0-48 575 более вероятны, чем 48 576-99 999 в соотношении 2:1). Чтобы исключить смещение, реальные реализации ",{"type":84,"tag":108,"props":2279,"children":2280},{},[2281],{"type":90,"value":2282},"отклоняют",{"type":90,"value":2284}," срезы выше 1 000 000 и переходят к следующему куску hex (символы 5-10, затем 10-15 и т. д.).",{"type":84,"tag":93,"props":2286,"children":2287},{},[2288],{"type":90,"value":2289},"При правильной реализации это даёт идеально равномерное распределение от 0.0000 до 99.9999. Тест из 10 000 бросков показывает практически плоское покрытие — гистограмма ниже воспроизводит то, что ты увидишь с любой легитимной реализацией PF-dice.",{"type":84,"tag":2291,"props":2292,"children":2293},"chart-rng-distribution",{},[],{"type":84,"tag":598,"props":2295,"children":2297},{"id":2296},"отображение-crash-множитель",[2298],{"type":90,"value":2299},"Отображение Crash (множитель)",{"type":84,"tag":93,"props":2301,"children":2302},{},[2303],{"type":90,"value":2304},"Crash интереснее, потому что выход не равномерный — он сознательно смещён, чтобы создать драматичный геймплей, сохраняя целевой перевес дома.",{"type":84,"tag":93,"props":2306,"children":2307},{},[2308],{"type":84,"tag":295,"props":2309,"children":2311},{"className":2310},[298],[2312,2424],{"type":84,"tag":295,"props":2313,"children":2315},{"className":2314},[303],[2316],{"type":84,"tag":306,"props":2317,"children":2318},{"xmlns":308},[2319],{"type":84,"tag":311,"props":2320,"children":2321},{},[2322,2419],{"type":84,"tag":315,"props":2323,"children":2324},{},[2325,2330,2334],{"type":84,"tag":319,"props":2326,"children":2327},{},[2328],{"type":90,"value":2329},"crash",{"type":84,"tag":325,"props":2331,"children":2332},{},[2333],{"type":90,"value":329},{"type":84,"tag":1801,"props":2335,"children":2336},{},[2337,2415],{"type":84,"tag":315,"props":2338,"children":2339},{},[2340,2345,2410],{"type":84,"tag":325,"props":2341,"children":2342},{"fence":339},[2343],{"type":90,"value":2344},"⌊",{"type":84,"tag":2346,"props":2347,"children":2348},"mstyle",{"scriptlevel":1837,"displaystyle":339},[2349],{"type":84,"tag":1801,"props":2350,"children":2351},{},[2352,2388],{"type":84,"tag":315,"props":2353,"children":2354},{},[2355,2360,2365,2378,2383],{"type":84,"tag":1833,"props":2356,"children":2357},{},[2358],{"type":90,"value":2359},"100",{"type":84,"tag":325,"props":2361,"children":2362},{},[2363],{"type":90,"value":2364},"⋅",{"type":84,"tag":1865,"props":2366,"children":2367},{},[2368,2373],{"type":84,"tag":1833,"props":2369,"children":2370},{},[2371],{"type":90,"value":2372},"2",{"type":84,"tag":1833,"props":2374,"children":2375},{},[2376],{"type":90,"value":2377},"52",{"type":84,"tag":325,"props":2379,"children":2380},{},[2381],{"type":90,"value":2382},"−",{"type":84,"tag":331,"props":2384,"children":2385},{},[2386],{"type":90,"value":2387},"h",{"type":84,"tag":315,"props":2389,"children":2390},{},[2391,2402,2406],{"type":84,"tag":1865,"props":2392,"children":2393},{},[2394,2398],{"type":84,"tag":1833,"props":2395,"children":2396},{},[2397],{"type":90,"value":2372},{"type":84,"tag":1833,"props":2399,"children":2400},{},[2401],{"type":90,"value":2377},{"type":84,"tag":325,"props":2403,"children":2404},{},[2405],{"type":90,"value":2382},{"type":84,"tag":331,"props":2407,"children":2408},{},[2409],{"type":90,"value":2387},{"type":84,"tag":325,"props":2411,"children":2412},{"fence":339},[2413],{"type":90,"value":2414},"⌋",{"type":84,"tag":1833,"props":2416,"children":2417},{},[2418],{"type":90,"value":2359},{"type":84,"tag":393,"props":2420,"children":2421},{"encoding":395},[2422],{"type":90,"value":2423},"\\text{crash} = \\frac{\\left\\lfloor \\dfrac{100 \\cdot 2^{52} - h}{2^{52} - h} \\right\\rfloor}{100}",{"type":84,"tag":295,"props":2425,"children":2427},{"className":2426,"ariaHidden":339},[402],[2428,2458],{"type":84,"tag":295,"props":2429,"children":2431},{"className":2430},[407],[2432,2436,2445,2449,2454],{"type":84,"tag":295,"props":2433,"children":2435},{"className":2434,"style":1910},[412],[],{"type":84,"tag":295,"props":2437,"children":2439},{"className":2438},[418,90],[2440],{"type":84,"tag":295,"props":2441,"children":2443},{"className":2442},[418],[2444],{"type":90,"value":2329},{"type":84,"tag":295,"props":2446,"children":2448},{"className":2447,"style":429},[428],[],{"type":84,"tag":295,"props":2450,"children":2452},{"className":2451},[434],[2453],{"type":90,"value":329},{"type":84,"tag":295,"props":2455,"children":2457},{"className":2456,"style":429},[428],[],{"type":84,"tag":295,"props":2459,"children":2461},{"className":2460},[407],[2462,2467],{"type":84,"tag":295,"props":2463,"children":2466},{"className":2464,"style":2465},[412],"height:3.1486em;vertical-align:-0.345em;",[],{"type":84,"tag":295,"props":2468,"children":2470},{"className":2469},[418],[2471,2475,2824],{"type":84,"tag":295,"props":2472,"children":2474},{"className":2473},[480,1950],[],{"type":84,"tag":295,"props":2476,"children":2478},{"className":2477},[1801],[2479],{"type":84,"tag":295,"props":2480,"children":2482},{"className":2481},[1959,1960],[2483,2813],{"type":84,"tag":295,"props":2484,"children":2486},{"className":2485},[1965],[2487,2808],{"type":84,"tag":295,"props":2488,"children":2491},{"className":2489,"style":2490},[1970],"height:2.8036em;",[2492,2514,2526],{"type":84,"tag":295,"props":2493,"children":2495},{"style":2494},"top:-3.1461em;",[2496,2501],{"type":84,"tag":295,"props":2497,"children":2500},{"className":2498,"style":2499},[1980],"height:3.4911em;",[],{"type":84,"tag":295,"props":2502,"children":2504},{"className":2503},[1986,1987,1988,1989],[2505],{"type":84,"tag":295,"props":2506,"children":2508},{"className":2507},[418,1989],[2509],{"type":84,"tag":295,"props":2510,"children":2512},{"className":2511},[418,1989],[2513],{"type":90,"value":2359},{"type":84,"tag":295,"props":2515,"children":2517},{"style":2516},"top:-3.7211em;",[2518,2522],{"type":84,"tag":295,"props":2519,"children":2521},{"className":2520,"style":2499},[1980],[],{"type":84,"tag":295,"props":2523,"children":2525},{"className":2524,"style":2059},[2058],[],{"type":84,"tag":295,"props":2527,"children":2529},{"style":2528},"top:-4.8036em;",[2530,2534],{"type":84,"tag":295,"props":2531,"children":2533},{"className":2532,"style":2499},[1980],[],{"type":84,"tag":295,"props":2535,"children":2537},{"className":2536},[1986,1987,1988,1989],[2538],{"type":84,"tag":295,"props":2539,"children":2541},{"className":2540},[418,1989],[2542],{"type":84,"tag":295,"props":2543,"children":2546},{"className":2544},[2545,1989],"minner",[2547,2563,2795],{"type":84,"tag":295,"props":2548,"children":2553},{"className":2549,"style":2552},[480,1986,2040,2550,1989,2551],"size6","delimcenter","top:0.075em;",[2554],{"type":84,"tag":295,"props":2555,"children":2557},{"className":2556},[464,1988,1989],[2558],{"type":84,"tag":295,"props":2559,"children":2561},{"className":2560},[1989],[2562],{"type":90,"value":2344},{"type":84,"tag":295,"props":2564,"children":2566},{"className":2565},[418,1986,2040,2550],[2567,2571,2791],{"type":84,"tag":295,"props":2568,"children":2570},{"className":2569},[480,1950],[],{"type":84,"tag":295,"props":2572,"children":2574},{"className":2573},[1801],[2575],{"type":84,"tag":295,"props":2576,"children":2578},{"className":2577},[1959,1960],[2579,2779],{"type":84,"tag":295,"props":2580,"children":2582},{"className":2581},[1965],[2583,2774],{"type":84,"tag":295,"props":2584,"children":2587},{"className":2585,"style":2586},[1970],"height:1.4911em;",[2588,2668,2679],{"type":84,"tag":295,"props":2589,"children":2591},{"style":2590},"top:-2.314em;",[2592,2596],{"type":84,"tag":295,"props":2593,"children":2595},{"className":2594,"style":1981},[1980],[],{"type":84,"tag":295,"props":2597,"children":2599},{"className":2598},[418],[2600,2648,2653,2659,2663],{"type":84,"tag":295,"props":2601,"children":2603},{"className":2602},[418],[2604,2609],{"type":84,"tag":295,"props":2605,"children":2607},{"className":2606},[418],[2608],{"type":90,"value":2372},{"type":84,"tag":295,"props":2610,"children":2612},{"className":2611},[2013],[2613],{"type":84,"tag":295,"props":2614,"children":2616},{"className":2615},[1959],[2617],{"type":84,"tag":295,"props":2618,"children":2620},{"className":2619},[1965],[2621],{"type":84,"tag":295,"props":2622,"children":2625},{"className":2623,"style":2624},[1970],"height:0.7401em;",[2626],{"type":84,"tag":295,"props":2627,"children":2629},{"style":2628},"top:-2.989em;margin-right:0.05em;",[2630,2635],{"type":84,"tag":295,"props":2631,"children":2634},{"className":2632,"style":2633},[1980],"height:2.7em;",[],{"type":84,"tag":295,"props":2636,"children":2638},{"className":2637},[1986,1987,1988,1989],[2639],{"type":84,"tag":295,"props":2640,"children":2642},{"className":2641},[418,1989],[2643],{"type":84,"tag":295,"props":2644,"children":2646},{"className":2645},[418,1989],[2647],{"type":90,"value":2377},{"type":84,"tag":295,"props":2649,"children":2652},{"className":2650,"style":2651},[428],"margin-right:0.2222em;",[],{"type":84,"tag":295,"props":2654,"children":2657},{"className":2655},[2656],"mbin",[2658],{"type":90,"value":2382},{"type":84,"tag":295,"props":2660,"children":2662},{"className":2661,"style":2651},[428],[],{"type":84,"tag":295,"props":2664,"children":2666},{"className":2665},[418,453],[2667],{"type":90,"value":2387},{"type":84,"tag":295,"props":2669,"children":2670},{"style":2049},[2671,2675],{"type":84,"tag":295,"props":2672,"children":2674},{"className":2673,"style":1981},[1980],[],{"type":84,"tag":295,"props":2676,"children":2678},{"className":2677,"style":2059},[2058],[],{"type":84,"tag":295,"props":2680,"children":2682},{"style":2681},"top:-3.677em;",[2683,2687],{"type":84,"tag":295,"props":2684,"children":2686},{"className":2685,"style":1981},[1980],[],{"type":84,"tag":295,"props":2688,"children":2690},{"className":2689},[418],[2691,2696,2700,2705,2709,2756,2760,2765,2769],{"type":84,"tag":295,"props":2692,"children":2694},{"className":2693},[418],[2695],{"type":90,"value":2359},{"type":84,"tag":295,"props":2697,"children":2699},{"className":2698,"style":2651},[428],[],{"type":84,"tag":295,"props":2701,"children":2703},{"className":2702},[2656],[2704],{"type":90,"value":2364},{"type":84,"tag":295,"props":2706,"children":2708},{"className":2707,"style":2651},[428],[],{"type":84,"tag":295,"props":2710,"children":2712},{"className":2711},[418],[2713,2718],{"type":84,"tag":295,"props":2714,"children":2716},{"className":2715},[418],[2717],{"type":90,"value":2372},{"type":84,"tag":295,"props":2719,"children":2721},{"className":2720},[2013],[2722],{"type":84,"tag":295,"props":2723,"children":2725},{"className":2724},[1959],[2726],{"type":84,"tag":295,"props":2727,"children":2729},{"className":2728},[1965],[2730],{"type":84,"tag":295,"props":2731,"children":2734},{"className":2732,"style":2733},[1970],"height:0.8141em;",[2735],{"type":84,"tag":295,"props":2736,"children":2738},{"style":2737},"top:-3.063em;margin-right:0.05em;",[2739,2743],{"type":84,"tag":295,"props":2740,"children":2742},{"className":2741,"style":2633},[1980],[],{"type":84,"tag":295,"props":2744,"children":2746},{"className":2745},[1986,1987,1988,1989],[2747],{"type":84,"tag":295,"props":2748,"children":2750},{"className":2749},[418,1989],[2751],{"type":84,"tag":295,"props":2752,"children":2754},{"className":2753},[418,1989],[2755],{"type":90,"value":2377},{"type":84,"tag":295,"props":2757,"children":2759},{"className":2758,"style":2651},[428],[],{"type":84,"tag":295,"props":2761,"children":2763},{"className":2762},[2656],[2764],{"type":90,"value":2382},{"type":84,"tag":295,"props":2766,"children":2768},{"className":2767,"style":2651},[428],[],{"type":84,"tag":295,"props":2770,"children":2772},{"className":2771},[418,453],[2773],{"type":90,"value":2387},{"type":84,"tag":295,"props":2775,"children":2777},{"className":2776},[2160],[2778],{"type":90,"value":2163},{"type":84,"tag":295,"props":2780,"children":2782},{"className":2781},[1965],[2783],{"type":84,"tag":295,"props":2784,"children":2787},{"className":2785,"style":2786},[1970],"height:0.7693em;",[2788],{"type":84,"tag":295,"props":2789,"children":2790},{},[],{"type":84,"tag":295,"props":2792,"children":2794},{"className":2793},[549,1950],[],{"type":84,"tag":295,"props":2796,"children":2798},{"className":2797,"style":2552},[549,1986,2040,2550,1989,2551],[2799],{"type":84,"tag":295,"props":2800,"children":2802},{"className":2801},[464,1988,1989],[2803],{"type":84,"tag":295,"props":2804,"children":2806},{"className":2805},[1989],[2807],{"type":90,"value":2414},{"type":84,"tag":295,"props":2809,"children":2811},{"className":2810},[2160],[2812],{"type":90,"value":2163},{"type":84,"tag":295,"props":2814,"children":2816},{"className":2815},[1965],[2817],{"type":84,"tag":295,"props":2818,"children":2820},{"className":2819,"style":2264},[1970],[2821],{"type":84,"tag":295,"props":2822,"children":2823},{},[],{"type":84,"tag":295,"props":2825,"children":2827},{"className":2826},[549,1950],[],{"type":84,"tag":93,"props":2829,"children":2830},{},[2831,2832,2838,2840,2846],{"type":90,"value":565},{"type":84,"tag":99,"props":2833,"children":2835},{"className":2834},[],[2836],{"type":90,"value":2837},"h = int(hex[0:8])",{"type":90,"value":2839}," (32-битное целое число из первых 8 символов hex). С одной оговоркой: если ",{"type":84,"tag":99,"props":2841,"children":2843},{"className":2842},[],[2844],{"type":90,"value":2845},"h mod 33 == 0",{"type":90,"value":2847},", множитель равен 1.00x (мгновенный краш), что создаёт примерно 1% перевес дома на Stake. Другие казино используют разные делители — 25 (Rainbet, примерно 4% перевеса), 50 (варианты с низким перевесом), 100 (очень низкий перевес).",{"type":84,"tag":93,"props":2849,"children":2850},{},[2851],{"type":90,"value":2852},"Запусти эту формулу миллион раз и получишь распределение, где ~50% раундов краша под 2x, ~10% проходят 10x, и может быть 1% достигают 100x. Ожидаемая ценность выходит 0.99 на 1 ставку — недостающий 1% — это перевес дома, встроенный в константы формулы, а не в манипуляцию отдельными раундами.",{"type":84,"tag":598,"props":2854,"children":2856},{"id":2855},"отображение-карт-перемешивание-колод",[2857],{"type":90,"value":2858},"Отображение карт (перемешивание колод)",{"type":84,"tag":93,"props":2860,"children":2861},{},[2862],{"type":90,"value":2863},"PF blackjack, покер и баккара перемешивают виртуальные колоды с использованием HMAC-SHA512 (более длинный выход = больше карт на вызов хэша). Стандартный алгоритм Fisher-Yates:",{"type":84,"tag":1298,"props":2865,"children":2868},{"className":2866,"code":2867,"language":90},[1301],"for i = 51 down to 1:\n  j = hmac_int(i) mod (i + 1)\n  swap(deck[i], deck[j])\n",[2869],{"type":84,"tag":99,"props":2870,"children":2871},{"__ignoreMap":1306},[2872],{"type":90,"value":2867},{"type":84,"tag":93,"props":2874,"children":2875},{},[2876,2878,2884,2886,2892],{"type":90,"value":2877},"Каждый вызов ",{"type":84,"tag":99,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":90,"value":2883},"hmac_int(i)",{"type":90,"value":2885}," использует 4 символа hex из 128-символного выхода SHA-512. Карты одного раунда полностью определены одним вызовом HMAC, поэтому PF-игры в blackjack часто показывают 13+ целых чисел в десятичном преобразовании на панели проверки — по одному за замену карты. Для конкретной реализации на Stake и BC.Game см. ",{"type":84,"tag":723,"props":2887,"children":2889},{"href":2888},"\u002Fblog\u002Fprovably-fair-blackjack",[2890],{"type":90,"value":2891},"руководство по Provably Fair blackjack",{"type":90,"value":730},{"type":84,"tag":85,"props":2894,"children":2896},{"id":2895},"традиционный-гсч-vs-provably-fair-гсч",[2897],{"type":90,"value":2898},"Традиционный ГСЧ vs Provably Fair ГСЧ",{"type":84,"tag":93,"props":2900,"children":2901},{},[2902],{"type":90,"value":2903},"На уровне ГСЧ конкретно (а не всего стека справедливости), PF — это строгий надмножество сертифицированного CSPRNG.",{"type":84,"tag":598,"props":2905,"children":2907},{"id":2906},"где-традиционные-гсч-отстают",[2908],{"type":90,"value":2909},"Где традиционные ГСЧ отстают",{"type":84,"tag":93,"props":2911,"children":2912},{},[2913,2915,2920],{"type":90,"value":2914},"Сертифицированные ГСЧ от eCOGRA, iTech Labs и GLI все криптографически безопасны — математика такая же сильная, как у PF. Проблема не в примитиве, а в ",{"type":84,"tag":126,"props":2916,"children":2917},{},[2918],{"type":90,"value":2919},"модели доверия во время выполнения",{"type":90,"value":377},{"type":84,"tag":605,"props":2922,"children":2923},{},[2924,2929,2934,2939],{"type":84,"tag":609,"props":2925,"children":2926},{},[2927],{"type":90,"value":2928},"Сертифицированный ГСЧ находится на сервере казино, проверяется один раз",{"type":84,"tag":609,"props":2930,"children":2931},{},[2932],{"type":90,"value":2933},"Ты никогда не видишь его выход напрямую, только конечное состояние игры",{"type":84,"tag":609,"props":2935,"children":2936},{},[2937],{"type":90,"value":2938},"Ничего не заставляет казино продолжать запускать сертифицированный код в боевой среде",{"type":84,"tag":609,"props":2940,"children":2941},{},[2942],{"type":90,"value":2943},"Спор по конкретному раунду невозможно разрешить в реальном времени",{"type":84,"tag":93,"props":2945,"children":2946},{},[2947],{"type":90,"value":2948},"Если сертифицированный слот-движок Pragmatic Play тихо запускает другой ГСЧ в боевой среде Roobet, чем тот, что тестировала eCOGRA, никакая проверка сертификата это не поймает. Зазор закрывается только с открытой проверкой каждый раунд.",{"type":84,"tag":598,"props":2950,"children":2952},{"id":2951},"что-pf-добавляет-к-примитиву",[2953],{"type":90,"value":2954},"Что PF добавляет к примитиву",{"type":84,"tag":93,"props":2956,"children":2957},{},[2958],{"type":90,"value":2959},"Provably Fair берет ту же криптографическую основу и открывает её. Конкретно:",{"type":84,"tag":605,"props":2961,"children":2962},{},[2963,2975,2980,2985],{"type":84,"tag":609,"props":2964,"children":2965},{},[2966,2968,2973],{"type":90,"value":2967},"Хэш серверного сида публикуется ",{"type":84,"tag":108,"props":2969,"children":2970},{},[2971],{"type":90,"value":2972},"до",{"type":90,"value":2974}," твоей ставки (обязательство)",{"type":84,"tag":609,"props":2976,"children":2977},{},[2978],{"type":90,"value":2979},"Твой клиентский сид участвует в входе HMAC (совместное подписание)",{"type":84,"tag":609,"props":2981,"children":2982},{},[2983],{"type":90,"value":2984},"Исходный серверный сид раскрывается после раунда (раскрытие)",{"type":84,"tag":609,"props":2986,"children":2987},{},[2988],{"type":90,"value":2989},"Вычисление детерминировано и воспроизводимо в любом браузере (проверка)",{"type":84,"tag":93,"props":2991,"children":2992},{},[2993,2995,3000],{"type":90,"value":2994},"Вот вся разница. Один и тот же HMAC, один и тот же CSPRNG — с четырьмя дополнительными слоями прозрачности сверху. Для более глубокого разбора того, как оба подхода соотносятся, см. ",{"type":84,"tag":723,"props":2996,"children":2997},{"href":725},[2998],{"type":90,"value":2999},"provably fair vs RNG certified",{"type":90,"value":730},{"type":84,"tag":85,"props":3002,"children":3004},{"id":3003},"блокчейн-случайность-chainlink-vrf-и-игры-в-сети",[3005],{"type":90,"value":3006},"Блокчейн-случайность — Chainlink VRF и игры в сети",{"type":84,"tag":93,"props":3008,"children":3009},{},[3010],{"type":90,"value":3011},"Provably Fair ГСЧ хорошо работает для централизованных крипто-казино. Но что насчет полностью децентрализованных приложений — лотерей в сети, назначения характеристик NFT, кубиков в сети? Здесь вступает в силу другое решение.",{"type":84,"tag":598,"props":3013,"children":3015},{"id":3014},"почему-блокчейны-не-могут-генерировать-безопасные-случайные-числа",[3016],{"type":90,"value":3017},"Почему блокчейны не могут генерировать безопасные случайные числа",{"type":84,"tag":93,"props":3019,"children":3020},{},[3021],{"type":90,"value":3022},"Каждый блокчейн детерминирован по замыслу — каждый валидатор должен получить одно и то же состояние из одних и тех же входов, иначе консенсус нарушается. Это делает случайность структурно сложной:",{"type":84,"tag":605,"props":3024,"children":3025},{},[3026,3037,3048,3059],{"type":84,"tag":609,"props":3027,"children":3028},{},[3029,3035],{"type":84,"tag":99,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":90,"value":3034},"block.timestamp",{"type":90,"value":3036}," контролируется майнером в пределах нескольких секунд",{"type":84,"tag":609,"props":3038,"children":3039},{},[3040,3046],{"type":84,"tag":99,"props":3041,"children":3043},{"className":3042},[],[3044],{"type":90,"value":3045},"block.blockhash",{"type":90,"value":3047}," может быть манипулирован майнерами, удерживающими блоки",{"type":84,"tag":609,"props":3049,"children":3050},{},[3051,3057],{"type":84,"tag":99,"props":3052,"children":3054},{"className":3053},[],[3055],{"type":90,"value":3056},"block.prevrandao",{"type":90,"value":3058}," (после слияния Ethereum) лучше, но всё ещё может быть смещен валидаторами",{"type":84,"tag":609,"props":3060,"children":3061},{},[3062,3064,3068],{"type":90,"value":3063},"Любой источник энтропии в сети может быть прочитан контрактом ",{"type":84,"tag":108,"props":3065,"children":3066},{},[3067],{"type":90,"value":2972},{"type":90,"value":3069}," того, как его использовать, что лишает смысла",{"type":84,"tag":93,"props":3071,"children":3072},{},[3073],{"type":90,"value":3074},"Наивные лотереи dApp, использовавшие blockhash, были в прошлом дренированы. Экономический стимул манипулировать джекпотом в $1M может заставить майнера рационально удерживать блок.",{"type":84,"tag":598,"props":3076,"children":3078},{"id":3077},"как-chainlink-vrf-это-решает",[3079],{"type":90,"value":3080},"Как Chainlink VRF это решает",{"type":84,"tag":93,"props":3082,"children":3083},{},[3084,3089],{"type":84,"tag":126,"props":3085,"children":3086},{},[3087],{"type":90,"value":3088},"Chainlink VRF",{"type":90,"value":3090}," (Verifiable Random Function) генерирует случайность вне сети и доставляет её в сеть с криптографическим доказательством. Процесс:",{"type":84,"tag":3092,"props":3093,"children":3094},"ol",{},[3095,3100,3105,3119,3124],{"type":84,"tag":609,"props":3096,"children":3097},{},[3098],{"type":90,"value":3099},"Смарт-контракт запрашивает случайное число",{"type":84,"tag":609,"props":3101,"children":3102},{},[3103],{"type":90,"value":3104},"Оракул Chainlink генерирует значение вне сети, используя свой приватный ключ + сид запроса",{"type":84,"tag":609,"props":3106,"children":3107},{},[3108,3110,3117],{"type":90,"value":3109},"Доказательство — это ",{"type":84,"tag":723,"props":3111,"children":3114},{"href":3112,"rel":3113},"https:\u002F\u002Fdocs.chain.link\u002Fvrf",[792],[3115],{"type":90,"value":3116},"BLS-подпись",{"type":90,"value":3118},", которую любой может проверить против публичного ключа оракула",{"type":84,"tag":609,"props":3120,"children":3121},{},[3122],{"type":90,"value":3123},"И значение, и доказательство публикуются обратно в сеть в одной транзакции",{"type":84,"tag":609,"props":3125,"children":3126},{},[3127],{"type":90,"value":3128},"Контракт проверяет доказательство перед использованием значения",{"type":84,"tag":93,"props":3130,"children":3131},{},[3132],{"type":90,"value":3133},"Критическое свойство: потому что доказательство связывает случайное значение с приватным ключом оракула и сидом запроса, оракул не может выбирать удобные значения. Любое отклонение математически обнаруживаемо.",{"type":84,"tag":598,"props":3135,"children":3137},{"id":3136},"когда-использовать-vrf-vs-hmac-базированный-pf",[3138],{"type":90,"value":3139},"Когда использовать VRF vs HMAC-базированный PF",{"type":84,"tag":145,"props":3141,"children":3142},{},[3143,3164],{"type":84,"tag":149,"props":3144,"children":3145},{},[3146],{"type":84,"tag":76,"props":3147,"children":3148},{},[3149,3154,3159],{"type":84,"tag":156,"props":3150,"children":3151},{},[3152],{"type":90,"value":3153},"Вариант использования",{"type":84,"tag":156,"props":3155,"children":3156},{},[3157],{"type":90,"value":3158},"Лучший выбор",{"type":84,"tag":156,"props":3160,"children":3161},{},[3162],{"type":90,"value":3163},"Почему",{"type":84,"tag":172,"props":3165,"children":3166},{},[3167,3185,3202,3219,3236],{"type":84,"tag":76,"props":3168,"children":3169},{},[3170,3175,3180],{"type":84,"tag":179,"props":3171,"children":3172},{},[3173],{"type":90,"value":3174},"Централизованные кубики\u002Fкраш",{"type":84,"tag":179,"props":3176,"children":3177},{},[3178],{"type":90,"value":3179},"HMAC-базированный PF",{"type":84,"tag":179,"props":3181,"children":3182},{},[3183],{"type":90,"value":3184},"Проще, дешевле, такие же гарантии",{"type":84,"tag":76,"props":3186,"children":3187},{},[3188,3193,3197],{"type":84,"tag":179,"props":3189,"children":3190},{},[3191],{"type":90,"value":3192},"Лотерея в сети",{"type":84,"tag":179,"props":3194,"children":3195},{},[3196],{"type":90,"value":3088},{"type":84,"tag":179,"props":3198,"children":3199},{},[3200],{"type":90,"value":3201},"Без доверия, без центрального оператора",{"type":84,"tag":76,"props":3203,"children":3204},{},[3205,3210,3214],{"type":84,"tag":179,"props":3206,"children":3207},{},[3208],{"type":90,"value":3209},"Назначение характеристик NFT",{"type":84,"tag":179,"props":3211,"children":3212},{},[3213],{"type":90,"value":3088},{"type":84,"tag":179,"props":3215,"children":3216},{},[3217],{"type":90,"value":3218},"Неманипулируемая редкость",{"type":84,"tag":76,"props":3220,"children":3221},{},[3222,3227,3231],{"type":84,"tag":179,"props":3223,"children":3224},{},[3225],{"type":90,"value":3226},"Централизованный блэкджек",{"type":84,"tag":179,"props":3228,"children":3229},{},[3230],{"type":90,"value":3179},{"type":84,"tag":179,"props":3232,"children":3233},{},[3234],{"type":90,"value":3235},"Chainlink VRF слишком дорого за карту",{"type":84,"tag":76,"props":3237,"children":3238},{},[3239,3244,3248],{"type":84,"tag":179,"props":3240,"children":3241},{},[3242],{"type":90,"value":3243},"DeFi-игра с большим джекпотом",{"type":84,"tag":179,"props":3245,"children":3246},{},[3247],{"type":90,"value":3088},{"type":84,"tag":179,"props":3249,"children":3250},{},[3251],{"type":90,"value":3252},"Риск манипуляции майнером слишком высок",{"type":84,"tag":93,"props":3254,"children":3255},{},[3256,3258,3264,3266,3272],{"type":90,"value":3257},"Большинство крипто-казино в 2026 году всё ещё используют HMAC-базированный PF, потому что он быстр, дешев и уже хорошо понят. VRF — это то место, где сияют децентрализованные игры DeFi, NFT и полностью децентрализованные игры. Наш рейтинг ",{"type":84,"tag":723,"props":3259,"children":3261},{"href":3260},"\u002Fblog\u002Fprovably-fair-bitcoin-games",[3262],{"type":90,"value":3263},"provably fair Bitcoin games",{"type":90,"value":3265}," специально фильтрует по тому, какую реализацию PF использует каждое казино.\nЕсли хочешь стресс-тестить эти концепции на живом казино, в ",{"type":84,"tag":723,"props":3267,"children":3269},{"href":3268},"\u002Fcasino\u002Fprovably-fair",[3270],{"type":90,"value":3271},"каталоге provably fair",{"type":90,"value":3273}," перечислены реализации, которые можно проверить без депозита — большинство публикуют хэши server seed на открытом эндпоинте.",{"type":84,"tag":85,"props":3275,"children":3277},{"id":3276},"уязвимости-rng-в-provably-fair",[3278],{"type":90,"value":3279},"Уязвимости RNG в Provably Fair",{"type":84,"tag":93,"props":3281,"children":3282},{},[3283],{"type":90,"value":3284},"Криптографически идеальный PF RNG всё равно может сломаться при плохой реализации. Вот что переживает проверку математики.",{"type":84,"tag":598,"props":3286,"children":3288},{"id":3287},"атака-на-смещённый-пул-сидов",[3289],{"type":90,"value":3290},"Атака на смещённый пул сидов",{"type":84,"tag":93,"props":3292,"children":3293},{},[3294],{"type":90,"value":3295},"Самая реалистичная атака — и одна из причин, почему ротация клиентского сида имеет значение.",{"type":84,"tag":93,"props":3297,"children":3298},{},[3299],{"type":90,"value":3300},"Нечестное казино заранее генерирует тысячи кандидатов на серверные сиды. Для каждого оно вычисляет исходы против распространённых паттернов клиентского сида (форматы браузера по умолчанию, частые слова). Оно развёртывает только те сиды, которые случайно дают больше проигрышей, чем побед против предсказуемых клиентских сидов.",{"type":84,"tag":93,"props":3302,"children":3303},{},[3304],{"type":90,"value":3305},"Каждый развёрнутый сид по-прежнему хеширует корректно до своего предварительно обязательного хэша. Математика commit-reveal проходит проверку. Но пул доступных сидов был отобран вишнёвым сбором до того, как любой игрок их увидел, и долгосрочное преимущество казино незаметно превышает заявленный RTP.",{"type":84,"tag":3307,"props":3308,"children":3310},"h4",{"id":3309},"почему-ротация-это-блокирует",[3311],{"type":90,"value":3312},"Почему ротация это блокирует",{"type":84,"tag":93,"props":3314,"children":3315},{},[3316,3318,3322],{"type":90,"value":3317},"Атаки на смещённые сиды требуют, чтобы казино знало твой будущий клиентский сид ",{"type":84,"tag":108,"props":3319,"children":3320},{},[3321],{"type":90,"value":2972},{"type":90,"value":3323}," фиксации серверного сида. Ротируй свой клиентский сид каждые 50–100 ставок и предварительные вычисления казино становятся бесполезными — оно зафиксировало серверный сид до того, как узнало новый клиентский сид, поэтому не может направлять исходы.",{"type":84,"tag":93,"props":3325,"children":3326},{},[3327,3329,3335],{"type":90,"value":3328},"Поэтому легитимные казино дают тебе ротировать мгновенно. PF казино, которое отказывается от ротации клиентского сида (или автоматически переделывает клиентский сид по собственному расписанию, а не твоему) — сигнализирует, что уязвимость открыта. Гайд ",{"type":84,"tag":723,"props":3330,"children":3332},{"href":3331},"\u002Fblog\u002Fclient-seed-vs-server-seed",[3333],{"type":90,"value":3334},"клиентский сид vs серверный сид",{"type":90,"value":3336}," охватывает весь workflow ротации.",{"type":84,"tag":598,"props":3338,"children":3340},{"id":3339},"слабые-источники-энтропии",[3341],{"type":90,"value":3342},"Слабые источники энтропии",{"type":84,"tag":93,"props":3344,"children":3345},{},[3346],{"type":90,"value":3347},"Если генерация серверного сида использует предсказуемую энтропию, протокол commit-reveal по-прежнему запускается, но атакующий может предсказать сиды.",{"type":84,"tag":3307,"props":3349,"children":3351},{"id":3350},"ловушка-mathrandom",[3352],{"type":90,"value":3353},"Ловушка Math.random",{"type":84,"tag":93,"props":3355,"children":3356},{},[3357,3359,3364],{"type":90,"value":3358},"JavaScript ",{"type":84,"tag":99,"props":3360,"children":3362},{"className":3361},[],[3363],{"type":90,"value":895},{"type":90,"value":3365}," — это вариант линейного конгруэнтного генератора. После наблюдения ~700 последовательных выходов атакующий может реконструировать полное внутреннее состояние и предсказать каждый последующий выход. Если PF казино использует Math.random для генерации серверного сида:",{"type":84,"tag":3092,"props":3367,"children":3368},{},[3369,3374,3379,3390],{"type":84,"tag":609,"props":3370,"children":3371},{},[3372],{"type":90,"value":3373},"Атакующий играет 700+ раундов, собирая каждый раскрытый серверный сид",{"type":84,"tag":609,"props":3375,"children":3376},{},[3377],{"type":90,"value":3378},"Атакующий реконструирует состояние PRNG",{"type":84,"tag":609,"props":3380,"children":3381},{},[3382,3384,3388],{"type":90,"value":3383},"Атакующий предсказывает следующий хэшированный серверный сид ",{"type":84,"tag":108,"props":3385,"children":3386},{},[3387],{"type":90,"value":2972},{"type":90,"value":3389}," его фиксации",{"type":84,"tag":609,"props":3391,"children":3392},{},[3393],{"type":90,"value":3394},"Атакующий ставит с полным знанием исхода",{"type":84,"tag":93,"props":3396,"children":3397},{},[3398,3400,3406,3408,3414],{"type":90,"value":3399},"Защита: казино должны использовать ",{"type":84,"tag":99,"props":3401,"children":3403},{"className":3402},[],[3404],{"type":90,"value":3405},"crypto.randomBytes(32)",{"type":90,"value":3407}," (Node.js), ",{"type":84,"tag":99,"props":3409,"children":3411},{"className":3410},[],[3412],{"type":90,"value":3413},"crypto.getRandomValues(new Uint8Array(32))",{"type":90,"value":3415}," (браузер) или аппаратный RNG. Разница — одна строка кода, но разрыв в безопасности полный.",{"type":84,"tag":598,"props":3417,"children":3419},{"id":3418},"красные-флаги-реализации",[3420],{"type":90,"value":3421},"Красные флаги реализации",{"type":84,"tag":93,"props":3423,"children":3424},{},[3425],{"type":90,"value":3426},"Короткий чеклист сигналов, что PF RNG небезопасен:",{"type":84,"tag":605,"props":3428,"children":3429},{},[3430,3435,3440,3445,3450,3455],{"type":84,"tag":609,"props":3431,"children":3432},{},[3433],{"type":90,"value":3434},"Нет кнопки ротации клиентского сида или ротация занимает >5 секунд",{"type":84,"tag":609,"props":3436,"children":3437},{},[3438],{"type":90,"value":3439},"Клиентский сид автоматически переделывается казино по их расписанию",{"type":84,"tag":609,"props":3441,"children":3442},{},[3443],{"type":90,"value":3444},"История серверного сида не показывает алгоритм или ширину слайса",{"type":84,"tag":609,"props":3446,"children":3447},{},[3448],{"type":90,"value":3449},"Инструмент верификации работает только на собственном сайте казино (не локально)",{"type":84,"tag":609,"props":3451,"children":3452},{},[3453],{"type":90,"value":3454},"Опубликованный алгоритм хеширования не указан — \"SHA-256 где-то\" недостаточно; нужна точная формула",{"type":84,"tag":609,"props":3456,"children":3457},{},[3458],{"type":90,"value":3459},"Раскрытые серверные сиды не совпадают с их предварительно зафиксированными хэшами ни в одном раунде",{"type":84,"tag":93,"props":3461,"children":3462},{},[3463,3465,3470],{"type":90,"value":3464},"Любой из этих флагов говорит, что заявление о PF — это маркетинговый лак поверх обычного RNG. Для сравнения сторон по сторонам, какие казино действительно публикуют свой PF код, см. рейтинг ",{"type":84,"tag":723,"props":3466,"children":3467},{"href":3260},[3468],{"type":90,"value":3469},"provably fair Bitcoin игр",{"type":90,"value":730},{"type":84,"tag":85,"props":3472,"children":3474},{"id":3473},"попробуй-сам-интерактивный-верификатор",[3475],{"type":90,"value":3476},"Попробуй сам — интерактивный верификатор",{"type":84,"tag":93,"props":3478,"children":3479},{},[3480],{"type":90,"value":3481},"Математика перестаёт быть абстрактной в момент, когда ты запускаешь её на своих сидах. Вставь любые четыре значения из панели справедливости твоего казино в верификатор ниже — всё выполняется в твоём браузере через Web Crypto API, никакие данные не отправляются на наш сервер.",{"type":84,"tag":3483,"props":3484,"children":3485},"inline-provably-fair-verifier",{},[],{"type":84,"tag":93,"props":3487,"children":3488},{},[3489],{"type":90,"value":3490},"Практический совет: если под рукой нет реальной ставки в PF казино, попробуй эти одноразовые тестовые значения, чтобы увидеть проверенный раунд:",{"type":84,"tag":605,"props":3492,"children":3493},{},[3494,3507,3518,3529],{"type":84,"tag":609,"props":3495,"children":3496},{},[3497,3499,3505],{"type":90,"value":3498},"Хэш серверного сида: ",{"type":84,"tag":99,"props":3500,"children":3502},{"className":3501},[],[3503],{"type":90,"value":3504},"bf3c0a9b0f4b3c8e8f4f0c5f0c4e8b7d8f3e2a1c9f6e3b7c4d5a8e2f9b1c6d3a",{"type":90,"value":3506}," (пример только — не совпадёт с реальными хэшами)",{"type":84,"tag":609,"props":3508,"children":3509},{},[3510,3512],{"type":90,"value":3511},"Серверный сид: ",{"type":84,"tag":99,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":90,"value":3517},"f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4",{"type":84,"tag":609,"props":3519,"children":3520},{},[3521,3523],{"type":90,"value":3522},"Клиентский сид: ",{"type":84,"tag":99,"props":3524,"children":3526},{"className":3525},[],[3527],{"type":90,"value":3528},"demo-player",{"type":84,"tag":609,"props":3530,"children":3531},{},[3532,3534],{"type":90,"value":3533},"Nonce: ",{"type":84,"tag":99,"props":3535,"children":3537},{"className":3536},[],[3538],{"type":90,"value":2000},{"type":84,"tag":93,"props":3540,"children":3541},{},[3542,3544,3550,3552,3557,3559,3565,3567,3573,3575,3581],{"type":90,"value":3543},"Результат показывает вердикт PASS \u002F FAIL на совпадение хэша плюс реконструированные исходы дайса и краша. Та же логика работает за ",{"type":84,"tag":723,"props":3545,"children":3547},{"href":3546},"\u002Fblog\u002Fprovably-fair-aviator-calculator",[3548],{"type":90,"value":3549},"Aviator provably fair калькулятором",{"type":90,"value":3551}," для crash-игры Spribe, и наш полный верификатор на ",{"type":84,"tag":723,"props":3553,"children":3554},{"href":3268},[3555],{"type":90,"value":3556},"provably fair хабе",{"type":90,"value":3558}," покрывает каждое мейнстримное PF казино. Для подбора размера ставок при известном RTP после подтверждения, что RNG легитимен, сочетай с нашим ",{"type":84,"tag":723,"props":3560,"children":3562},{"href":3561},"\u002Fcasino\u002Frtp-calculator",[3563],{"type":90,"value":3564},"RTP калькулятором",{"type":90,"value":3566},", ",{"type":84,"tag":723,"props":3568,"children":3570},{"href":3569},"\u002Fcasino\u002Fhouse-edge-calculator",[3571],{"type":90,"value":3572},"калькулятором преимущества казино",{"type":90,"value":3574}," и ",{"type":84,"tag":723,"props":3576,"children":3578},{"href":3577},"\u002Fcasino\u002Fbankroll-calculator",[3579],{"type":90,"value":3580},"калькулятором банкролла",{"type":90,"value":730},{"type":84,"tag":93,"props":3583,"children":3584},{},[3585,3590,3592,3597],{"type":84,"tag":126,"props":3586,"children":3587},{},[3588],{"type":90,"value":3589},"Суть:",{"type":90,"value":3591}," математика пуленепробиваема только если казино реально публикует хэш до ставки. Перепроверяй каждую реализацию через ",{"type":84,"tag":723,"props":3593,"children":3594},{"href":3268},[3595],{"type":90,"value":3596},"хаб provably fair",{"type":90,"value":3598}," — мы отмечаем, правильно ли площадка фиксирует seed и где выставлен хэш.",{"type":84,"tag":85,"props":3600,"children":3602},{"id":3601},"faq",[3603],{"type":90,"value":3604},"FAQ"]