Перейти к содержимому
Gambl0dev
Все статьи
Криптовалюты4 мин чтения

Архитектура hot/cold кошельков для крипто-казино

Почему любое серьёзное крипто-казино разделяет кошелёк на горячий и холодный — и как спроектировать это разделение, не превратив эксплуатацию в боль.

Архитектура hot/cold кошельков для крипто-казино

Если вы строите софт крипто-казино с одним кошельком — вы построили обязательство, которое ждёт плохого дня. Это короткий, прямой гайд по разделению кошелька на горячий и холодный слои так, чтобы операторам не было больно жить.

Зачем вообще разделять

У одного кошелька два сценария отказа:

  1. Компрометация сервера выносит всю операцию. Приватные ключи лежат на том же железе, что и application-сервер. Любая уязвимость уровня приложения (инъекция, RCE, утечка env-переменных) — это событие на всю казну.
  2. Одна ошибка оператора заканчивает вечер. Опечатка в выводе, админка без 2FA, угнанная сессионная кука — любое из этого двигает все ваши монеты разом.

Разделение существует, чтобы ограничить худший случай. Горячий кошелёк держит ровно столько, сколько нужно для нормальной работы; всё сверх этого живёт в холодном хранилище, до которого application-сервер не дотягивается.

Скучная форма разделения

Архитектура неэффектная, и в этом весь смысл:

  • Горячий кошелёк — Подключён к приложению. Используется для входящих депозитов и исходящих выводов. Держит настраиваемый потолок, например MAX_HOT_BALANCE = max(2 × daily_withdrawal_p95, 0.5 BTC equivalent).
  • Sweep-задача — Запускается раз в N минут. Если горячий кошелёк превысил потолок — sweep излишка в холодное хранилище. Если упал ниже пола — алерт оператору на пополнение.
  • Холодный кошелёк — Оффлайн. Ключи на железе или в защищённом зашифрованном бэкапе. Трогается только людьми и нечасто.

Всё. Остальное — это параметры.

Как выбрать потолок

Потолок — единственное число, которое реально имеет значение. Слишком высокий — и ваша экспозиция ровно такая, от которой вы и пытались уйти. Слишком низкий — операционное трение: sweep стреляет постоянно, выводы тормозят в ожидании пополнения.

Разумные стартовые ориентиры:

  • Маленький оператор (< $10k дневного объёма): Hot ceiling $5k–10k.
  • Средний оператор ($10k–100k): Hot ceiling $30k–80k.
  • Крупные операторы: Считайте от своего распределения выводов.

Через две недели работы у вас будут данные для тюнинга. Первый месяц — это оценка; второй — уже решение.

Механика sweep, которую важно сделать правильно

Здесь операторов кусают три вещи. Каждую из них мы видели в проде:

  1. Слишком агрессивная частота sweep. Sweep каждые 30 секунд накручивает on-chain комиссии и создаёт шумный след в блокчейне. Раз в 5–15 минут — нормально.
  2. Sweep игнорирует gas/dust. Если sweep двигает "всё, что выше потолка", он рано или поздно начнёт sweep'ить dust-суммы, у которых комиссия больше, чем сама сумма. Поставьте минимальный размер sweep.
  3. Sweep блокирует выводы. Если задача вывода и задача sweep делят один лок на горячий кошелёк, sweep может голодом убить выводы. Используйте паттерн резервации: выводы резервируют свою сумму до того, как sweep считает потолок.

Флоу вывода внутри разделения

Выводы — это то, где прячется большая часть операционной боли. Мы используем трёхуровневую модель апрува:

  • Авто-апрув ниже порога T1. Идёт напрямую через горячий кошелёк. Idempotency key обязателен для защиты от double-spend.
  • Авто-апрув T1 < amount < T2 с доп. проверками. Аккаунт игрока должен быть старше X дней и иметь пройденный KYC.
  • Ручная проверка выше T2. Висит в очереди. Админ смотрит и апрувит; сама исходящая транзакция всё равно идёт по тому же идемпотентному code path.

Конкретные пороги зависят от объёма, но именно три уровня — это паттерн. Два — недотягивает; четыре — переусложняет.

Хардненинг горячего кошелька

Даже с ограниченным потолком ваш горячий кошелёк — мишень. Defense in depth:

  • Ключи никогда не лежат в plaintext env-переменных в проде. Мы шифруем их at rest ключом, производным от секрета, который знает только deploy pipeline.
  • Подписывающий компонент крутится в отдельном процессе от веб-сервера. HTTP-трафик никогда не видит материал для подписи.
  • Эндпоинты апрува вывода — admin-only и под rate-limit. 2FA обязательна на каждом админ-аккаунте.
  • Audit log на каждую исходящую транзакцию. Append-only. Tamper-evident.

Ничего экзотического. Просто те вещи, которые уже спасли реальных операторов из наших знакомых.

Эксплуатация холодного кошелька

Холодное хранилище должно быть неудобным. Это неудобство — фича, а не баг. На холодном кошельке вам нужны ровно две операции:

  • Приём sweep'ов. Без участия человека — горячий кошелёк подписывает исходящую, холодное хранилище принимает.
  • Пополнение горячего. А вот это уже человеческая церемония. Двое операторов на месте, один подписывает, второй сверяет суммы и адреса out-of-band. На каждое пополнение заводится тикет и фиксируется причина.

Держите церемонии пополнения редкими — раз-два в неделю это здорово. Ежедневно — значит ваш потолок слишком низкий или операция слишком тонкая.

Что мы поставляем из коробки

Наш софт крипто-казино выкатывается с этой архитектурой по умолчанию. Hot ceilings, частота sweep, минимальный размер sweep, пороги авто-апрува и алерты на пополнение — всё это параметры в админке. Вы не изобретаете это заново, вы это тюните.

Если вы прикидываете прикрутить свои крипто-рельсы внутри уже существующего казино — именно эту часть копируйте в деталях. Остальной код может быть как угодно неряшливый, и вы выживете. Ошибитесь с разделением кошелька — и один плохой вечер заканчивает операцию.

Вопросы по конкретной архитектуре? В Telegram быстрее, чем по почте — в рабочие часы обычно отвечаем за минуты.

Готовы к запуску?

Запустите казино, которое давно планируете.

То самое предложение, на котором построена эта статья. Демо — сегодня, договор — завтра.