新版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 了,清除此关联授权可进行以下操作,如图:

完美!

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