Після деплою смарт-контракту починається найцікавіше: потрібно розуміти, що з ним відбувається в реальному часі. Ми стикалися з проектами, де моніторинг був відсутній — і це призводило до втрати коштів. Без системи 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 власний стек обов'язковий.
Збитки від однієї атаки можуть бути величезними, а витрати на налаштування моніторингу становлять малу частку. Отримайте консультацію з налаштування моніторингу — зв'яжіться з нами для аудиту вашого проекту. Ми оцінимо ваш проект.







