Розробка callback/webhook сповіщень про криптоплатежі

Ви інтегруєте криптоплатежі, але блокчейн не може сам повідомити ваш бекенд. Доводиться опитувати ноду кожні 12 секунд — це 7200 RPC-запитів на годину на одну адресу. Для 1000 активних користувачів навантаження зростає до 7.2 млн запитів за годину, що виливається в десятки тисяч доларів щомісячно та

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

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1269
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    717
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1008

Ви інтегруєте криптоплатежі, але блокчейн не може сам повідомити ваш бекенд. Доводиться опитувати ноду кожні 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 необроблених завдань — надсилаємо алерт. Це гарантує, що жоден платіж не загубиться навіть при збої бази даних або мережі.

Процес розробки

  1. Аналіз вимог: типи подій, кількість адрес, SLA.
  2. Проектування архітектури: вибір провайдера, схема даних, retry-політика.
  3. Реалізація webhook endpoint з верифікацією підпису та чергою.
  4. Розробка ідемпотентного обробника та retry-механізму.
  5. Інтеграція з вашою платіжною системою.
  6. Тестування на тестовій мережі (Goerli, Sepolia).
  7. Деплой та моніторинг (Grafana + Prometheus).

Що входить в роботу

  • Документація по API webhook
  • Вихідний код з коментарями
  • Інструкція по розгортанню
  • Тестовий стенд
  • Підтримка протягом місяця після запуску

Терміни та вартість

Базовий webhook endpoint з верифікацією та чергою можна зробити за 1 день. Повноцінна система з retry, dead letter queue та дашбордом — 2–3 дні. Вартість розраховується індивідуально під ваш проект. Оцінимо задачу за 24 години — просто напишіть нам. Отримайте консультацію інженера з 10-річним досвідом у блокчейн-розробці.

Типові помилки

  • Не верифікувати підпис — будь-хто може надіслати фальшивий webhook.
  • Відповідати 200 після обробки — блокує чергу, погіршує пропускну здатність.
  • Не використовувати ідемпотентність — нарахування платежу двічі.
  • Ігнорувати retry для вихідних webhook — втрата даних.

Наша команда гарантує надійність та безпеку кожного рішення. Ми реалізували понад 50 інтеграцій платіжних систем на webhook. Якщо вам потрібна надійна система webhook-сповіщень — зв'яжіться з нами.