Обзор
Эта статья показывает, как в реальном времени стримить события ноды блокчейна — например, появление новых блоков и транзакций — из TRON Java-tron FullNode через встроенный механизм подписки на события по очереди сообщений ZeroMQ. В репозитории есть небольшие Node.js-скрипты, которые подписываются на нужные топики событий и выводят полученные сообщения в консоль.
Что получится в итоге:
- запущенный Nile FullNode с публикацией событий в ZeroMQ по адресу tcp://127.0.0.1:5555
- подписчик на новые блоки, который ловит и печатает триггеры новых блоков
- подписчик на транзакции, который ловит и печатает триггеры транзакций
Когда это полезно
Эта настройка полезна, если вам нужна собственная инфраструктура для отслеживания входящих переводов, построения индексаторов или запуска бэкенд-процессов без зависимости от стороннего hosted-провайдера. Для быстрого теста лучше сначала начать с событий по блокам. А логи контрактов имеет смысл включать уже после того, как ваша нода синхронизируется почти до актуальной высоты сети.
Структура проекта
Демонстрационное репозиторий выглядит следующим образом:
tron-event-subscription-demo/
block-watcher.js
transaction-watcher.js
package.json
package-lock.json
node_modules/
Репозиторий на GitHub: https://github.com/aziz1975/tron-event-subscription-demo
Как это работает (простое объяснение)
- Java-tron может публиковать триггеры (события) во встроенный ZeroMQ-паблишер, если на ноде включена подписка на события.
- Ваш Node.js-скрипт в этой схеме работает как ZeroMQ-подписчик (SUB socket).
- Вы подписываетесь на нужный топик — например, block или transaction.
- Каждый раз, когда нода публикует сообщение в этом топике, ваш скрипт получает его и выводит в консоль.
Два важных правила: (1) ноду должен быть запущен с флагом — es и (2) название топика вашего подписчика должно соответствовать теме, настроенной в config-nile.conf.
Предпосылки
- Рабочая сборка java-tron FullNode (FullNode.jar) и конфигурационный файл Nile.
- Node.js 22+
- npm dependencies: zeromq
Ваши зависимости от package.json:
{
“dependencies”: {
“zeromq”: “⁶.5.0”
}
}
Шаг 1: Настройте подписку на события Nile FullNode
Отредактируйте свой конфигурационный файл Nile (пример пути):
nano /data/tron/config/config-nile.conf
В файле config-nile.conf убедитесь, что блок event.subscribe присутствует и в нем включена нативная очередь:
event.subscribe = {
native = {
useNativeQueue = true
bindport = 5555
sendqueuelength = 1000
}
contractParse = true,
topics = [
{ triggerName = “block”, enable = true, topic = “block” },
{ triggerName = “transaction”, enable = true, topic = “transaction” },
{ triggerName = “contractevent”, enable = false, topic = “contractevent” },
{ triggerName = “contractlog”, enable = false, topic = “contractlog” },
{ triggerName = “soliditylog”, enable = false, topic = “soliditylog” } ]
filter = {
fromblock = “”
toblock = “latest”
contractAddress = [ “” ]
contractTopic = [ “” ]
}
}
Начните только с блоков и транзакций. Как только вы подтвердите, что конвейер работает, включите contractlog или soliditylog для переводов TRC20.
Шаг 2: Запустите FullNode с включенной подпиской на события
Из вашего каталога сборки java-tron запустите:
java -Xmx8g -jar build/libs/FullNode.jar \
-c /data/tron/config/config-nile.conf \
— es
Флаг --es обязателен. Без него нода будет работать в обычном режиме, но не будет публиковать события в ZeroMQ.
Шаг 3: Установка и запуск вотчеров на Node.js
Установите зависимости в демонстрационном репозитории:
npm install
Запустите вотчер блоков:
node block-watcher.js
Press enter or click to view image in full size
Запустите вотчер транзакций:
node transaction-watcher.js
Press enter or click to view image in full size
Полезные команды для диагностики и операционных задач
Проверьте процесс ноды и убедитесь, что она запущена с флагом --es:
ps -ef | grep FullNode.jar | grep -v grep
Убедитесь, что порт ZeroMQ прослушивает (должен отображаться java на 5555):
linux:
ss -ltnp | grep 5555
macOS:
netstat -anp tcp | grep 555
Проверьте высоту локального блока (ваш FullNode):
curl -s -X POST http://127.0.0.1:8090/wallet/getnowblock | jq ‘.block_header.raw_data.number’
Проверьте текущую высоту блока в публичной сети Nile (для сверки):
curl -s -X POST https://nile.trongrid.io/wallet/getnowblock | jq ‘.block_header.raw_data.number’
Найдите транзакцию в вашей локальной базе данных по txid:
TXID=”…”
curl -s -X POST http://127.0.0.1:8090/wallet/gettransactionbyid \
-H ‘content-type: application/json’ \
-d “{\”value\”:\”$TXID\”}” | jq ‘.raw_data.contract[0].type’
Если в ответ приходит null, значит ваша нода ещё не знает об этой транзакции. Для Nile это обычно признак того, что нода сильно отстала от сети и её лучше поднять из snapshot, чтобы быстрее догнать актуальную высоту.
Диагностика и устранение проблем
Триггеры новых блоков работают, а триггеры транзакций не приходят:
- Убедитесь, что топик транзакций включён в config-nile.conf.
- После любых изменений в конфиге обязательно перезапустите ноду и ещё раз убедитесь, что запуск идёт с флагом --es.
- Если нода сильно отстаёт от сети, вы можете получать меньше транзакционных событий, чем рассчитывали.
Никаких событий вообще
- Проверьте, что команда запуска ноды действительно содержит флаг --es.
- Проверьте, что 5555 порт действительно слушается (ss -ltnp | grep 5555).
- Проверьте версию клиента: ваш ZeroMQ subscriber должен работать на zeromq v5. В этом репо используется zeromq@5.3.1.
Заключение
Теперь у вас есть рабочая база для подписки на события TRON с использованием Java-tron и ZeroMQ. Начните с триггеров блоков и транзакций, затем включите другие топики. Те же принципы и рекомендации применимы к основной сети TRON при условии, что используются соответствующие конечные точки сети.
Полезные ссылки
- Подписка на события в Java-tron (топики, флаг --es и ZeroMQ): https://tronprotocol.github.io/documentation-en/architecture/event/
- Документация TRON для разработчиков и сетевые endpoint’ы: https://developers.tron.network/
- Демонстрационный репозиторий: https://github.com/aziz1975/tron-event-subscription-demo
Nile portal: https://nileex.io/