我正在尝试过滤一些事件,并且我注意到自从将web3更新为2.0.0-alpha 1版本以来,事件捕获有些不同。

我与此 Activity 有智能合约:

event catchMeIfYouCan (address indexed a, string indexed b, uint indexed c);

到目前为止,我想按其参数进行过滤。
但是,当我尝试按b(索引的字符串)进行过滤时,此方法不起作用。
我正在使用ExpressJS和上面提到的Web3版本在NodeJS中执行此操作。

如果我这样做:
const event = smartContract.events.catchMeIfYouCan({ filter : {
 a : accountAddress ,
 b : web3.utils.toHex(stringValue) ,
 c : web3.utils.toWei("" + numberValue) }
}, (error, event) => {
 // do some things
});

我得到:
Node error: {"code":-32602,"message":"invalid argument 1: hex has invalid length 96 after decoding"}

否则,如果我让b参数在NodeJS事件中捕获为:
 b : stringValue,

它不再捕获事件,与c相同(例如:不再web3.utils.toWei())。

因此,我的问题是:您是否知道如何在Web3 2.0.0-Alpha 1版本中通过字符串参数过滤事件?

谢谢您的帮助,祝您有美好的一天!

最佳答案

感谢您的问题,我对其进行了测试,并相信它是filter的错误

但是我尝试使用topics并且它有效

  contract.events.CatchMeIfYouCan({
    topics: [, web3.utils.sha3(stringValue)], // first element is empty, because its place for `address` index
    fromBlock: 2000000
  }, (error, event) => {
    console.log(event)
  })

所以,我在web3.js repo中创建了一个issue

10-04 22:09
查看更多