Solidity
Web3.eth.accounts000從不更新
我正在嘗試使用 Web3 通過執行 web3.eth.accounts 訪問我在 Metamask 上選擇的目前帳戶
$$ 0 $$為了在我的 UI(在 VueJS 中)上顯示它。然而 web3.eth.accounts$$ 0 $$總是返回相同的帳戶,這是 Ganache TestRPC 給我的 10 個帳戶中的第一個。 即使我切換到第 8 個帳戶(下面的螢幕截圖)並刷新應用程序,
console.log(web3.eth.accounts[0])
仍然會輸出數組中的第一個帳戶。這是我的程式碼(在 Vuejs 中,已經創建了合約):
var ethereumUri = 'http://127.0.0.1:7545'; let web3 = new Web3(new Web3.providers.HttpProvider(ethereumUri)); if (!web3.isConnected()) { return 'Unable to connect to ethereum node at ' + ethereumUri }else{ var escrowContract = web3.eth.contract(abi); //abi initalized at start var instance = escrowContract.at(this.contractAddress); //contractAddress is initialized at the start console.log(web3.eth.accounts); console.log(web3.eth.accounts[0]); }
如何讓 web3 輸出 Metamask 中目前選擇的賬戶地址?
謝謝!
您使用的 http 提供程序僅直接連接到 ganache,因此它繞過了 MetaMask web3 提供程序,這就是您總是看到帳戶的原因
$$ 0 $$來自甘納許。如果您使用
web3 = new Web3(web3.currentProvider)
它將選擇 MetaMask 作為活動提供者。 您還可以在定義 web3 變數之前檢查是否啟用了 MetaMask:if(typeof web3 !== 'undefined') { web3 = new Web3(web3.currentProvider); } else { web3 = new Web3(new Web3.providers.HttpProvider(ethereumUri); }
這僅在初始負載時執行。要監視 MetaMask 中的更改,您可以使用執行基於間隔的檢查的監視功能來查看 web3.eth.accounts
$$ 0 $$已經改變。您需要將目前活動帳戶保存在一個變數(例如 currentAddress)中才能執行此檢查。
watchAddress: function () { var checkAddress = setInterval (function() { if (web3.eth.accounts[0] !== currentAddress) { // Account has changed // set currentAddress = web3.eth.accounts[0]; // Do something, eg reload } }, 100); }