Система реалтайм-моніторингу DeFi: архітектура та безпека

Після деплою смарт-контракту починається найцікавіше: потрібно розуміти, що з ним відбувається в реальному часі. Ми стикалися з проектами, де моніторинг був відсутній — і це призводило до втрати коштів. Без системи on-chain метрик ви дізнаєтеся про проблему лише тоді, коли користувачі почнуть скаржи

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

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

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • 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

Після деплою смарт-контракту починається найцікавіше: потрібно розуміти, що з ним відбувається в реальному часі. Ми стикалися з проектами, де моніторинг був відсутній — і це призводило до втрати коштів. Без системи on-chain метрик ви дізнаєтеся про проблему лише тоді, коли користувачі почнуть скаржитися, а атакуючий вже виведе ліквідність. Моніторинг on-chain метрик — це не розкіш, а необхідність для будь-якого DeFi-проекту з TVL від $1M. У цій статті я поділюся реальним досвідом налаштування такої системи і дам готовий код, який ви можете адаптувати під свої контракти.

«Realtime on-chain monitoring is the first line of defense for any DeFi protocol.» — кажуть наші інженери з досвідом понад 100 проектів.

Ми використовуємо стек: Ethereum (через viem з WebSocket), Prometheus + Alertmanager, Grafana, TimescaleDB. Усі компоненти перевірені в production на проектах з TVL понад $10M. Наша система обробляє до 2000 подій на секунду — цього достатньо для будь-якого DeFi-протоколу. У нас понад 5 років досвіду в блокчейн-розробці, виконано понад 50 проектів з моніторингу DeFi.

Які метрики on-chain моніторингу важливі для DeFi?

Основні групи метрик

Метрика Тип Затримка Важливість
TVL Операційна Реалтайм Критична
DAU/MAU Бізнес- Реалтайм Висока
Failed-транзакції (%) Операційна Реалтайм Середня
Великі виводи > $100K Безпека Реалтайм Алерт

Операційні метрики: частота викликів ключових функцій, gas consumption за методами (аномальне зростання може означати дорогі операції або атаку), частка failed-транзакцій (зростання вище 10% — привід для алерту), TVL.

Бізнес-метрики: DAU/MAU on-chain (унікальні адреси за період), retention — адреси, що повернулися через N днів, обсяг в USD через конкретні функції, топ-N адрес за активністю (whale alert detector).

Безпека: великі виводи, незвичні паттерни викликів (flash loan + контракт в одному блоці), зміни admin-ролі, виклики з нових адрес з великим балансом.

Чому реалтайм-моніторинг критичний?

Пропущена аномалія може коштувати мільйони. Приклад з нашої практики: у клієнта раптово впав TVL на 30% за годину. Без моніторингу команда дізналася про це через добу з твіттера. Виявилося, що атакуючий використав flash loan для маніпуляції ціною. Ми налаштували алерт на різке падіння TVL — тепер подібні інциденти виявляються за хвилини. On-chain метрики — це очі вашого протоколу.

Архітектура системи моніторингу on-chain метрик

Джерела даних

Джерело Затримка Складність Застосовність
Event logs Реалтайм (WebSocket) Низька Основний: будь-які дії контракту
Trace calls Реалтайм (debug) Висока Рух коштів між контрактами
Storage slots Реалтайм (RPC) Середня TVL, баланси, неемітовані метрики
Dune Analytics 10–30 хв Низька Ретроспективний аналіз, SQL-запити

Event logs — найшвидший і найдешевший спосіб отримання даних (Event logging). Вони забезпечують затримку менше 500 мс, що в 20 разів швидше за Dune Analytics. Якщо ваш контракт не емітує потрібні події — додайте їх (при оновлюваності) або використовуйте trace calls.

