Pilot Gift
Многопользовательская игровая платформа реального времени внутри Telegram (Telegram Mini App), построенная вокруг механики краш-игры и интегрированная с блокчейном TON и платежной системой Telegram Stars. В одном приложении объединены четыре игровых режима (краш Aviator, открытие кейсов, колесо-джекпот Roll и турнирный режим с распределением роялти), а также система рефералов, стейкинг, ежедневные задания и живые таблицы лидеров. Платформа работает на одном недорогом сервере и рассчитана на аудиторию до 5 миллионов пользователей при 5 тысячах одновременных онлайн-подключений.
Задача
Требовалось построить азартную игру реального времени, где сотни игроков одновременно видят синхронный рост множителя с задержкой в доли секунды, делают и отменяют ставки внутри живого раунда, забирают выигрыш в нужный момент, а исход каждого раунда поддается независимой проверке на честность. Ключевое бизнес-ограничение состояло в экономике проекта: платформа должна оставаться рентабельной, то есть выдерживать миллионы зарегистрированных пользователей и тысячи активных подключений без дорогой распределенной инфраструктуры (кластеров приложения, отдельного кэширующего слоя, брокеров очередей) и без расходов на мощный серверный парк.
Решение
В основу легло реалтайм-ядро на ASP.NET Core и SignalR с бинарным протоколом MessagePack. Игровая логика вынесена в единый серверный цикл раунда, который вычисляет кривую множителя один раз и транслирует ее всем подключенным клиентам одним широковещательным сообщением. Все состояние игры (ставки, подключения, участники турниров, джекпоты) хранится в оперативной памяти на потокобезопасных lock-free структурах, что убирает обращения к базе данных из горячего пути и держит отклик стабильным под нагрузкой.
Честность обеспечивается провабли-фейр схемой: сервер генерирует секретный seed, публикует его SHA-256 хеш до приема ставок, а точку краша вычисляет через SHA-512 от комбинации серверного и клиентских сидов с nonce и настраиваемым параметром сложности. Денежный контур закрывает интеграция депозитов и выводов в TON через TON Connect, покупок и выплат в Telegram Stars через инвойсы, с конвертацией по живому курсу TON к USD, депозит подарками Telegram Gifts.
Архитектура и сложности
Синхронизация множителя без роста нагрузки на сервер. Главная трудность реалтайм-игры в том, что наивная реализация рассылает обновления каждому клиенту персонально, и нагрузка растет линейно с числом зрителей. Здесь один игровой цикл вычисляет тик кривой и вещает его на всех через единый канал, поэтому стоимость одного тика остается постоянной независимо от того, смотрят раунд десять человек или пять тысяч. Дополнительно тики накапливаются и отправляются примерно раз в секунду, а бинарный MessagePack вместо JSON сокращает объем трафика на каждого клиента в разы.
Гонки данных при одновременных ставках и кэшаутах. Состояние ставок, подключений и участников держится на ConcurrentDictionary без блокировок, а критические денежные операции выполняются атомарно на стороне SQL, что исключает двойное списание и рассинхрон баланса при пиковой конкуренции.
Тяжелые агрегации по миллионам записей. Таблицы лидеров по выигрышам, билетам и стейкингу строятся по всей базе пользователей. Эти запросы вынесены в фоновые задания Quartz и пересчитываются раз в минуту в оперативную память, после чего отдаются из RAM. Дорогие сортировки по миллионам строк выполняются один раз в минуту вместо одного раза на каждый запрос клиента.
Развязка фоновых процессов и реалтайма. Админ-панель и фоновые задачи не дергают игровой хаб напрямую: они пишут сообщения в таблицы, а легкие воркеры разбирают эти очереди и веером рассылают события через SignalR. Это изолирует игровой цикл от внешних операций.
Холодный старт в мобильном вебвью Telegram. Чтобы сократить число сетевых обращений при запуске мини-приложения, на старте сервера CSS и JS бандлятся, минифицируются и инлайнятся прямо в HTML страницы.
Безопасность. Каждый вызов хаба проверяет подлинность пользователя верификацией Telegram initData по HMAC-SHA256 с токеном бота, что отсекает подделку запросов и подмену идентификатора.
Отдельным архитектурным решением стал сознательный отказ от распределенного бэкплейна и внешнего кэша в пользу одноузловой in-memory модели. Именно она дает нужную экономику: все, что обычно выносят в Redis и кластер, здесь живет в памяти процесса и масштабируется вертикально на одной машине.
Результат
- Код оптимизирован и протестирован под нагрузкой 5 миллионов пользователей и 5 тысяч одновременных онлайн-подключений на одном недорогом сервере, без распределенного кэша и без перехода на дорогое железо.
- Стоимость серверного тика множителя постоянна и не растет с числом зрителей, поэтому модель вещания поглощает рост онлайна без апгрейда инфраструктуры.
- Задержка синхронизации множителя удерживается в пределах долей секунды для всех клиентов одновременно.
- Таблицы лидеров по миллионам пользователей отдаются мгновенно из памяти, тяжелые запросы к базе выполняются раз в минуту вместо каждого клиентского обращения.
- Один бинарный канал обслуживает все игровые события (ставки, кэшауты, тики множителя, результаты раундов) сразу для четырех режимов.
- Реализованы провабли-фейр механика, две валюты (TON и Telegram Stars), депозит подарками Telegram Gifts, реферальная программа, стейкинг и турнирный режим с роялти в рамках единого приложения.
Стек
- Backend: C#, .NET 10, ASP.NET Core
- Реалтайм: SignalR с бинарным протоколом MessagePack
- Планировщик фоновых задач: Quartz.NET
- Доступ к данным: linq2db (высокопроизводительный микро-ORM) поверх Microsoft SQL Server
- Блокчейн и платежи: TON (TON Connect, tonweb), Telegram Stars, Telegram Bot API
- Криптография: SHA-256, SHA-512, HMAC-SHA256 для провабли-фейр и верификации initData
- Конкурентность: lock-free ConcurrentDictionary, in-memory state machine
- Фронтенд: Telegram Mini App (Telegram WebApp SDK), нативный JavaScript, рендер графика краша на canvas, Swiper, инлайн-бандлинг и минификация ассетов
