truffle console 超时问题

1,868 阅读2分钟

你在使用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

@truffle/hdwallet-provider v1.0.42
@trufflesuite/web3-provider-engine v15.0.13-1