Events

是否可以根據記錄的索引參數使用萬用字元過濾事件

  • April 2, 2018

假設我有一個契約,event PersonCreated(uint personId, bytes32 indexed name)每次創建一個人時都會觸發。

要查詢名稱等於 Jason 的所有過去事件,我們可以使用:

contract.getPastEvents('PersonCreated', {
   filter: {
       "name": [web3.utils.toHex("Jason") ]
   },
   fromBlock: 0,
   toBlock: 'latest'
}).then((events)=> {
   console.log("Events: ", events)
})

**$$ Q $$**是否可以創建過濾器來查詢名稱以“J”開頭的所有事件?

根據https://github.com/ethereum/go-ethereum/blob/7f74bdf8dded0e1ac3c01e043c2ed89d78f308cf/eth/filters/filter.go只檢查空過濾器和相等(func filterLogs),所以你的問題的答案是:否這是不可能的(儘管如此,擁有該功能會很酷)。==

...
for i, topics := range topics {
   match := len(topics) == 0 // empty rule set == wildcard
   for _, topic := range topics {
       if log.Topics[i] == topic {
           match = true
           break
       }
   }
   ...
}
...

如果您想按起始字母進行過濾,則必須為您的事件定義一個附加參數。例如:

event PersonCreated(uint personId, bytes1 indexed firstLetter, bytes32 indexed name) 

引用自:https://ethereum.stackexchange.com/questions/44517