Telegram: боты и Mini Apps

Pilot Gift

Многопользовательская игровая платформа реального времени внутри Telegram (Telegram Mini App), построенная вокруг механики краш-игры и интегрированная с блокчейном TON и платежной системой Telegram Stars. В одном приложении объединены четыре игровых режима (краш Aviator, открытие кейсов, колесо-джекпот Roll и турнирный режим с распределением роялти), а также система рефералов, стейкинг, ежедневные задания и живые таблицы лидеров. Платформа работает на одном недорогом сервере и рассчитана на аудиторию до 5 миллионов пользователей при 5 тысячах одновременных онлайн-подключений.
Telegram Mini Apps ASP.NET Core C#

Задача

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

Решение

В основу легло реалтайм-ядро на 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, инлайн-бандлинг и минификация ассетов
 
Сюда Туда