【问题标题】:Unable to set provider in web3 object无法在 web3 对象中设置提供者
【发布时间】:2020-04-17 11:19:24
【问题描述】:

我正在学习有关 DApp 创建的在线课程,目前正在尝试设置将在教程中使用的应用程序。

Dapp 是在 Chrome 上使用 Truffle 和 Metamask 设置的。所有 Dapp 文件都由课程提供(实际上是提供了一个 Ubuntu linux 实例以在虚拟机中使用),但很快就很明显,由于 Metamask 最新版本的变化(我认为课程日期为 2017 年),网络与帐户地址相关的前端控件(显示它们的下拉列表和调用将帐户地址发送到合约的函数的按钮)被破坏。作为整个生态系统的新手,我听从了一位同学的建议,修改了 initWeb3 函数

  initWeb3: function() {
        // Is there is an injected web3 instance?
    if (typeof web3 !== 'undefined') {
      App.web3Provider = web3.currentProvider;
    } else {
      // If no injected web3 instance is detected, fallback to the TestRPC
      App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545');
    }
    web3 = new Web3(App.web3Provider);
    App.populateAddress();
    return App.initContract();
  }

到这里

  initWeb3: function() {

            // Is there is an injected web3 instance?

            if (typeof web3 !== 'undefined') {
            ethereum.enable().then(() => {
            App.web3Provider = web3.givenProvider;
            });

            } else {

            // If no injected web3 instance is detected, fallback to the TestRPC
            App.web3Provider = new Web3.providers.HttpProvider(App.url);
            }

            web3 = new Web3(App.web3Provider);
            App.populateAddress();
            return App.initContract();

            }

我知道关键区别在于ethereum.enable() 调用。这确实使相关控件出现在(Chrome)网页中,现在 Metamask 还显示一个弹出窗口,要求用户批准其与帐户的通信。问题是当网页加载时,Chrome记录如下错误:

Uncaught Error: Invalid provider passed to setProvider(); provider is null
    at Function.setProvider (truffle-contract.js:308)
    at Object.success (app.js:61)
    at i (jquery.min.js:2)
    at Object.fireWith [as resolveWith] (jquery.min.js:2)
    at y (jquery.min.js:4)
    at XMLHttpRequest.c (jquery.min.js:4)

我认为这与app.js 文件中的更改有关,但我找不到解决方案。我尝试用原始版本中存在的App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545'); 替换“新”版本中的App.web3Provider = new Web3.providers.HttpProvider(App.url),但这没有任何区别。与givenProvidercurrentProvider 相同。

我和其他同学已与课程背后的工作人员签订了合同以寻求帮助,但没有提供任何帮助(我也与他们讨论了这个问题)。我已经用谷歌搜索了这个错误并花了很多时间读回结果,但到目前为止还没有提供解决方案——一些结果表明这实际上是一个 Web3 错误,但我不能确定。如果有人能帮助解决这个问题,我们将不胜感激。

谢谢

【问题讨论】:

    标签: smartcontracts web3js consensys-truffle


    【解决方案1】:

    我已经解决了这个问题 - 我使用来自 the Ethereum Javascript API page 的代码在 if..else 块中启动我的 web3 实例,然后将 App.web3Provider 提供者设置为实例的提供者

    initWeb3: function() {
    
    			// Is there is an injected web3 instance?
    
    			if (typeof web3 !== 'undefined') {
    
    			ethereum.enable().then(() => {
    			web3 = new Web3(web3.currentProvider);
    
    			});
    
    			} else {
    
    			// If no injected web3 instance is detected, fallback to the TestRPC
    
    			web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));			
    			}
    
    			App.web3Provider=web3.currentProvider;
    
    			App.populateAddress();
    
    			return App.initContract();
    
    			},

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2018-06-10
      • 1970-01-01
      • 2023-03-29
      • 2019-10-14
      • 2012-04-04
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      相关资源
      最近更新 更多