在進行中心化錢包開發(fā)過程中,需要對數(shù)字貨幣轉(zhuǎn)賬進行監(jiān)聽并作出相應(yīng)處理漓雅,在進行監(jiān)聽過程中遇到了一些坑录别,積累了一些經(jīng)驗,也有一些需要解決的問題邻吞,分享出來互相交流组题。
一、監(jiān)聽事件不生效
以上是官方文檔的用法抱冷,理論上說運行后服務(wù)會持續(xù)運行維持連接崔列,結(jié)果是運行后直接結(jié)束,無報錯出現(xiàn)旺遮;由于網(wǎng)上搜索可以搜到監(jiān)聽的各種寫法赵讯,如contract.watch,myContract.Transfer().on()等耿眉,所有我把各種方式都試過了一遍边翼,都是同樣的結(jié)果。
經(jīng)過一遍遍嘗試和重寫跷敬,發(fā)現(xiàn)error必須要打印才會報錯讯私,這也是我的一個疏忽热押,經(jīng)過打印發(fā)現(xiàn)問題出在web3的provider上,web3的監(jiān)聽只支持WebsocketProvider斤寇,不支持HttpProvider(IpcProvider也不支持)
在此桶癣,直接改用WebsocketProvider即可,由于我使用的是第三方服務(wù)infura娘锁,提供了websocket連接牙寞,可直接使用,修改以后可以正常進行監(jiān)聽莫秆。
二间雀、websocket連接不穩(wěn)定
監(jiān)聽連接空閑一段時間后會失效:大概空閑10-30分鐘后,如果再次有事件發(fā)生镊屎,有很大幾率無法監(jiān)聽到惹挟,infura官網(wǎng)上也有相應(yīng)的說明,給出了大概的解決方案缝驳,即通過定期發(fā)送請求保證連接不空閑過長時間连锯,由于沒有具體的案例方法,表示無從下手用狱。
通過查閱一些資料之后运怖,可以這樣理解:由于使用的第三方服務(wù)進行連接,連接時經(jīng)過了很多道路由夏伊,如果要保持連接摇展,就需要中間經(jīng)歷的所有路由無障礙,空閑一段時間之后溺忧,部分路由會認為這個連接已經(jīng)失效而斷開咏连,這種斷開并不會有任何提示,所以導(dǎo)致上述結(jié)果砸狞。如果采用本地服務(wù)可能沒有這個問題(是猜想捻勉,并未驗證)。
為了解決這個問題刀森,我采取定時重啟服務(wù)的方式維持連接踱启,并開啟多個服務(wù)進行監(jiān)聽和返回數(shù)據(jù)。
以上是我在web3.js進行事件監(jiān)聽時踩過的坑研底,第二個問題還沒有得到完美的解決埠偿,如有不同意見,可互相交流分享榜晦。