波场中的事件机制 / 学习智能合约#23

in STEEM CN/中文4 years ago

tron.jpg

波场中的事件机制和以太坊类似,但是坑点不少,一不小心就是深坑!

刚开始就因为事件中不能使用结构体变量折腾了我半天!其它事件正常,有结构体变量的事件就是查询不到,折腾得你怀疑人生。后面尝试,估计是波场只支持0.5.8版本的solidity导致的问题。在合约事件中去除了结构体就果然正常了。

另外,智能合约中我们会使用这样的形式event SetDelegate(string indexed steemAccount, address indexed delegator, uint256 startTime, uint256 amount);来定义一个事件,然后在函数中调用就可以啰。但是波场中使用indexed这个索引毫无意义,而且还会出错!

a.png

上图中合约中使用了indexed这个索引,查询结果中steemAccount原本是一个字符串却得到一个16进制的乱码!折腾了我半天就是不知怎么解析出来,满头包!后来也是琢磨可能是智能合约的问题,波场的虚拟机可能不支持indexed,就像刚刚在事件中不能使用结构体变量一样。

b.png

果然又被我猜中了(在波场中开发很多时候要靠猜)!在合约事件中去除了indexed就恢复正常的结果了,如上图所示!

我记得以太坊是原生支持indexed这个索引,查询时使用布隆过滤器,可以直接过滤想要的事件,而在波场的事件机制不支持过滤,需要自己手动过滤!这时的indexed这个索引毫无意义,还会引发额外的错误,所以,在波场中尽量不要使用indexed

查询事件的方法很简单:let s = await this.tronWeb.getEventResult(contract, {eventName:'Transfer', size:2}) 一个方法就可以了,不要想要过滤出想要的结果就必须要手动过滤啰!

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.028
BTC 59605.49
ETH 2607.69
USDT 1.00
SBD 2.42