Після деплою смарт-контракту починається найцікавіше: потрібно розуміти, що з ним відбувається в реальному часі. Ми стикалися з проектами, де моніторинг був відсутній — і це призводило до втрати коштів. Без системи 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: Налаштування event collector. Підключаємося до RPC, створюємо підписку на події контракту через viem WebSocket. Записуємо сирі події в TimescaleDB. Тестуємо на реальних транзакціях.
- День 2: Prometheus і Grafana. Визначаємо метрики, експортуємо їх через prom-client. Будуємо перший дашборд з TVL, обсягом, частотою подій. Налаштовуємо базові алерти (TVL drop, high failure rate).
- День 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 власний стек обов'язковий.
Збитки від однієї атаки можуть бути величезними, а витрати на налаштування моніторингу становлять малу частку. Отримайте консультацію з налаштування моніторингу — зв'яжіться з нами для аудиту вашого проекту. Ми оцінимо ваш проект безкоштовно.







