Web3js
使用元遮罩時檢測 web3 預設帳戶的更好模式
上下文:我想使用 blockies 在頁面上呈現一個身份圖示,我從 web3 獲取 defaultAccount,為此,使用者必須使用錢包中選擇的地址登錄到 metamask。
問題:web 應用程序似乎沒有在頁面的載入事件上檢測到 web3 對象,建議在 wchih 進行檢測。
程式碼:下面的靈感來自以下建議:
https://github.com/MetaMask/metamask-plugin/issues/1158
我一直有間歇性行為,有時 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 似乎就會出現。