Вы интегрируете криптоплатежи, но блокчейн не может сам уведомить ваш бэкенд. Приходится опрашивать ноду каждые 12 секунд — это 7200 RPC-запросов в час на один адрес. Для 1000 активных пользователей нагрузка вырастает до 7.2 млн запросов за час, что выливается в десятки тысяч долларов ежемесячно и задержки до 30 секунд. А при перегрузке сети, как во время популярного mint'а, вы гарантированно теряете транзакции.
Webhook решает проблему: блокчейн-мониторинг сам отправляет HTTP-запрос на ваш сервер, когда происходит событие. Задержка снижается до 2–5 секунд, нагрузка на бэкенд падает на 95%. Мы построили десятки таких систем и знаем, как сделать их надежными.
Почему webhook лучше polling для криптоплатежей?
Polling — это постоянные RPC-запросы к ноде. Каждый запрос стоит денег и создает нагрузку. Webhook — push-модель: вы получаете уведомление сразу после включения транзакции в блок. Задержка минимальна, нагрузка на сервер снижается в разы. Для high-load проектов это единственный рабочий вариант. Например, одна наша клиентская биржа после перехода с polling на webhook сократила расходы на инфраструктуру на 40% и уменьшила среднее время подтверждения платежа с 15 до 3 секунд.
Как мы строим систему webhook-уведомлений
Используем проверенную архитектуру: мониторинг блокчейна → диспетчер webhook → ваша очередь задач. Мониторинг можно реализовать через сторонние сервисы (Alchemy Notify, Moralis Streams, QuickNode Streams) или собственный слушатель ноды. Мы обычно выбираем Alchemy за простоту и надежность. Вот пример создания webhook:
// Создание webhook через Alchemy API const response = await fetch('https://dashboard.alchemy.com/api/create-webhook', { method: 'POST', headers: { 'X-Alchemy-Token': process.env.ALCHEMY_AUTH_TOKEN!, 'Content-Type': 'application/json', }, body: JSON.stringify({ network: 'ETH_MAINNET', webhook_type: 'ADDRESS_ACTIVITY', webhook_url: 'https://yourapp.com/webhooks/crypto', addresses: ['0xYourAddress'], }), }) Как обеспечить идемпотентность обработки webhook?
Webhook-провайдеры гарантируют доставку at-least-once. Ваш обработчик должен быть идемпотентным — повторные уведомления не должны дублировать платежи. Мы используем INSERT ... ON CONFLICT DO NOTHING:
async function processPaymentWebhook(txHash: string, address: string, amountWei: bigint) { const result = await db.query(` INSERT INTO processed_webhooks (tx_hash, processed_at) VALUES ($1, NOW()) ON CONFLICT (tx_hash) DO NOTHING RETURNING id `, [txHash]) if (result.rowCount === 0) { return // уже обработано } await updatePaymentStatus(address, amountWei, txHash) } Retry-механизм для исходящих webhook
Если ваш сервис сам уведомляет клиентов через webhook, нужен надежный механизм повторных попыток. Мы используем экспоненциальный backoff с 10 попытками и фиксацией в dead letter queue. Пример обработки:
interface WebhookDelivery { id: string url: string payload: object attempt: number nextRetryAt: Date } async function deliverWebhook(delivery: WebhookDelivery): Promise<void> { try { const res = await fetch(delivery.url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Webhook-Signature': signPayload(delivery.payload), 'X-Webhook-ID': delivery.id, 'X-Webhook-Attempt': String(delivery.attempt), }, body: JSON.stringify(delivery.payload), signal: AbortSignal.timeout(10_000), }) if (!res.ok) { throw new Error(`HTTP ${res.status}`) } await db.markDelivered(delivery.id) } catch (err) { const nextAttempt = delivery.attempt + 1 if (nextAttempt > 10) { await db.markFailed(delivery.id, String(err)) return } const delayMs = Math.min(30_000 * Math.pow(2, nextAttempt - 1), 3_600_000) await db.scheduleRetry(delivery.id, nextAttempt, new Date(Date.now() + delayMs)) } } Схема retry: 10 попыток с экспоненциальным backoff достаточно для 99.7% доставок. Финальный провал — уведомить разработчиков через PagerDuty или Telegram, сохранить в dead letter queue.
Сравнение провайдеров мониторинга блокчейна
| Провайдер | Тип уведомлений | Количество адресов | Масштабируемость |
|---|---|---|---|
| Alchemy Notify | ADDRESS_ACTIVITY, MINED_TRANSACTION | до 10 бесплатно | Высокая, SLA 99.9% |
| Moralis Streams | Все события | без ограничений (тарифно) | Средняя, задержка до 10 сек |
| QuickNode Streams | ADDRESS_ACTIVITY, CONTRACT_EVENT | по запросу | Высокая, кастомные SLA |
Мы рекомендуем Alchemy для старта — он лучше документирован и стабилен. В среднем мы используем его в 70% проектов.
Типичные события webhook и их обработка
| Событие | Payload (упрощенно) | Типичная обработка |
|---|---|---|
| ADDRESS_ACTIVITY | txHash, адрес, сумма, блок | Зачислить платеж, обновить баланс |
| MINED_TRANSACTION | txHash, статус, газ | Обновить статус транзакции в БД |
| CONTRACT_EVENT | event.name, params, txHash | Вызвать соответствующую бизнес-логику |
Такая таблица помогает разработчикам быстро понять, какие данные приходят и что с ними делать.
Что делать при падении обработчика webhook?
Блокчейн-провайдеры не хранят события бесконечно. Если ваш endpoint упал, вы рискуете потерять уведомления. Поэтому мы проектируем систему с очередью задач (RabbitMQ, Redis, или Kafka) сразу за endpoint'ом. Если обработка падает, очередь сохраняет сообщение и повторяет попытку. Дополнительно мы настраиваем мониторинг: если очередь растет более 1000 необработанных задач — отправляем алерт. Это гарантирует, что ни один платеж не потеряется даже при сбое базы данных или сети.
Процесс разработки
- Анализ требований: типы событий, количество адресов, SLA.
- Проектирование архитектуры: выбор провайдера, схема данных, retry-политика.
- Реализация webhook endpoint с верификацией подписи и очередью.
- Разработка идемпотентного обработчика и retry-механизма.
- Интеграция с вашей платежной системой.
- Тестирование на тестовой сети (Goerli, Sepolia).
- Деплой и мониторинг (Grafana + Prometheus).
Что входит в работу
- Документация по API webhook
- Исходный код с комментариями
- Инструкция по развертыванию
- Тестовый стенд
- Поддержка в течение месяца после запуска
Сроки и стоимость
Базовый webhook endpoint с верификацией и очередью можно сделать за 1 день. Полноценная система с retry, dead letter queue и дашбордом — 2–3 дня. Стоимость рассчитывается индивидуально под ваш проект. Оценим задачу за 24 часа — просто напишите нам. Получите консультацию инженера с 10-летним опытом в блокчейн-разработке.
Типичные ошибки
- Не верифицировать подпись — любой может отправить фальшивый webhook.
- Отвечать 200 после обработки — блокирует очередь, ухудшает пропускную способность.
- Не использовать идемпотентность — начисление платежа дважды.
- Игнорировать retry для исходящих webhook — потеря данных.
Наша команда гарантирует надежность и безопасность каждого решения. Мы реализовали более 50 интеграций платежных систем на webhook. Если вам нужна надежная система webhook-уведомлений — свяжитесь с нами.







