你在使用truffle console时是否遇到过如下的错误:
truffle console连接本地以太坊网络时,不会产生以上超时的错误。但是,通过infura连接ropsten测试网络时,经常连命令都没打全就报异常,提示
Error: PollingBlockTracker - encountered an error while attempting to update latest block:
Error: ESOCKETTIMEDOUT
根本没法使用。
配置文件truffle-config.js是按如下配置的:
const HDWalletProvider = require('@truffle/hdwallet-provider')
const mnemonic = 'xxx aaa ... xxx' //12个英文单词的助记词
module.exports = {
networks: {
ropsten: {
provider: () => new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/f3a3314fa8c14dd6989b40441810d00b"),
network_id: 3
},
},
}
经过大量地百度、谷歌,只找到一个靠点边的解决方案,在networks.ropsten下增加networkCheckTimeout,于是修改配置如下:
const HDWalletProvider = require('@truffle/hdwallet-provider')
const mnemonic = 'xxx aaa ... xxx' //12个英文单词的助记词
module.exports = {
networks: {
ropsten: {
networkCheckTimeout: 10000000,
provider: () => new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/f3a3314fa8c14dd6989b40441810d00b"),
network_id: 3
},
},
}
但是增加这个配置并不能解决我的超时问题。最后只能从truffle的源码入手了。
truffle源码地址:github.com/trufflesuit…
在truffle\packages\provider\index.js中找到了networkCheckTimeout相关的代码,如下:
它确实有一定的作用,如果此处超时会提示:
Error: There was a timeout while attempting to connect to the network.
Check to see that your provider is valid.
If you have a slow internet connection, try configuring a longer timeout in your Truffle config. Use the networks[networkName].networkCheckTimeout property to do this.
而我上面异常报错时,抛出异常的代码位置是request.js,并非truffle\packages\provider\index.js文件。
通过一步步的debug,终于找到了问题的所在,代码位置:
truffle\node_modules@trufflesuite\web3-provider-engine\subproviders\rpc.js
是@truffle/hdwallet-provider依赖的一个模块,源码中写死了timeout为20000(此处单位是毫秒,也就是20秒)。我将该值修改为2000000,然后再使用truffle console,基本上就没有再抛超时异常了。
当然,直接修改源码不是好的方案,我也不清楚@trufflesuite\web3-provider-engine模块的作者为什么直接将timeout硬编码,不提供配置项。也许老外的网络比较快,不像咱们中国大陆的访问infura.io那么慢。所以他们认为20秒足以,不会发生超时异常。
不知道你是否有其它好的解决方案,欢迎交流!
注意:@trufflesuite\web3-provider-engine模块不在truffle的源码中,是@truffle/hdwallet-provider依赖的一个模块,执行
npm install @truffle/hdwallet-provider
命令后,在项目的node_modules目录中可以找到。
我的环境:
Truffle v5.1.41 (core: 5.1.41)
Solidity v0.5.16 (solc-js)
Node v10.22.0
Web3.js v1.2.1