Solidity

Web3.eth.accounts000從不更新

  • May 17, 2018

我正在嘗試使用 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);
}

引用自:https://ethereum.stackexchange.com/questions/48688