Интеграция крипто-казино в Telegram Mini App
Telegram Mini App для крипто-казино — это три отдельных технических задачи в одной: Telegram WebApp API, TON Connect для кошелька, и игровая логика с честными результатами. Самая частая ошибка — делать «случайность» на сервере без верифицируемого proof. Игрок не может проверить, честно ли сервер выбрал результат. Для доверия необходим либо Chainlink VRF (on-chain рандом), либо commit-reveal схема, либо провабли честная система (Provably Fair) с HMAC-SHA256.
Архитектура честного рандома
Provably Fair (off-chain, без газа)
Классическая схема для казино: сервер генерирует server_seed и публикует его SHA-256 хэш до начала раунда. Игрок предоставляет client_seed. Результат = HMAC_SHA256(server_seed, client_seed + nonce). После раунда сервер раскрывает server_seed — игрок проверяет что хэш совпадает с опубликованным.
// server-side: перед раундом
const serverSeed = crypto.randomBytes(32).toString('hex')
const serverSeedHash = SHA256(serverSeed).toString()
// публикуем serverSeedHash игроку
// после раунда: вычисление результата
function getResult(serverSeed: string, clientSeed: string, nonce: number): number {
const hmac = createHmac('sha256', serverSeed)
hmac.update(`${clientSeed}:${nonce}`)
const hash = hmac.digest('hex')
// берём первые 8 символов как hex число
const decimal = parseInt(hash.slice(0, 8), 16)
return (decimal % 10000) / 100 // 0-99.99
}
Игрок может верифицировать результат самостоятельно — это и есть провабли честность.
On-chain рандом через VRF (для высоких ставок)
Для больших выплат имеет смысл Chainlink VRF на TON или EVM сети. Запрос рандома — on-chain транзакция, результат публикуется в контракт. Нельзя подделать, нельзя переиграть.
Telegram Mini App инфраструктура
Инициализация и валидация
// Telegram WebApp SDK
const tg = window.Telegram.WebApp
tg.ready()
tg.expand() // раскрыть на весь экран
// Данные пользователя
const initData = tg.initData // строка для валидации на сервере
const user = tg.initDataUnsafe.user
Валидация на сервере обязательна — initData содержит HMAC-SHA256 подпись от Bot Token:
// server: валидация initData
import { createHmac } from 'crypto'
function validateTelegramWebAppData(initData: string, botToken: string): boolean {
const params = new URLSearchParams(initData)
const hash = params.get('hash')
params.delete('hash')
const dataCheckString = [...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
}
Никогда не доверяйте user.id без проверки hash — это главная уязвимость Mini App бэкендов.
TON Connect и депозиты
import { TonConnectUIProvider, TonConnectButton, useTonConnectUI, useTonAddress } from '@tonconnect/ui-react'
import { toNano } from '@ton/ton'
function DepositButton({ amount }: { amount: number }) {
const [tonConnectUI] = useTonConnectUI()
const address = useTonAddress(false) // raw адрес для сверки
async function deposit() {
const tx = {
validUntil: Math.floor(Date.now() / 1000) + 300,
messages: [{
address: CASINO_CONTRACT_ADDRESS,
amount: toNano(amount.toString()).toString(),
payload: buildDepositPayload(address), // BOC с user_id
}]
}
const result = await tonConnectUI.sendTransaction(tx)
// Ждём подтверждения через TON API
await waitForTx(result.boc)
}
}
Депозит на контракт, не на обычный кошелёк — контракт отслеживает балансы игроков on-chain. Вывод через контракт с подписью от игрока.
UI/UX специфика Telegram Mini App
Нативные компоненты
Telegram предоставляет нативные UI элементы через WebApp API:
// Главная кнопка в нижней части экрана
tg.MainButton.setText('Сделать ставку')
tg.MainButton.show()
tg.MainButton.onClick(() => placeBet())
// Haptic feedback при выигрыше/проигрыше
tg.HapticFeedback.notificationOccurred('success') // выигрыш
tg.HapticFeedback.notificationOccurred('error') // проигрыш
tg.HapticFeedback.impactOccurred('medium') // обычное действие
// Back button
tg.BackButton.show()
tg.BackButton.onClick(() => navigate(-1))
Haptic feedback — небольшая деталь, которая значительно улучшает ощущение игры на мобильном.
Цветовая схема
Mini App наследует тему Telegram пользователя:
const { colorScheme, themeParams } = tg
// colorScheme: 'light' | 'dark'
// themeParams.bg_color, .text_color, .button_color и т.д.
// В CSS переменные
document.documentElement.style.setProperty('--tg-bg', tg.themeParams.bg_color)
Анимации результатов
Для слотов/рулетки — CSS animations с requestAnimationFrame. Никаких тяжёлых canvas библиотек — Mini App должна загружаться за < 2 секунд. GSAP для анимаций — допустимо, Three.js — избыточно.
Backend архитектура
Telegram Bot (node-telegram-bot-api)
├── Обработка команд (/start, /balance)
└── Webhook → Mini App URL
Mini App Backend (Node.js/Fastify)
├── POST /validate — валидация initData
├── POST /bet — логика ставки
├── GET /history — история раундов
└── POST /withdraw — запрос на вывод
TON API (tonapi.io / toncenter.com)
└── Мониторинг транзакций на контракт
WebSocket для real-time обновлений баланса и результатов раундов — стандартный ws или socket.io. Polling как fallback если WebSocket блокируется корпоративными сетями.
Регуляторные риски
Крипто-казино работает в серой юрисдикции практически везде. Telegram может заблокировать Mini App за нарушение Terms of Service (gambling запрещено в большинстве регионов). Практика: геоблокировка по IP для запрещённых юрисдикций, отсутствие прямых упоминаний gambling в Bot/App description, работа через лицензированные юрисдикции (Curaçao, Isle of Man). Это юридический вопрос, но технически реализуется на уровне middleware.







