Stake Engine math-sdk
TL;DR
Open-source Python SDK от Stake.com для математики слотов по discrete-outcomes парадигме: оффлайн-симуляция → книги (books_<mode>.jsonl.zst) + lookup-table (lookUpTable_<mode>_0.csv) + index → публикация на Stake RGS, который на каждый /play просто сэмплит готовый раунд по весам. Включает Rust-оптимизатор весов под таргетную RTP.
Для нас полезен как методологический референс — мы не публикуем на Stake, а пишем real-time бэк на JS (см. slot backend architecture). Но идиомы Stake — BetMode + Distribution, criteria/quotas, force-records, repeat-cycle, multilayer wallet — мы заимствуем 1:1.
Назначение
- Описание правил слота (paytable, reels, special symbols, freegame triggers, win-mechanics) на Python.
- Симуляция миллионов раундов с детерминированным RNG-seed = simulation_id.
- Сегментация выборки по criteria (
wincap,freegame,0,basegame) с quotas и force-флагами. - Подбор весов lookup-table к таргетной RTP (Rust-оптимизатор).
- Генерация publish-артефактов в строгом формате Stake RGS.
Use case
| Кейс | Стоит брать? |
|---|---|
| Публикуем игру на Stake.com | Да — это официальный путь. |
| Прототипируем math для своего real-time бэка | Да, как референс. Гоняем на нём sample-игры, читаем код, заимствуем идиомы — но не используем артефакты на проде. |
| Делаем live progressive jackpot или tournament-pool | Нет — модель не поддерживает persistent state. |
| Хочется быстро итерировать math на проде (A/B math-конфигов) | Нет — каждый патч = full re-publish. |
| Нужна минимальная скорость прода без CPU на спин | Да (precomputed approach даёт это автоматически). |
Сильные стороны
- Полный pipeline «описал правила → получил cert-ready артефакты». Минимальный glue.
- Идеальный replay (id → книга), удобный для cert и dispute resolution.
- Dev-experience:
compression=False→ human-readable JSON-книги для прокликивания фронта на любом scenario. - Multithreading + Rust optimizer — миллионы симуляций реалистично за минуты.
- Sample-games (
0_0_lines,0_0_ways,0_0_cluster,0_0_scatter,0_0_expwilds) — рабочий референс по основным win-механикам. - Открытая лицензия (MIT).
Ограничения
- Vendor-lock на Stake RGS-формат:
index.json+jsonl.zst+ uint64-CSV — это контракт Stake. Свой RGS под этот формат можно сделать, но если возьмём другой — нужны конвертеры. - Только stateless-раунды: persistent meta-state между раундами не вписывается. Прогрессии, jackpots, мульти-сессионные миссии — нет.
- Каждый math-патч → full re-publish (десятки MB на mode).
- Python: для нашего JS-стека — отдельный runtime. Гоняем как референс CLI, не интегрируем в прод-сервис.
- Discrete probability quantization (uint64 веса): для очень редких событий вынуждены большие N симуляций.
- Возможность повторов раундов: при N симуляций каждый исход в среднем встречается раз в
N/weightраундов. SDK борется через quotas, но «полностью уникальный опыт» как у real-time не получить.
Лицензия и стоимость
- Лицензия: MIT.
- Стоимость: бесплатно. Сам RGS Stake — коммерческий, доступ через partnership с Stake.com.
Установка и базовый запуск
Требования: Python ≥3.12, pip; Rust + Cargo (для оптимизатора).
git clone https://github.com/StakeEngine/math-sdk.git
cd math-sdk
make setup # создаёт venv, ставит deps, editable install пакета
make run GAME=0_0_linesПосле запуска — артефакты в games/0_0_lines/library/:
library/
├── books/ # human-readable JSON (compression=False)
├── books_compressed/ # .jsonl.zst для prod-publish
├── configs/ # config_math.json, config_fe.json, config.json
├── forces/ # force_record_<mode>.json (анализ редких событий)
├── lookup_tables/ # lookUpTable_<mode>.csv + IdToCriteria, Segmented
└── publish_files/ # index.json + final compressed books + optimized lookUpTable
Параметры в games/<id>/run.py: num_threads, batching_size, compression, num_sim_args (число симуляций per mode), флаги run_sims/run_optimization/run_analysis.
Структура репо
math-sdk/
├── src/
│ ├── calculations/ # board, lines, ways, cluster, scatter, tumble, statistics
│ ├── config/ # Config, BetMode, Distribution, output_filenames
│ ├── events/ # event_constants, events.py (reusable event emitters)
│ ├── executables/ # GameExecutables (draw_board, run_freespin_from_base, emit_*)
│ ├── state/ # GeneralGameState, run_sims, books, state_conditions
│ ├── wins/ # WinManager (multilayer wallet), multiplier_strategy
│ └── write_data/ # write_configs, write_data, force.py
├── games/
│ ├── 0_0_lines/ # sample lines-game (5x3, 20 paylines)
│ ├── 0_0_ways/ # sample ways-game (5x3, 243 ways)
│ ├── 0_0_cluster/ # sample cluster-game (cascading)
│ ├── 0_0_scatter/ # sample scatter-pays (cascading)
│ ├── 0_0_expwilds/ # sample expanding-wilds + superspin mode
│ └── template/ # пустой скелет для нового game
├── optimization_program/ # Rust-оптимизатор весов lookup-table
├── docs/ # mkdocs-сайт
├── tests/ # pytest для win-калькуляций
└── utils/ # game_analytics (PAR sheet), rgs_verification (format checks)
Подробное руководство по архитектуре, win-механикам, optimization-алгоритму и заметки по портированию идиом на TypeScript/Node — в research-документе.
Что мы заимствуем как методологию
BetMode + Distribution: см. BetMode + Distribution.- Criteria + quota + repeat-cycle для устойчивых статистик: см. simulation methodology.
- Multilayer WalletManager с инвариантом: см. wallet manager pattern.
- Events как stream с типизированными dispatcher-функциями: см. events as stream.
- Force-records как аналитический хук: см. simulation methodology.
- Lookup-table optimization как опция для buy-bonus / superspin режимов: см. lookup-table optimization.
- Алгоритмы win-evaluation:
Альтернативы
- slot-math-engine (C#/.NET, commercial) — Monte Carlo + analytical RTP.
- Slot Designer (commercial GUI) — для math-prototypers без кода.
- Своя кодовая база на JS/TS — наш выбор, см. slot backend architecture.
Опыт использования
- 2026-05-13: репо склонирован в
~/work/sandbox/math-sdk, проанализирован по docs и sample0_0_lines. Артефакты не запускались (Python ≥3.12 + Rust setup пока не делали — нужны для запускаmake setup/make run).