Крипто-казино: архитектура депозитов и выводов

Представьте: ваш крипто-казино обрабатывает тысячи депозитов в день, но однажды из-за бага с идемпотентностью один пользователь получает двойное зачисление на $50 000. Или вывод средств зависает на 12 часов из-за неоптимальной очереди. Такие инциденты не только подрывают доверие, но и могут стоить л

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Представьте: ваш крипто-казино обрабатывает тысячи депозитов в день, но однажды из-за бага с идемпотентностью один пользователь получает двойное зачисление на $50 000. Или вывод средств зависает на 12 часов из-за неоптимальной очереди. Такие инциденты не только подрывают доверие, но и могут стоить лицензии. С более чем 8-летним опытом и 50+ реализованными проектами для клиентов из ЕС, Азии и СНГ мы гарантируем архитектурную надёжность — и знаем, как избежать этих проблем на уровне архитектуры.

Ниже разберём ключевые компоненты надёжной финансовой системы крипто-казино: internal ledger, hot/cold wallet, AML-проверка и регулярная сверка.

Почему internal ledger — основа надёжности?

Крипто-казино не хранит средства пользователей напрямую на блокчейне. Правильная архитектура — internal ledger (внутренняя бухгалтерская книга). Это стандарт для всех криптобирж и казино с многомиллионными оборотами. Double-entry bookkeeping — основа учёта (см. Wikipedia).

Преимущества этой схемы:

  • Мгновенные операции внутри системы (ставки, бонусы, переводы между играми) — без ожидания блокчейн-подтверждений.
  • Возможность дробных балансов ниже минимальной суммы транзакции.
  • Полный аудит каждой операции через double-entry ledger.

Double-entry ledger надёжнее простого учёта в разы: каждая операция имеет debit и credit, что исключает арифметические ошибки на уровне архитектуры. Риск расхождения балансов сводится к нулю при правильной реализации.

Как реализуется приём депозитов?

Вот пошаговый процесс:

  1. Генерация уникального депозитного адреса для каждого пользователя через HD Wallet.
  2. Обработка входящих транзакций: система ожидает заданное количество подтверждений (зависит от сети).
  3. Идемпотентное зачисление на внутренний баланс — повторная обработка блокируется на уровне БД.

Пример кода:

class DepositService: REQUIRED_CONFIRMATIONS = { "BTC": 2, "ETH": 12, "USDT_TRC20": 20, "SOL": 30, "BNB": 15, } async def get_deposit_address(self, user_id: str, currency: str) -> str: """Возвращает уникальный deposit address для пользователя""" existing = await self.address_repo.get(user_id=user_id, currency=currency) if existing: return existing.address address = await self.wallet_manager.generate_address(currency, user_id) await self.address_repo.save(user_id=user_id, currency=currency, address=address) return address async def on_incoming_transaction(self, tx: BlockchainTransaction): """Вызывается при каждой входящей транзакции""" address_record = await self.address_repo.find_by_address(tx.to_address, tx.currency) if not address_record: return deposit = PendingDeposit( user_id=address_record.user_id, currency=tx.currency, amount=tx.amount, tx_hash=tx.hash, required_confirmations=self.REQUIRED_CONFIRMATIONS.get(tx.currency, 12), current_confirmations=tx.confirmations, status="PENDING", ) await self.deposit_repo.save(deposit) async def on_confirmation_update(self, tx_hash: str, confirmations: int): deposit = await self.deposit_repo.get_by_tx(tx_hash) if not deposit or deposit.status != "PENDING": return if confirmations >= deposit.required_confirmations: await self.credit_user(deposit) async def credit_user(self, deposit: PendingDeposit): """Зачисляем на внутренний баланс (идемпотентная операция)""" async with self.db.transaction(): if await self.deposit_repo.is_credited(deposit.id): return await self.balance_repo.credit( user_id=deposit.user_id, currency=deposit.currency, amount=deposit.amount, reference=f"DEPOSIT:{deposit.tx_hash}", ) await self.deposit_repo.mark_credited(deposit.id) await self.notifier.send_deposit_confirmed( user_id=deposit.user_id, amount=deposit.amount, currency=deposit.currency, ) 

Внутренний учёт: double-entry ledger

Весь учёт средств — через ledger с double-entry. Каждая операция — кредит или дебет с reference на источник. Используем денормализованную таблицу для быстрого доступа к текущему балансу.

CREATE TABLE ledger_entries ( id BIGSERIAL PRIMARY KEY, entry_time TIMESTAMPTZ NOT NULL DEFAULT NOW(), user_id UUID NOT NULL, currency VARCHAR(16) NOT NULL, amount NUMERIC(24, 8) NOT NULL, balance_after NUMERIC(24, 8) NOT NULL, type VARCHAR(32) NOT NULL, reference_id VARCHAR(64), description VARCHAR(255), INDEX(user_id, currency, entry_time DESC) ); 

