java-sdk icon indicating copy to clipboard operation
java-sdk copied to clipboard

事件topics不应该只截取前4字节!

Open arc0035 opened this issue 3 years ago • 1 comments

在sdk中的ContractABIDefinition类中,事件主题的计算方式逻辑如下: 企业微信截图_16306675012145

这样的话,就截取了sha3([事件签名])的前4字节,得到结果类似于: “0xb8b1cbdd”

但是交易回执抛出的事件中,其实事件topics是应该保存整个32字节的,例如 “0x8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f”

这造成的后果是,ContractABIDefinition类的eventTopicsToEvents就没有办法直接拿来匹配交易回执中的事件主题了。

解决办法: 修改ContractABIDefinition.addEvent方法,不要再复用methodId的生成方法,直接对事件签名做sha3即可。

arc0035 avatar Sep 03 '21 11:09 arc0035

提测文档

特性描述

支持 通过 交易回执 logs对象中的 topics字段 直接 解析 EventLog

代码修改点:

1、在 ABIDefinition类中 添加 getEventTopic 方法,来替代之前用的 getMethodId 方法

2、在 ABIDefinitionFactory 类的 loadABI 的 添加事件addEvent 时,不再用之前得getMethodId 方法,而用 getEventTopic (不截取事件签名sha3,保留32字节)作为 Map<String, ABIDefinition> eventTopicToEvents = new HashMap<>(); 集合的 key

3、这样在解析EventLog 的时候直接可用 交易回执的 topics字段 来调用ABICodec类的 decodeEventByTopic 方法来解析

影响的功能范围

1、交易回执EventLog解析

测试项

1、交易回执EventLog解析

JyFangYang avatar Apr 12 '22 01:04 JyFangYang