Розробка казино Telegram Mini App
Telegram Mini Apps (TMA) для казино розташовуються на перетині трьох специфічних областей: обмеження платформи Telegram, вимоги механіки азартних ігор та крипто-інтеграція. Кожна з них вносить свої технічні обмеження. Основна складність не в написанні ігрової логіки—вона стандартна—а в реалізації чесної та верифіцируємої випадковості без довіри до сервера та інтеграції платежів у екосистему, де App Store та Google Play заборонені азартні ігри.
Telegram Mini App: Обмеження платформи
TMA працюють у WebView всередині Telegram. Це не повноцінний браузер: обмежена підтримка Web API, інша поведінка localStorage, особливості клавіатури та 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 — це просто азартна гра. З 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 як он-ланцюгова альтернатива
Для он-ланцюгових казино з Solidity: Chainlink VRF v2.5 надає верифіцируємі випадкові числа від оракула. Дорожче за газ, але криптографічно незаперечно:
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 блоки затримки між спіном та результатом. Для швидких ігор (слоти) це неприйнятно—користувачі чекають 30+ секунд. Гібридний підхід: серверна RNG з провably fair верифікацією для швидкості, он-ланцюгова для великих виплат.
Платежі та крипто-інтеграція
Telegram Stars
Нативна платіжна система Telegram—Telegram Stars. Працює через WebApp.openInvoice() та Telegram Payments API. Мінус для казино: Stars—це валюта в додатку, не реальні гроші, з обмеженими варіантами вилучення.
TON Блокчейн
Telegram глибоко інтегрований з TON. @tonconnect/ui-react — стандартна бібліотека для підключення TON гаманців (Tonkeeper, MyTonWallet) в TMAs:
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 у нанотонах
payload: '', // опціональні дані для контракту
}
]
})
}
TON смарт-контракти написані на FunC або Tact—не Solidity. Окрема крива навчання.
EVM через Telegram Wallet
Альтернатива: використовуйте Telegram Wallet (вбудований), який підтримує ETH. WalletConnect v2 технічно працює всередині TMA через глибокі посилання.
Ігровий рушій та UI
Для простих ігор (рулетка, dice, слоти)—CSS анімації достатньо. Для складної графіки—Phaser 3 або PixiJS працюють у TMA WebView. Будьте обережні з розміром пакета: Phaser ~1MB gzipped, критично для мобільного WebView.
Анімація слот-машини без важкого canvas:
// CSS-based слоти з requestAnimationFrame
const spinReels = (targetResults: number[]) => {
const duration = 2000 + Math.random() * 1000
// розташований стоп: перший барабан зупиняється раніше
reels.forEach((reel, i) => {
setTimeout(() => stopReel(reel, targetResults[i]), duration + i * 500)
})
}
Запобігання шахрайству та обмеження
- Обмеження частоти ставок (Redis з ковзаючим вікном)
- Максимальний розмір ставки відносно балансу казино (управління грошима)
- Виявлення мультиакаунтів через відбиток пристрою + кластеризація Telegram userId
- Обов'язковий KYC/геолокація для великих виплат (юридична вимога)
Архітектура
| Компонент | Технологія |
|---|---|
| Frontend | React/Next.js + @twa-dev/sdk |
| Платежі | TON Connect + Telegram Stars |
| Випадковість | Provably fair commit-reveal |
| Backend | Node.js + PostgreSQL + Redis |
| Он-ланцюгова (опц.) | Solidity + Chainlink VRF |
| Real-time | WebSocket (Socket.io) |
Часова шкала: мінімальне казино (dice + слоти, TON платежі, provably fair) — 4–6 тижнів. Повна платформа з декількома іграми, турнірами, системою реферального та он-ланцюговою верифікацією — 2–3 місяці.







