簡體   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