Проект: Сервис мониторинга блокчейна BNB Chain (BEP20)
Стек: Node.js, Web3/ethers, Aerospike, Docker
1. Цель проекта
Реализовать фоновый сервис (демон), который:
Получает данные по WebSocket от узла BNB Chain (с приоритетом нашей приватной ноды)
Мониторит входящие транзакции для указанных адресов:
Отправляет вебхуки при обнаружении транзакций
Имеет управляемый API для добавления/удаления адресов
Хранит состояние, адреса и мониторинговые данные в Aerospike
Работает устойчиво (failover), восстанавливается корректно
Запускается через docker-compose
2. Основной функционал
2.1 Мониторинг транзакций
3. API
3.1 Общие требования
3.2 Endpoints
| Метод | Путь | Описание |
|---|
| POST | /add | Добавить адрес в мониторинг |
| POST | /remove | Удалить адрес |
3.3 /add — запрос
{
"address": "0x123...",
"webhook": "https://my-webhook.site",
"contracts": [
"0xToken1...",
"0xToken2..."
]
}
Логика:
3.4 /remove — запрос
{
"address": "0x123..."
}
4. Хранение данных (Aerospike)
4.1 Watchlist (мониторинг адресов)
4.2 Синхронизация блоков
4.3 Таблица транзакций (для идемпотентности)
tx_hash
log_index или (tx_hash, address, direction)
timestamp
тип события (BNB / token)
адреса участников
контракт (если BEP20)
5. Логика обработки
5.1 Онлайн-режим (WebSocket)
5.2 Рестарт/обрыв WebSocket
Считываем last_processed_block
Получаем актуальный blockNumber
Догоняем блоки last_processed_block+1 ... current
Обрабатываем так же, как онлайн
Снова подключаемся по WebSocket
5.3 Идемпотентность
Уникальные ключи (tx_hash, log_index)
или (tx_hash, address, contract)
Повторная обработка блоков не вызывает дублей
6. Конфигурация / .env
# Основная приватная нода
WS_PRIMARY=wss://private-node-1
# Резервные публичные ноды
WS_SECONDARIES=wss://public-node-1,wss://public-node-2
# HTTP RPC для догоняния блоков
RPC_HTTP=https://private-http
API_KEY=...
CHAIN_ID=56
7. Отказоустойчивость
7.1 Алгоритм с приоритетом нашей ноды
Используем WS_PRIMARY
Если отвалилась — переходим на secondary
Проверяем доступность primary
Как только primary восстановилась — возвращаемся
Курсоры состояния не теряются
7.2 Без round-robin
7.3 Корректность данных
8. Docker
9. Требования к коду
10. Результаты проекта
Репозиторий с кодом
Документация по API
Документация по запуску
docker-compose.yml
Если нужно — могу:
Нарисовать диаграмму обработки токенов с условием contracts
Добавить в API метод /list
Сделать схему индексов для Aerospike