这段时间在学习以太坊智能合约,用到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 了,清除此关联授权可进行以下操作,如图:
完美!