Web3js

使用元遮罩時檢測 web3 預設帳戶的更好模式

  • May 10, 2019

上下文:我想使用 blockies 在頁面上呈現一個身份圖示,我從 web3 獲取 defaultAccount,為此,使用者必須使用錢包中選擇的地址登錄到 metamask。

問題:web 應用程序似乎沒有在頁面的載入事件上檢測到 web3 對象,建議在 wchih 進行檢測。

程式碼:下面的靈感來自以下建議:

https://github.com/MetaMask/metamask-plugin/issues/1158

https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#partly_sunny-web3---ethereum-browser-environment-check

我一直有間歇性行為,有時 web3 存在,有時不存在,我能想到的唯一解決方案是有一個計時器,但這在我看來有點過於簡單,我更喜歡更優雅的東西。

問題:是否有更好的解決方案來在頁面載入時從 web3 中檢測 defaultAccount?

function startApp() { 
       GenerateIdenticon();  
}  


window.addEventListener('load', function () { 

// Checking if Web3 has been injected by the browser (Mist/MetaMask)
if (typeof web3 !== 'undefined') {

   // Use Mist/MetaMask's provider
   window.web3 = new Web3(web3.currentProvider); 
   if (web3.currentProvider.isMetaMask === true) {
       if (typeof web3.eth.defaultAccount === 'undefined') {
           document.body.innerHTML = '<body><h1>Oops! Your browser does not support Ethereum Ðapps.</h1></body>';   
       }
       else {
           startApp();
       }
   }
   else {
        alert('No web3? Please use google chrome and metamask plugin to enter this Dapp!', null, null);
       // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
      window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

accounts比頁內數組更可靠的一種方法是web3.eth.getAccounts(accounts => console.log(accounts[0])).

這將非同步請求帳戶數組,並在可用時回調。

這是我在 Dapp 中使用的內容。它似乎工作得很好。

function getWeb3(callback) {
 if (typeof window.web3 === 'undefined') {
   // no web3, use fallback
   console.error("Please use a web3 browser");
 } else {
   // window.web3 == web3 most of the time. Don't override the provided,
   // web3, just wrap it in your Web3.
   var myWeb3 = new Web3(window.web3.currentProvider); 

   // the default account doesn't seem to be persisted, copy it to our
   // new instance
   myWeb3.eth.defaultAccount = window.web3.eth.defaultAccount;

   callback(myWeb3);
 }
}

像這樣使用:

function startApp(web3) {
 // ...
}

window.addEventListener('load', function() {
 getWeb3(startApp);
});

關鍵的區別是我defaultAccount從原始window.web3實例中複製了。您會注意到沒有 MetaMask 特定的程式碼web3.eth.defaultAccount是 Javascript API 的一部分。defaultAccount一旦你解鎖你的錢包,MetaMask 似乎就會出現。

引用自:https://ethereum.stackexchange.com/questions/17491