Home指南API 参考手册
指南API 参考手册社区Discord博客FAQ漏洞赏金公告中心English(英文版)Log In
指南

事件订阅

TRON 提供多种方式帮助开发者获取链上事件信息,开发者可根据实际需求选择适合的方案:

  1. TronGrid
    TronGrid 封装了事件插件接口,提供了开放、易用的 HTTPS 查询服务。
  2. TronWeb
    Tron 官方提供的 JavaScript 开发库,内置事件查询方法,便于前端或 Node.js 环境下获取事件。注:仅限主网和测试网,不支持私链网络中的事件查询。
  3. 本地事件插件订阅
    通过本地部署事件插件,订阅链上实时或历史事件。
    • 支持插件类型:Kafka、MongoDB
    • 可订阅数据类型:区块、交易、合约、合约日志等
    • 支持灵活设置过滤条件,精准订阅
    • 可结合 tron-eventquery 服务,提供在线事件查询功能
  4. 内置消息队列订阅
    通过 Java-Tron 内置消息队列(ZeroMQ)订阅事件,无需额外部署插件。

本文主要介绍通过本地搭建节点和事件插件的方式来订阅事件。

事件服务框架

Tron 提供了完善的事件服务机制,支持开发者通过自定义事件插件,实时接收并处理链上事件。

事件服务会从区块链获取事件信息,经过封装后写入事件缓存队列,供插件模块异步消费。插件在接收到事件数据后,可以根据具体业务需求,将数据写入数据库、消息队列或其他目标系统,供上层应用进一步使用。

目前,Java-Tron 提供两种版本的事件服务框架:V1.0 和 V2.0。
相较于 V1.0,V2.0 的核心改进在于支持历史事件回溯推送,可以满足用户订阅历史区块事件数据的需求。V1.0 仅支持实时事件推送,事件只能在新区块被处理时即时推送给订阅者,无法获取历史区块中的事件信息。

关于两种版本的详细区别及版本选择建议,请参考 事件服务框架V2.0介绍

如果需要将现有系统从 V1.0 迁移至 V2.0,请参阅 如何迁移到新版事件服务章节。

插件

事件插件的作用是实现链上事件的转储,开发者可以根据实际需求自定义插件,例如将事件写入消息队列(如 Kafka)、数据库(如 MongoDB)或本地文件。

目前,TRON 官方提供了两种事件订阅插件的参考实现:Kafka 插件 和 MongoDB 插件。开发者可根据自身业务需求,选择合适的插件实现事件订阅。

事件类型

TRON 支持多种类型的事件订阅,开发者可以通过修改配置文件,灵活订阅所需的事件类型。目前支持以下四种事件类型:

1.交易事件

transactionId: 交易哈希
blockHash: 区块哈希
blockNumber: 区块高度
energyUsage: 此次调用中,合约调用者消耗的Energy的总量
energyFee: 此次调用中,合约调用者消耗的Energy中,需要TRX支付的数目(SUN为单位)
originEnergyUsage: 此次调用中,合约开发者消耗的Energy的总量
energyUsageTotal: 此次调用中,合约调用者和合约开发者消耗的Energy的总量

2.区块事件

blockHash: 区块哈希
blockNumber: 区块高度
transactionSize: 区块中包含的交易的数目
latestSolidifiedBlockNumber: 最新的固化块的高度
transactionList: 交易哈希列表

3.合约事件

transactionId: 交易哈希
contractAddress: 合约地址
callerAddress: 合约调用者地址
blockNumber: 合约事件所在的区块高度
blockTimestamp: 区块时间戳
eventSignature: 事件签名
topicMap: the map of topic in solidity language
data: the data information in solidity language

4.合约日志事件

transactionId: 交易哈希
contractAddress: 合约地址
callerAddress: 合约调用者地址
blockNumber: 合约事件所在的区块高度
blockTimestamp: 区块时间戳
contractTopics: the list of topic in solidity language
data: the data information in solidity language
removed: 'true'代表日志已经被移除

合约事件与合约日志事件订阅支持过滤功能

fromBlock: 起始区块索引
toBlock: 结束区块索引
contractAddress: 合约地址
contractTopics: contract topics列表

更详细的信息参考事件订阅TIP

如何迁移至新版事件服务

迁移决策的关键考量

  1. 内部交易依赖
    V2.0 暂不支持内部交易日志的订阅功能,发送的TransactionLogTrigger 事件中的 internalTransactionList 字段将为空。如果业务依赖该字段,建议暂缓迁移,继续使用 V1.0。

  2. 插件版本兼容性
    建议升级至最新事件插件版本,提升消费速率与稳定性。历史事件同步过程中,事件数据量较大,老版本插件可能导致内存异常。

迁移步骤

一、编译新版插件

首先,用户需从 GitHub 仓库克隆 event-plugin 项目,并切换至master分支。然后,执行编译命令,生成新版插件对应的 .zip 文件,或者直接下载最新的release版本

git clone [email protected]:tronprotocol/event-plugin.git
cd event-plugin
git checkout master

./gradlew build  

二、配置使用新版事件服务

在 FullNode 的配置文件中,添加如下配置以启用新版事件服务:

event.subscribe.version = 1    # 1 means v2.0 , 0 means v1.0

三、配置事件订阅

新版事件服务的订阅配置方式与旧版保持一致,用户无需做额外修改。具体的配置方法可参考事件插件部署(MongoDB)事件插件部署(Kafka)

四、(可选)同步历史区块事件

新版事件服务支持从指定区块高度开始同步历史事件。用户可通过以下配置指定起始同步高度:

event.subscribe.startSyncBlockNum = <block_height>
  • startSyncBlockNum <= 0 表示历史事件同步功能已关闭。
  • startSyncBlockNum > 0 表示该功能已开启,历史事件将从指定的区块高度开始同步。

**注意: **

在重启节点之前,请务必确保已正确配置 startSyncBlockNum 参数。配置正确的节点在启动时将从指定的区块高度同步历史事件。配置错误可能会导致事件推送重复或遗漏,从而影响业务逻辑的准确性。

五、启动节点与插件

完成上述配置后,启动 FullNode 及相应的事件插件,即可完成向新版事件服务的迁移。其中,节点的启动命令如下:

java -jar FullNode.jar -c config.conf --es