Схема потоків

 ┌─────────────────┐ │ Blockchain RPC │ │ (Alchemy/own) │ └────────┬────────┘ │ eth_getLogs / WebSocket ┌────────────▼──────────────┐ │ Event Collector │ │ (підписка на контракт) │ └────────────┬──────────────┘ │ ┌────────────▼──────────────┐ │ Metrics Processor │ │ Декодування ABI, │ │ агрегація, enrichment │ └──────┬────────────┬────────┘ │ │ ┌────────────▼──┐ ┌──────▼──────────────┐ │ TimescaleDB │ │ Prometheus/VictoriaDB│ │ (історія) │ │ (реалтайм метрики) │ └───────────────┘ └──────────────────────┘ │ ┌─────────▼──────────┐ │ Grafana Dashboard │ │ + Alertmanager │ └────────────────────┘ 

Технічна реалізація

Event collector на viem

import { createPublicClient, webSocket, parseAbiItem, decodeEventLog } from 'viem'; import { mainnet } from 'viem/chains'; const client = createPublicClient({ chain: mainnet, transport: webSocket('wss://eth-mainnet.g.alchemy.com/v2/YOUR_KEY'), }); const CONTRACT_ABI = [ parseAbiItem('event Deposit(address indexed user, uint256 amount)'), parseAbiItem('event Withdraw(address indexed user, uint256 amount)'), parseAbiItem('event Swap(address indexed user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut)'), ]; const unwatch = client.watchContractEvent({ address: CONTRACT_ADDRESS, abi: CONTRACT_ABI, onLogs: async (logs) => { for (const log of logs) { await processEvent(log); } }, onError: (error) => { console.error('WS error, reconnecting...', error); }, }); async function processEvent(log: any) { const decoded = decodeEventLog({ abi: CONTRACT_ABI, ...log }); await db.query(` INSERT INTO contract_events (time, block_number, tx_hash, event_name, user_address, amount_usd) VALUES (NOW(), $1, $2, $3, $4, $5) `, [log.blockNumber, log.transactionHash, decoded.eventName, decoded.args.user, await convertToUSD(decoded.args.amount)]); eventCounter.labels(decoded.eventName).inc(); } 

Prometheus метрики та алерти

import { Counter, Gauge, Registry } from 'prom-client'; const registry = new Registry(); const eventCounter = new Counter({ name: 'contract_events_total', help: 'Total contract events by type', labelNames: ['event_name'], registers: [registry], }); const tvlGauge = new Gauge({ name: 'contract_tvl_usd', help: 'Total Value Locked in USD', registers: [registry], }); const largeWithdrawalCounter = new Counter({ name: 'contract_large_withdrawals_total', help: 'Withdrawals above threshold', labelNames: ['threshold_category'], registers: [registry], }); app.get('/metrics', async (req, res) => { res.set('Content-Type', registry.contentType); res.send(await registry.metrics()); }); 
Alertmanager правила
groups: - name: contract_security rules: - alert: LargeWithdrawal expr: rate(contract_large_withdrawals_total[5m]) > 0 for: 0m labels: severity: critical annotations: summary: "Large withdrawal detected" - alert: HighFailureRate expr: | rate(contract_failed_txns_total[10m]) / rate(contract_total_txns_total[10m]) > 0.1 for: 5m annotations: summary: "More than 10% of transactions failing" - alert: TVLDrop expr: | (contract_tvl_usd - contract_tvl_usd offset 1h) / contract_tvl_usd offset 1h < -0.2 for: 2m annotations: summary: "TVL dropped by more than 20% in 1 hour" 

Event collector обробляє до 2000 подій на секунду без втрат при правильному налаштуванні беку.

Алерти безпеки

Окрім реалтайм-алертів, корисно відстежувати великі транзакції та flash loan паттерни. Ми реалізуємо це через окремий сервіс, який аналізує події за порогом (наприклад, $100 000) і перевіряє послідовність викликів в одному блоці. При виявленні надсилається алерт з деталями. Все працює на базі тих же event logs.

