事件订阅
TRON 提供多种方式帮助开发者获取链上事件信息,开发者可根据实际需求选择适合的方案:
- TronGrid
TronGrid 封装了事件插件接口,提供了开放、易用的 HTTPS 查询服务。 - TronWeb
Tron 官方提供的 JavaScript 开发库,内置事件查询方法,便于前端或 Node.js 环境下获取事件。注:仅限主网和测试网,不支持私链网络中的事件查询。 - 本地事件插件订阅
通过本地部署事件插件,订阅链上实时或历史事件。- 支持插件类型:Kafka、MongoDB
- 可订阅数据类型:区块、交易、合约、合约日志等
- 支持灵活设置过滤条件,精准订阅
- 可结合 tron-eventquery 服务,提供在线事件查询功能
- 内置消息队列订阅
通过 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 插件。开发者可根据自身业务需求,选择合适的插件实现事件订阅。
- 插件的具体实现细节,请参考event-plugin源码。
- 插件的使用请参考事件插件部署(MongoDB)和事件插件部署(Kafka)。
事件类型
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。
如何迁移至新版事件服务
迁移决策的关键考量
-
内部交易依赖
V2.0 暂不支持内部交易日志的订阅功能,发送的TransactionLogTrigger事件中的internalTransactionList字段将为空。如果业务依赖该字段,建议暂缓迁移,继续使用 V1.0。 -
插件版本兼容性
建议升级至最新事件插件版本,提升消费速率与稳定性。历史事件同步过程中,事件数据量较大,老版本插件可能导致内存异常。
迁移步骤
一、编译新版插件
首先,用户需从 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
Updated 4 days ago