以太坊开发: web3.js1.0.0事件监听

在进行中心化钱包开发过程中,需要对数字货币转账进行监听并作出相应处理,在进行监听过程中遇到了一些坑,积累了一些经验,也有一些需要解决的问题,分享出来互相交流。

一、监听事件不生效

以太坊开发: web3.js1.0.0事件监听_第1张图片
官方文档监听

以上是官方文档的用法,理论上说运行后服务会持续运行维持连接,结果是运行后直接结束,无报错出现;由于网上搜索可以搜到监听的各种写法,如contract.watch,myContract.Transfer().on()等,所有我把各种方式都试过了一遍,都是同样的结果。

经过一遍遍尝试和重写,发现error必须要打印才会报错,这也是我的一个疏忽,经过打印发现问题出在web3的provider上,web3的监听只支持WebsocketProvider,不支持HttpProvider(IpcProvider也不支持)

以太坊开发: web3.js1.0.0事件监听_第2张图片
以太坊开发: web3.js1.0.0事件监听_第3张图片
报错信息

在此,直接改用WebsocketProvider即可,由于我使用的是第三方服务infura,提供了websocket连接,可直接使用,修改以后可以正常进行监听。


二、websocket连接不稳定

监听连接空闲一段时间后会失效:大概空闲10-30分钟后,如果再次有事件发生,有很大几率无法监听到,infura官网上也有相应的说明,给出了大概的解决方案,即通过定期发送请求保证连接不空闲过长时间,由于没有具体的案例方法,表示无从下手。

通过查阅一些资料之后,可以这样理解:由于使用的第三方服务进行连接,连接时经过了很多道路由,如果要保持连接,就需要中间经历的所有路由无障碍,空闲一段时间之后,部分路由会认为这个连接已经失效而断开,这种断开并不会有任何提示,所以导致上述结果。如果采用本地服务可能没有这个问题(是猜想,并未验证)。

为了解决这个问题,我采取定时重启服务的方式维持连接,并开启多个服务进行监听和返回数据。


以上是我在web3.js进行事件监听时踩过的坑,第二个问题还没有得到完美的解决,如有不同意见,可互相交流分享。

你可能感兴趣的:(以太坊开发: web3.js1.0.0事件监听)