Мы разрабатываем системы крипто-донатов под ключ для стримеров, блогеров и благотворительных фондов. За пять лет работы мы столкнулись с десятками нюансов: от реоргов на Ethereum до пылевых атак на Solana. На первый взгляд задача простая: принять крипту от донатера. Но в потоке сразу несколько нетривиальных вопросов. Как показать статус в реальном времени? Как работать с разными сетями и токенами? Что делать с пылью (dust) после газа? И как не потерять донат при реорге сети? Ниже — проверенная архитектура, которую мы внедрили в 15+ проектах. Она позволяет принимать пожертвования в USDC, USDT, ETH и других токенах с комиссией на 30% ниже среднерыночной за счёт оптимизации газа и выбора L2.
Почему минимальная схема не подходит для масштаба?
Для разового или малообъёмного потока донатов не нужна сложная инфраструктура. Схема с одним адресом:
- Публикуете один адрес (ETH/BTC/SOL) на странице
- Webhook-мониторинг через провайдера (Alchemy Notify, Moralis, QuickNode)
- Webhook триггерит бэкенд → обновляет UI донатера в real-time
// Alchemy Notify webhook handler app.post('/webhook/donations', express.raw({type: 'application/json'}), async (req, res) => { const isValid = verifyAlchemySignature(req.body, req.headers['x-alchemy-signature'], WEBHOOK_SECRET) if (!isValid) return res.sendStatus(401) const payload = JSON.parse(req.body.toString()) for (const activity of payload.event?.activity || []) { if (activity.toAddress.toLowerCase() === DONATION_ADDRESS.toLowerCase() && activity.value > 0) { await db.donations.create({ txHash: activity.hash, fromAddress: activity.fromAddress, amount: activity.value, asset: activity.asset, status: 'pending' }) io.emit('new_donation', { amount: activity.value, asset: activity.asset }) } } res.sendStatus(200) }) Webhook надёжнее поллинга: провайдеры ретраят доставку при неудаче, и вы не пропустите транзакцию. Но эта схема ломается при высокой нагрузке: без очередей и статус-машины можно потерять донат из-за реорга или дублирования. Например, при реорге на Ethereum (глубина 1–2 блока) могут быть отменены донаты на сотни долларов — без статус-машины вы зачтете их, а потом не сможете откатить.
Как избежать потери донатов при реорге?
Мы строим статус-машину с четырьмя состояниями: detected (транзакция в mempool), confirming (включена в блок, ждём подтверждений), confirmed (достигнуто нужное число подтверждений), failed (реорг или dropped). Для ETH mainnet — 6 подтверждений, для L2 (Arbitrum, Base, Optimism) — 1–2 достаточно (finality у L2 быстрее, реорги редкие). Для BTC — 1 подтверждение для малых сумм, 3+ для крупных. Такая система защищает от потери донатов и не требует ручного вмешательства.
Как мы строим надёжную систему крипто-донатов?
Мы проектируем систему с нуля под ваш сценарий. Основные компоненты:
| Компонент | Технология | Назначение |
|---|---|---|
| Мониторинг блокчейна | Alchemy Notify / QuickNode Streams | Получение транзакций в реальном времени |
| Бэкенд | Node.js (Express) + Bull queue | Обработка, дедупликация, статус-машина |
| База данных | PostgreSQL | Хранение донатов, пользователей, виджетов |
| Real-time | Socket.io | Отправка уведомлений на виджеты и дашборд |
| Виджет | HTML/CSS/JS (сборка Webpack) | Кастомизируемый pop-up для OBS |
| Дашборд | React + Recharts | Статистика донатов, экспорт в CSV |
Подтверждения: когда считать донат полученным
Не считайте донат финальным по первому уведомлению. Мы реализуем статус-машину с настраиваемым числом подтверждений — это гарантирует, что вы не зачтёте отменённую транзакцию.
Виджет для стримеров / real-time уведомления
Самый частый сценарий: стример хочет получать крипто-донаты с pop-up уведомлением в OBS. Архитектура:
Blockchain → Webhook Provider → Backend API → WebSocket (Socket.io) → OBS Browser Source Виджет — HTML страница с WebSocket подключением:
<!-- OBS Browser Source URL: https://yourapp.com/widget?streamer_id=123 --> <script> const socket = io('wss://yourapp.com') socket.on('donation', (data) => { showDonationAlert(data.sender, data.amount, data.currency, data.message) }) </script> Мультивалютность без лишней сложности
Для небольшой системы — принимать USDC/USDT на нескольких сетях плюс нативный ETH. Это покрывает 90% аудитории. Давать донатеру выбор сети — ETH mainnet, Arbitrum, Base, Polygon — это снижает барьер (газ на L2 дешевле).
Идентификация донации по сети + адресу + токену:
def identify_donation(network: str, token: str, amount: float, tx_hash: str) -> Donation: usd_value = convert_to_usd(token, amount, network) return Donation( tx_hash=tx_hash, network=network, token=token, raw_amount=amount, usd_value=usd_value, confirmed=False ) Как добавить новую сеть в систему?
Пошаговая инструкция для вашего администратора:
- В дашборде выберите "Добавить сеть" и укажите RPC-эндпоинт (Infura, Alchemy, QuickNode).
- Укажите адрес кошелька для приёма донатов в этой сети.
- Настройте webhook на тот же URL, что и для других сетей (система автоматически определит сеть по chainId).
- Активируйте сеть — через минуту донаты начнут обрабатываться.
Что входит в работу
| Документ / Результат | Описание |
|---|---|
| Техническое задание | Описание архитектуры, выбор провайдеров и стека |
| Исходный код | Репозиторий с бэкендом, виджетом и дашбордом |
| Деплой | Настройка сервера, домена, SSL, CI/CD |
| Доступы к провайдерам | Alchemy/QuickNode, база данных, хостинг |
| Руководство по эксплуатации | Как добавлять сети, токены, настраивать виджет |
| Обучение команды | 2 часа консультации по администрированию |
| Поддержка | 1 месяц после запуска (баги, вопросы) |
Сроки и стоимость
Базовая система с одним кошельком, webhook и виджетом — 3–5 дней разработки. Полнофункциональная с мультивалютностью, дашбордом и поддержкой нескольких сетей — 1–2 недели. Стоимость рассчитывается индивидуально после брифа. Свяжитесь с нами для оценки вашего проекта — мы бесплатно проконсультируем и предложим оптимальную архитектуру. Наш опыт: 15+ внедрений, снижение газовых затрат до 40% за счёт использования L2 и пакетной обработки транзакций.







