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

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

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

Блокчейн інфраструктураСереднійвід 1 дня до 3 днів
Часті запитання

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

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

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1395
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142