Система верификации игроков крипто-казино: модульная архитектура
Спроектировать систему верификации для крипто-казино — это найти баланс между анонимностью Web3 и требованиями регуляторов. Крипто-казино работают под двойным давлением: пользователи ценят приватность, а лицензирующие органы и платёжные партнёры требуют KYC, AML и проверку возраста. Это не просто юридическая формальность — архитектура должна обеспечивать compliance, не отпугивая аудиторию. Наш подход — модульная tiered-система, которая адаптируется под лицензию и регион. За 5+ лет в блокчейн-разработке мы реализовали более 30 KYC-решений под ключ для крипто-проектов, включая казино и обменники.
Как работает tiered-верификация? — разработка системы верификации
Не все игроки требуют одинаковой проверки. Tiered approach — стандарт для gambling:
| Уровень | Лимит | Требования | Время проверки |
|---|---|---|---|
| Tier 0 | до $500/мес | Email + wallet + auto AML | Мгновенно |
| Tier 1 | до $5,000/мес | Имя, дата рождения, страна | 1-2 мин |
| Tier 2 | до $50,000/мес | Government ID + liveness | 5-10 мин |
| Tier 3 | > $50,000/мес | Source of Funds, PEP | 1-2 дня |
Tier 0 (минимальный): электронная почта, подключение кошелька и автоматический AML-скрининг адреса через Chainalysis или Elliptic. Никаких документов, ответ моментальный. Tier 1 (базовый): имя, дата рождения, страна проживания. Автоматическая проверка по sanctions lists. Подтверждение аккаунта по email или SMS. Tier 2 (расширенный): government ID (паспорт, права), liveness check, адрес проживания. Используем Sumsub, Onfido или аналог. Tier 3 (enhanced due diligence): Source of Funds, Source of Wealth, расширенный PEP/Sanctions check, ручная проверка compliance-офицером.
Пример настройки уровней
В конфигурации задаются лимиты и требования для каждого tier. Например, для Tier 0 лимит по депозиту — 0.1 BTC/мес, для Tier 1 — 1 BTC. Уровни автоматически повышаются при достижении лимита.Какие AML-инструменты использовать?
Для казино критично: деньги из darknet markets или stolen funds — прямая ответственность платформы. Сравнение провайдеров:
| Провайдер | Тип мониторинга | Скорость | Кастомизация |
|---|---|---|---|
| Chainalysis KYT | Ончейн-транзакции | Реал-тайм | Высокая |
| Elliptic | Ончейн + офчейн | Реал-тайм | Средняя |
| Парсер OFAC | Статичные списки | Ежедневно | Полная |
Согласно Chainalysis KYT документации, категории риска включают darknet market, stolen funds, ransomware, sanctions. Для таких адресов — reject депозита и заморозка аккаунта. Grey zone (gambling, P2P exchange, mixing) требуют ручного review. Отдельно проверяем wallet-адреса в OFAC SDN List через Chainalysis или собственный парсер — список обновляется ежедневно.
Sumsub обрабатывает запросы в 3 раза быстрее, чем ручная верификация, а Chainalysis KYT выявляет подозрительные транзакции на 95% точнее статического OFAC-скрининга.
Интеграция Chainalysis KYT (Know Your Transaction)
async function screenAddress(address: string, asset: string): Promise<RiskScore> {
const response = await chainalysisClient.post('/v1/users', {
userId: address,
});
const transferResponse = await chainalysisClient.post('/v1/transfers', {
network: asset,
asset: asset,
transferReference: address,
direction: 'received',
});
return {
riskScore: transferResponse.data.riskScore,
cluster: transferResponse.data.cluster?.name,
category: transferResponse.data.cluster?.category,
};
}
Как интегрировать KYC-провайдера?
Sumsub — стандартный выбор для gambling
Sumsub предоставляет WebSDK для встроенного flow. Генерация токена на бэкенде:
async function getSumsubToken(applicantId: string): Promise<string> {
const timestamp = Math.floor(Date.now() / 1000);
const method = 'POST';
const url = `/resources/accessTokens?userId=${applicantId}&levelName=basic-kyc-level`;
const signature = crypto
.createHmac('sha256', SUMSUB_SECRET_KEY)
.update(timestamp + method + url)
.digest('hex');
const response = await axios.post(
`https://api.sumsub.com${url}`,
{},
{
headers: {
'X-App-Token': SUMSUB_APP_TOKEN,
'X-App-Access-Sig': signature,
'X-App-Access-Ts': timestamp,
}
}
);
return response.data.token;
}
// Frontend инициализация
import SumsubWebSdk from "@sumsub/websdk";
const sdk = SumsubWebSdk.init(
accessToken,
() => refreshToken(),
{
lang: "ru",
onMessage: (type, payload) => {
if (type === "idCheck.onApplicantStatusChanged") {
if (payload.reviewResult?.reviewAnswer === "GREEN") {
handleKYCApproved(payload.applicantId);
}
}
},
onError: (error) => console.error("Sumsub error:", error),
}
);
sdk.launch("#sumsub-container");
Важный момент — проверка подписи webhook, чтобы не принять поддельный callback:
function verifySumsubWebhook(req: Request): boolean {
const signature = req.headers['x-payload-digest'];
const secret = process.env.SUMSUB_WEBHOOK_SECRET;
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(req.rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
async function handleSumsubWebhook(payload: SumsubWebhookPayload) {
const { applicantId, reviewResult, type } = payload;
if (type === "applicantReviewed") {
if (reviewResult.reviewAnswer === "GREEN") {
await db.updateUserKYCStatus(applicantId, "APPROVED", reviewResult.reviewRejectType);
await updateUserTier(applicantId);
} else if (reviewResult.reviewAnswer === "RED") {
await db.updateUserKYCStatus(applicantId, "REJECTED", reviewResult.moderationComment);
await notifyUser(applicantId, "kyc_rejected");
}
}
}
Верификация возраста без документов
Для рынков, где документальный KYC неприемлем, используем Yoti Age Verification. Пользователь получает signed age token; казино видит только "старше 18". AgeID (UK стандарт) — аналогичный подход. Интеграция через OAuth 2.0: Yoti выступает identity provider.
Геоблокировка и IP-верификация
KYC не заменяет геоблокировку. Обязательные проверки:
async function checkPlayerEligibility(ip: string, walletAddress: string): Promise<EligibilityResult> {
const geoResult = await maxmindClient.country(ip);
const country = geoResult.country.isoCode;
if (BLOCKED_COUNTRIES.includes(country)) {
return { allowed: false, reason: 'geo_blocked', country };
}
const ipRisk = await ipqualityscore.check(ip);
if (ipRisk.vpn || ipRisk.proxy || ipRisk.tor) {
return { allowed: false, reason: 'vpn_detected' };
}
return { allowed: true, country };
}
Списки заблокированных стран определяются лицензией: Кюрасао, Мальта, Эстония — каждая со своим списком restricted jurisdictions.
Почему необходима ответственная игра?
Лицензированные казино обязаны реализовать функции responsible gambling:
- self-exclusion (блок от 1 дня до перманентного)
- deposit limits (дневные/недельные/месячные — уменьшение мгновенно, увеличение через cooling-off 24-72 часа)
- reality check (уведомление о времени и потерях)
- cooling-off period (временная пауза)
Эти меры не только соответствуют требованиям регуляторов, но и снижают риски негативного пользовательского опыта. Автоматизация ответственной игры — обязательный элемент compliance.
Процесс работы
- Аналитика: изучение требований лицензии и выбор провайдеров.
- Проектирование: архитектура KYC/AML, схема потоков.
- Интеграция: подключение Sumsub, Chainalysis, MaxMind, Yoti.
- Тестирование: регресс и нагрузка.
- Деплой и обучение compliance-команды.
Сроки
| Компонент | Срок |
|---|---|
| KYC tier system + Sumsub | 2-3 нед |
| AML screening + webhook | 1-2 нед |
| Геоблокировка + IP | 1 нед |
| Responsible gambling | 1-2 нед |
| Admin dashboard | 1-2 нед |
Полная compliance система — 6-10 недель. Экономия на автоматизации достигает 60% по сравнению с ручной верификацией. Стоимость рассчитывается индивидуально в зависимости от набора провайдеров и сложности интеграции.
Что входит в работу
- Архитектурная документация
- Интеграция провайдеров (Sumsub, Chainalysis, Yoti, MaxMind)
- Написание смарт-контрактов (при необходимости)
- Нагрузочное тестирование
- Обучение compliance-команды
- Поддержка на запуске
Получите оценку вашего проекта — свяжитесь с нами. Мы поможем подобрать провайдеров и оптимизировать бюджет. Закажите разработку системы верификации под ключ — обсудите детали с нашими инженерами.







