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

После деплоя смарт-контракта начинается самое интересное: нужно понимать, что с ним происходит в реальном времени. Мы сталкивались с проектами, где мониторинг отсутствовал — и это приводило к потере средств. Без системы on-chain метрик вы узнаете о проблеме только когда пользователи начнут жаловатьс

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

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1451
  • 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 собственный стек обязателен.

Убытки от одной атаки могут быть огромными, а затраты на настройку мониторинга составляют малую долю. Получите консультацию по настройке мониторинга — свяжитесь с нами для аудита вашего проекта. Мы оценим ваш проект бесплатно.