Web3.eth.accounts[0] werden nie aktualisiert

Ich versuche, Web3 zu verwenden, um auf das aktuelle Konto zuzugreifen, das ich auf Metamask ausgewählt habe, indem ich web3.eth.accounts[0] mache, um es auf meiner Benutzeroberfläche (in VueJS) anzuzeigen. web3.eth.accounts[0] gibt jedoch immer dasselbe Konto zurück, das erste der 10, die mir von Ganache TestRPC gegeben wurden.

Selbst wenn ich zum 8. Konto wechsle (Abbildung unten) und die App aktualisiere, wird console.log(web3.eth.accounts[0])immer noch das erste Konto im Array ausgegeben.

Geben Sie hier die Bildbeschreibung ein

Hier ist mein Code (in Vuejs wurde Vertrag bereits erstellt):

    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]);
        }

Wie würde ich web3 dazu bringen, die aktuell ausgewählte Kontoadresse in Metamask auszugeben?

Danke!

Antworten (2)

Der von Ihnen verwendete HTTP-Anbieter stellt nur eine direkte Verbindung zu Ganache her, sodass der MetaMask-Web3-Anbieter umgangen wird, weshalb Sie immer account[0] von Ganache sehen. Wenn Sie web3 = new Web3(web3.currentProvider)es verwenden, wird MetaMask als aktiver Anbieter übernommen.

Sie können auch überprüfen, ob MetaMask aktiviert ist, bevor Sie Ihre web3-Variable mit definieren:

if(typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    web3 = new Web3(new Web3.providers.HttpProvider(ethereumUri);
}

Dies läuft nur beim ersten Laden. Um Änderungen in MetaMask zu überwachen, können Sie eine Überwachungsfunktion verwenden, die eine intervallbasierte Überprüfung durchführt, um festzustellen, ob sich web3.eth.accounts[0] geändert hat. Sie müssen das derzeit aktive Konto in einer Variablen (z. B. currentAddress) halten, um diese Prüfung durchzuführen.

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);
}
Dies ist etwas falsch und würde nur gelten, wenn Sie zwei verschiedene Anbieter hätten, Metamask und Ganache. OP hat seine Metamask-Erweiterung so konfiguriert, dass sie den bereitgestellten eth-Knoten umgeht, und sie stattdessen mit seiner Ganache-Instanz verbunden, also ist es dasselbe. Denken Sie daran, dass Metamask sich mit JEDEM Knoten verbinden und diesen als Anbieter verwenden kann
@hextet Es spielt keine Rolle, wofür MetaMask hier konfiguriert ist, da der Code in der OP-Frage MetaMask nicht verwendet. (Es verwendet einen HTTP-Anbieter, um sich direkt mit Ganache zu verbinden.)
@smart Danke. Wenn ich web3 ändere, um Metamask als Anbieter zu verwenden, und versuche, auf web3.eth.accounts[0] zuzugreifen, gibt es Fehler zurück: Ungültige JSON-RPC-Antwort: undefiniert. Meine Metamask ist mit HTTP://127.0.0.1:7545 verbunden (läuft über Ganache). Code ist:var ethereumUri = 'http://127.0.0.1:7545'; var web3 = window.web3; if(typeof web3 !== 'undefined') { console.log("1"); console.log(web3.currentProvider); web3 = new Web3(web3.currentProvider); console.log(web3.eth.accounts[0]); } else { console.log("2"); }
Ich konnte einen Fehler aus deinem Code nicht reproduzieren. Ich bekomme ein funktionierendes web3, das eine Verbindung zu MetaMask herstellt. Welche Version von web3 verwenden Sie und welche Antwort erhalten Sie von - console.log (web3.currentProvider); - in deinem Code?
Update: Ich habe es behoben, ich musste die web3js-Version auf eine 0.2-Version ändern. Ich habe 1.0.0-beta.34 verwendet. Danke für die Hilfe!

Dies entspricht zu 100 % dem Design. web3.eth.accounts[index_num]bezieht sich immer auf das Konto, das in dieser bestimmten Reihenfolge erstellt wurde. Dies web3.eth.accounts[8]würde sich auf das 9. erstellte Konto beziehen, während es we3.eth.accounts[7]sich um das 8. erstellte Konto handeln wird. Ich bin mir nicht sicher, ob Sie web3js verwenden können, um das aktuell ausgewählte Konto in der Metamaske auszuwählen. Sie können jedoch die Adresse des 8. Kontos aus dem Array an denjenigen überprüfen, der versucht, eine Transaktion zu senden, eth.accountsoder einen Funktionsaufruf aufrufen.

@KevinShen Diese Antwort ist falsch. Die Antwort von @machine-uprising ist richtig. Ihr aktueller Code verwendet MetaMask nicht. Wenn Sie MetaMask verwendet haben, sehen Sie nur ein Konto im web3.eth.accountsArray, und es wäre das derzeit aktive Konto in MetaMask.