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.
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!
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 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.accounts
oder einen Funktionsaufruf aufrufen.
web3.eth.accounts
Array, und es wäre das derzeit aktive Konto in MetaMask.
hextet
Benutzer19510
kws3778
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"); }
Maschinenaufstand
kws3778