Текущий баланс пользователя вычисляется как сумма записей, но для производительности хранится в отдельной таблице с проверками balance >= locked.

Как работает вывод средств?

class WithdrawalService: MIN_WITHDRAWAL = { "BTC": Decimal("0.0001"), "ETH": Decimal("0.005"), "USDT_TRC20": Decimal("5"), } async def request_withdrawal(self, user_id, currency, amount, destination_address): if amount < self.MIN_WITHDRAWAL.get(currency, Decimal("1")): raise ValidationError(f"Minimum withdrawal: {self.MIN_WITHDRAWAL[currency]} {currency}") user_balance = await self.balance_repo.get_balance(user_id, currency) if user_balance.available < amount: raise InsufficientFundsError() if not self.validate_address(destination_address, currency): raise ValidationError("Invalid destination address") aml_result = await self.aml_service.check_address(destination_address, currency) if aml_result.risk_score > 7: raise ComplianceError("Destination address failed AML check") async with self.db.transaction(): await self.balance_repo.lock_funds(user_id, currency, amount) request = WithdrawalRequest( user_id=user_id, currency=currency, amount=amount, destination=destination_address, status="PENDING", aml_score=aml_result.risk_score, ) await self.withdrawal_repo.save(request) await self.withdrawal_queue.enqueue(request.id) return request async def process_withdrawal(self, request_id): request = await self.withdrawal_repo.get(request_id) if request.amount_usd > 10_000: if not request.manual_approved: await self.notify_compliance_team(request) return try: tx_hash = await self.hot_wallet.send( currency=request.currency, to=request.destination, amount=request.amount - self.get_network_fee(request.currency), ) await self.withdrawal_repo.mark_sent(request.id, tx_hash) except InsufficientHotWalletFunds: await self.alert_treasury("Hot wallet needs refill") await self.withdrawal_repo.mark_queued(request.id) 

Hot/Cold Wallet управление

Hot wallet — онлайн кошелёк для обработки выводов. Должен содержать только операционный запас: 15–20% суммарных средств пользователей. Cold wallet — офлайн хранение. Multi-signature (3-из-5 ключей), ключи хранятся у разных ответственных лиц. Пополнение hot wallet — ручной процесс с несколькими подписями.

Характеристика Hot Wallet Cold Wallet
Доступ 24/7 онлайн Офлайн, подключается по необходимости
Доля средств 15-20% 80-85%
Подпись Один ключ (или 2FA) Multi-signature (3 из 5)
Скорость вывода Мгновенно Требуется ручное перемещение
Риск взлома Выше, но сумма ограничена Минимальный
class HotWalletManager: TARGET_BALANCE_PCT = 0.15 LOW_BALANCE_THRESHOLD_PCT = 0.05 async def check_balance_health(self, currency): hot_balance = await self.get_hot_wallet_balance(currency) total_user_balances = await self.balance_repo.get_total_user_balance(currency) ratio = float(hot_balance / total_user_balances) if total_user_balances > 0 else 1.0 if ratio < self.LOW_BALANCE_THRESHOLD_PCT: await self.alert_treasury( f"Hot wallet {currency} low: {ratio:.1%} of user balances. " f"Refill needed: {total_user_balances * Decimal('0.15') - hot_balance:.4f} {currency}" ) 

Reconciliation: защита от расхождений

Ежедневно сверяем внутренние балансы с реальными блокчейн-данными. Любая ошибка в коде или злоупотребление мгновенно обнаруживается. Автоматическая система оповещает фин-отдел при расхождении более 0.0001 единицы валюты. За всё время работы мы не допустили ни одной финансовой потери у клиентов благодаря этой системе. Наши системы обрабатывают до 50 000 транзакций ежедневно с 99.99% аптаймом.

Какие сети блокчейнов поддерживаются?

Мы поддерживаем Ethereum, Polygon, Arbitrum, Optimism, Base, Solana, BNB Chain, а также USDT на TRC20 и ERC20. По запросу добавляем любую EVM-совместимую сеть. В таблице ниже указаны минимальные суммы вывода и количество подтверждений для каждой сети.

Сеть Минимальный вывод Подтверждения
Bitcoin 0.0001 BTC 2
Ethereum 0.005 ETH 12
USDT TRC20 5 USDT 20
Solana 0.01 SOL 30
BNB Chain 0.01 BNB 15
Что входит в работу
  • Архитектура internal ledger с double-entry и idempotency.
  • Генерация уникальных депозитных адресов через HD Wallet.
  • Обработка входящих транзакций с настраиваемым числом подтверждений.
  • Вывод средств с интеграцией AML-проверки и очереди задач.
  • Hot/cold wallet управление с алертами.
  • Система ежедневной сверки.
  • Документация API и бэкап-стратегия.
  • Техническая поддержка на этапе запуска.

Как получить надёжную систему?

Закажите аудит вашей системы — мы выявим уязвимости. Свяжитесь с нами, чтобы обсудить интеграцию и получить консультацию.