java-sdk
java-sdk copied to clipboard
事件topics不应该只截取前4字节!
在sdk中的ContractABIDefinition类中,事件主题的计算方式逻辑如下:
这样的话,就截取了sha3([事件签名])的前4字节,得到结果类似于: “0xb8b1cbdd”
但是交易回执抛出的事件中,其实事件topics是应该保存整个32字节的,例如 “0x8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f”
这造成的后果是,ContractABIDefinition类的eventTopicsToEvents就没有办法直接拿来匹配交易回执中的事件主题了。
解决办法: 修改ContractABIDefinition.addEvent方法,不要再复用methodId的生成方法,直接对事件签名做sha3即可。
提测文档
特性描述
支持 通过 交易回执 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
解析