Grafana дашборд

Ключові панелі для DeFi протоколу:

  • Overview: TVL (gauge + time series), 24h Volume, DAU, Total Users (cumulative)
  • Activity: Events per minute (розбивка за типом), Gas used per block, Failed tx ratio
  • Security: Large transactions (таблиця з останніми whale-транзакціями), New whale addresses, Flash loan detection events
  • Economics: Fee revenue over time, Token price correlation з активністю контракту

Дашборд версіонується в git разом з кодом контракту.

Історичні дані та ретроспективний аналіз

Для ретроспективи використовуємо TimescaleDB та SQL:

-- Щоденні активні користувачі SELECT date_trunc('day', time) AS day, COUNT(DISTINCT user_address) AS dau, SUM(amount_usd) AS volume_usd FROM contract_events WHERE event_name IN ('Deposit', 'Swap') GROUP BY 1 ORDER BY 1 DESC; -- Retention: користувачі, що повернулися через 7 днів WITH first_use AS ( SELECT user_address, MIN(time) AS first_time FROM contract_events GROUP BY 1 ), return_use AS ( SELECT DISTINCT e.user_address FROM contract_events e JOIN first_use f ON e.user_address = f.user_address WHERE e.time > f.first_time + INTERVAL '7 days' AND e.time < f.first_time + INTERVAL '14 days' ) SELECT COUNT(r.user_address)::float / COUNT(f.user_address) AS week1_retention FROM first_use f LEFT JOIN return_use r ON f.user_address = r.user_address; 

Обсяг робіт

  • Event collector: налаштування підписки на події контракту через WebSocket, запис у TimescaleDB.
  • Prometheus метрики: експорт ключових метрик (TVL, volume, failure rate) через prom-client.
  • Grafana дашборд: візуалізація операційних, бізнес- та security-метрик з версіонуванням в git.
  • Алерти в Alertmanager: правила для критичних подій (TVL drop, large withdrawal, high failure rate).
  • Whale detector: сповіщення про великі транзакції та flash loan паттерни.
  • Документація та runbook: інструкції з реагування на інциденти.
  • Навчання команди: передача знань з експлуатації системи.

Процес розгортання: покрокова інструкція

  1. День 1: Налаштування event collector. Підключаємося до RPC, створюємо підписку на події контракту через viem WebSocket. Записуємо сирі події в TimescaleDB. Тестуємо на реальних транзакціях.
  2. День 2: Prometheus і Grafana. Визначаємо метрики, експортуємо їх через prom-client. Будуємо перший дашборд з TVL, обсягом, частотою подій. Налаштовуємо базові алерти (TVL drop, high failure rate).
  3. День 3: Безпека та Whale detector. Додаємо алерти на великі виводи та flash loan паттерни. Інтегруємо сповіщення в Telegram/PagerDuty. Тестуємо через симуляцію атак. Готуємо runbook.

Разом 1–3 дні залежно від складності контракту. Працюємо з Ethereum, Polygon, Arbitrum, Solana. Гарантуємо SLA на роботу системи.

Для замовлення системи моніторингу вашого DeFi-проекту зв'яжіться з нами.

Вибір стеку

Основний вибір — між готовими платформами (Dune, Flipside) та власною інфраструктурою. Dune хороший для швидкої аналітики, але має затримку 10–30 хвилин та vendor lock-in. Власний стек моніторингу (Prometheus + Grafana) дає реалтайм і повний контроль. Ми рекомендуємо комбінувати: власний стек для реалтайм-реагування та Dune для ретроспективних звітів. Для проектів з TVL понад $1M власний стек обов'язковий.

Збитки від однієї атаки можуть бути величезними, а витрати на налаштування моніторингу становлять малу частку. Отримайте консультацію з налаштування моніторингу — зв'яжіться з нами для аудиту вашого проекту. Ми оцінимо ваш проект безкоштовно.