Разработка Telegram Mini App казино
Telegram Mini Apps (TMA) для казино — это пересечение трёх специфических областей: ограничения платформы Telegram, требования gambling механик, и крипто-интеграция. Каждая из них создаёт свои технические constraints. Основная сложность не в написании игровой логики — она стандартна — а в создании fair и verifiable randomness без доверия к серверу, и в интеграции платежей в экосистему, где App Store и Google Play запрещают gambling.
Telegram Mini App: платформенные ограничения
TMA работает в WebView внутри Telegram. Это не полноценный браузер: ограниченная поддержка Web APIs, другое поведение localStorage, особенности keyboard и viewport.
Инициализация и аутентификация
import WebApp from '@twa-dev/sdk'
// Инициализация при загрузке
WebApp.ready()
WebApp.expand() // разворачиваем на весь экран
// Данные пользователя — всегда проверять на сервере!
const initData = WebApp.initData // строка для отправки на сервер
const user = WebApp.initDataUnsafe.user // только для UI, не для auth
Верификация initData на сервере — обязательна. Данные подписаны HMAC-SHA256 с ботовым токеном:
// server: проверка подписи
import { createHmac } from 'crypto'
function verifyTelegramInitData(initData: string, botToken: string): boolean {
const params = new URLSearchParams(initData)
const hash = params.get('hash')
params.delete('hash')
const dataCheckString = Array.from(params.entries())
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n')
const secretKey = createHmac('sha256', 'WebAppData').update(botToken).digest()
const expectedHash = createHmac('sha256', secretKey).update(dataCheckString).digest('hex')
return hash === expectedHash
}
Без этой проверки любой может подделать userId и играть от имени другого пользователя.
Provably Fair: верифицируемая случайность
Казино без provably fair — это gambling casino. С provably fair — это честное казино, что принципиально с точки зрения доверия пользователей.
Commit-reveal схема
Стандартная реализация:
- Сервер генерирует
server_seed(секретный) и публикует его хэшserver_seed_hash = SHA256(server_seed)до начала игры - Пользователь предоставляет
client_seed(или сервер генерирует публично) - После игры сервер раскрывает
server_seed - Результат =
HMAC-SHA256(server_seed, client_seed + ":" + nonce)
// Генерация результата
import { createHmac } from 'crypto'
function getGameResult(serverSeed: string, clientSeed: string, nonce: number): number {
const combined = `${clientSeed}:${nonce}`
const hash = createHmac('sha256', serverSeed).update(combined).digest('hex')
// Первые 4 байта как uint32, нормализуем в [0, 1)
const decimal = parseInt(hash.slice(0, 8), 16)
return decimal / 0x100000000 // 4294967296
}
// Верификация пользователем (в браузере или через публичный верификатор)
// Пользователь знает server_seed (раскрыт после игры), client_seed, nonce
// и может воспроизвести тот же результат
Chainlink VRF как on-chain альтернатива
Для on-chain казино с Solidity: Chainlink VRF v2.5 предоставляет верифицируемо случайные числа из оракула. Дороже в gas, но математически неоспоримо:
contract CasinoGame is VRFConsumerBaseV2Plus {
mapping(uint256 => address) public requestToPlayer;
function spin(uint256 betAmount) external {
uint256 requestId = s_vrfCoordinator.requestRandomWords(
VRFV2PlusClient.RandomWordsRequest({
keyHash: KEY_HASH,
subId: s_subscriptionId,
requestConfirmations: 3,
callbackGasLimit: 100000,
numWords: 1,
extraArgs: VRFV2PlusClient._argsToBytes(
VRFV2PlusClient.ExtraArgsV1({ nativePayment: false })
)
})
);
requestToPlayer[requestId] = msg.sender;
}
function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) internal override {
address player = requestToPlayer[requestId];
uint256 result = randomWords[0] % 100; // 0-99
_settleGame(player, result);
}
}
Минус: 2–4 блока задержки между spin и результатом. Для казино с быстрыми играми (слоты) это неприемлемо — пользователь ждёт 30+ секунд. Гибрид: server-side RNG с provably fair верификацией для скорости, on-chain для крупных выплат.
Платежи и крипто-интеграция
Telegram Stars
Нативная платёжная система Telegram — Telegram Stars. Работает через WebApp.openInvoice() и Telegram Payments API. Минус для казино: Stars — это in-app currency, не реальные деньги, и вывод ограничен.
TON блокчейн
Telegram глубоко интегрирован с TON. @tonconnect/ui-react — стандартная библиотека для подключения TON кошельков (Tonkeeper, MyTonWallet) в TMA:
import { TonConnectButton, useTonAddress, useTonWallet } from '@tonconnect/ui-react'
import { toNano, Address } from '@ton/core'
// Депозит на контракт казино
const handleDeposit = async () => {
await tonConnectUI.sendTransaction({
validUntil: Date.now() + 5 * 60 * 1000,
messages: [
{
address: CASINO_CONTRACT_ADDRESS,
amount: toNano('1').toString(), // 1 TON в nanotons
payload: '', // опциональные данные для контракта
}
]
})
}
TON смарт-контракты пишутся на FunC или Tact — не Solidity. Отдельный learning curve.
EVM через Telegram Wallet
Альтернатива: использовать Telegram Wallet (встроенный) который поддерживает ETH. WalletConnect v2 технически работает внутри TMA через диплинки.
Игровой движок и UI
Для простых игр (рулетка, dice, slots) — CSS animations достаточно. Для сложной графики — Phaser 3 или PixiJS работают в TMA WebView. Но осторожно с bundle size: Phaser ~1MB gzipped, это критично для мобильного WebView.
Анимация слот-машины без heavy canvas:
// CSS-based slots с requestAnimationFrame
const spinReels = (targetResults: number[]) => {
const duration = 2000 + Math.random() * 1000
// staggered stop: первый барабан останавливается раньше
reels.forEach((reel, i) => {
setTimeout(() => stopReel(reel, targetResults[i]), duration + i * 500)
})
}
Антифрод и лимиты
- Rate limiting на ставки (Redis с sliding window)
- Максимальный размер ставки относительно баланса казино (bankroll management)
- Детекция мульти-аккаунтов через device fingerprint + Telegram userId кластеризация
- Обязательный KYC/геолокация для крупных выплат (юридические требования)
Архитектура
| Компонент | Технология |
|---|---|
| Frontend | React/Next.js + @twa-dev/sdk |
| Payments | TON Connect + Telegram Stars |
| Randomness | Provably fair commit-reveal |
| Backend | Node.js + PostgreSQL + Redis |
| On-chain (опц.) | Solidity + Chainlink VRF |
| Real-time | WebSocket (Socket.io) |
Сроки: минимальное казино (dice + слоты, TON платежи, provably fair) — 4–6 недель. Полноценная платформа с несколькими играми, турнирами, реферальной системой и on-chain верификацией — 2–3 месяца.







