新版MetaMask如何獲取當前賬戶地址

這段時間在學習以太坊智能合約,用到MetaMask,於是就在chrome應用商店下載了最新的版本MetaMask7.6,正常轉賬使用是沒有任何問題的,但是,當開發智能合約時,遇到一個頭疼的問題:web3.eth.getAccounts() 獲取不了當前賬戶的地址。

爲什麼 web3.eth.getAccounts() 無法使用呢?

經反覆驗證,確定我的代碼是沒有問題的,後來實在是想不出什麼解決方法,就請教了會智能合約的前輩,得到的回覆是:高版本web3無法使用,併發給我一個比較低的版本 MetaMask4.4。經過我的測試,這個版本確實可以正常使用 web3.eth.getAccounts()。

  • MetaMask7.6

  • MetaMask4.4

如上圖所示:是兩個版本的MetaMask。使用舊版本後我很不習慣,一是全英文(英文水平不好…),二是,也是最主要的原因,調用的時候經常不能正常喚醒彈出,這個非常讓人頭疼。

爲了能重新用回MetaMask7.6 我決定要深究原因,找出解決辦法;

爲什麼高版本的 MetaMask7.6 無法調用 web3 ?

幸運的我很快就找到了原因,如下圖(點擊查看下圖文章詳情):

原來是因爲後期的新版本加入了隱私權限,Dapp不能隨意獲取當用戶的賬戶地址,圖中的文章可以關閉隱私模式解決這個問題,然而我的 MetaMask7.6 沒有這個選項。

如何讓高版本 MetaMask7.6 正常調用 web3 ?

我只能選擇第二種方案,這也是更完美的解決方案:

使用window.ethereum來判斷是否新版metamask,如果是的話,就調用ethereum.enable() 方法來請求用戶授權,這將在用戶網頁中彈出一個授權對話框,代碼如下:

window.addEventListener('load', async () => {
    // Modern dapp browsers...
    if (window.ethereum) {
        let ethereum = window.ethereum;
        window.web3 = new Web3(ethereum);
        try {
            // Request account access if needed
            await ethereum.enable();
            // Acccounts now exposed
            web3.eth.sendTransaction({/* ... */});
        } catch (error) {
            // User denied account access...
        }
    }
    // Legacy dapp browsers...
    else if (window.web3) {
        window.web3 = new Web3(web3.currentProvider);
        // Acccounts always exposed
        web3.eth.sendTransaction({/* ... */});
    }
    // Non-dapp browsers...
    else {
        console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
    }
});

用戶點擊連接後,就能正常使用 web3 了,清除此關聯授權可進行以下操作,如圖:

完美!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章