在進行中心化錢包開發(fā)過程中,需要對數(shù)字貨幣轉賬進行監(jiān)聽并作出相應處理,在進行監(jiān)聽過程中遇到了一些坑,積累了一些經驗,也有一些需要解決的問題,分享出來互相交流。
一、監(jiān)聽事件不生效

以上是官方文檔的用法,理論上說運行后服務會持續(xù)運行維持連接,結果是運行后直接結束,無報錯出現(xiàn);由于網上搜索可以搜到監(jiān)聽的各種寫法,如contract.watch,myContract.Transfer().on()等,所有我把各種方式都試過了一遍,都是同樣的結果。
經過一遍遍嘗試和重寫,發(fā)現(xiàn)error必須要打印才會報錯,這也是我的一個疏忽,經過打印發(fā)現(xiàn)問題出在web3的provider上,web3的監(jiān)聽只支持WebsocketProvider,不支持HttpProvider(IpcProvider也不支持)


在此,直接改用WebsocketProvider即可,由于我使用的是第三方服務infura,提供了websocket連接,可直接使用,修改以后可以正常進行監(jiān)聽。
二、websocket連接不穩(wěn)定
監(jiān)聽連接空閑一段時間后會失效:大概空閑10-30分鐘后,如果再次有事件發(fā)生,有很大幾率無法監(jiān)聽到,infura官網上也有相應的說明,給出了大概的解決方案,即通過定期發(fā)送請求保證連接不空閑過長時間,由于沒有具體的案例方法,表示無從下手。
通過查閱一些資料之后,可以這樣理解:由于使用的第三方服務進行連接,連接時經過了很多道路由,如果要保持連接,就需要中間經歷的所有路由無障礙,空閑一段時間之后,部分路由會認為這個連接已經失效而斷開,這種斷開并不會有任何提示,所以導致上述結果。如果采用本地服務可能沒有這個問題(是猜想,并未驗證)。
為了解決這個問題,我采取定時重啟服務的方式維持連接,并開啟多個服務進行監(jiān)聽和返回數(shù)據。
以上是我在web3.js進行事件監(jiān)聽時踩過的坑,第二個問題還沒有得到完美的解決,如有不同意見,可互相交流分享。