這段時間在學習以太坊智能合約,用到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 了,清除此關聯授權可進行以下操作,如圖:
完美!