繁体   English   中英

无法在 web3 对象中设置提供程序

[英]Unable to set provider in web3 object

我正在学习有关 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(App.url) App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545');从“新”版本替换App.web3Provider = new Web3.providers.HttpProvider(App.url) App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545'); 存在于原始版本中,但这没有任何区别。 givenProvidercurrentProvider相同。

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

谢谢

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

 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(); },

我在 Truffle 网站上的教程之后遇到了这个问题: https : //trufflesuite.com/tutorial/index.html 我的解决方法略有不同,但顺序相似。

 initWeb3: async function() { // Modern dapp browsers... if (window.ethereum){ web3 = new Web3(web3.currentProvider); try { //Request account access await window.ethereum.request({ method: "eth_requestAccounts" }); } catch (error) { // User denied account access... console.error("User denied account access"); } App.web3Provider = web3.currentProvider; console.log("modern dapp browser"); } // Legacy dapp browsers... else if (window.web3) { App.web3Provider = window.web3.currentProvider; console.log("legacy dapp browser"); } // if no injected web3 instance is detected, fall back to Ganache else { App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545'); } web3 = new Web3(App.web3Provider); return App.initContract(); },

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM