Estoy tratando de usar Web3 para acceder a la cuenta actual que he seleccionado en Metamask haciendo web3.eth.accounts[0] para mostrarla en mi interfaz de usuario (en VueJS). Sin embargo, web3.eth.accounts[0] siempre devuelve la misma cuenta, la primera de las 10 que me dio Ganache TestRPC.
Incluso si cambio a la octava cuenta (captura de pantalla a continuación) y actualizo la aplicación, console.log(web3.eth.accounts[0])
aún genera la primera cuenta en la matriz.
Aquí está mi código (en Vuejs, el contrato ya se ha creado):
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]);
}
¿Cómo haría que web3 generara la dirección de cuenta seleccionada actual en Metamask?
¡Gracias!
El proveedor http que está utilizando solo se conecta directamente a ganache, por lo que pasa por alto el proveedor MetaMask web3, por lo que siempre ve la cuenta [0] de ganache. Si lo usa web3 = new Web3(web3.currentProvider)
, elegirá a MetaMask como el proveedor activo.
También puede verificar si MetaMask está habilitado antes de definir su variable web3 con:
if(typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider(ethereumUri);
}
Esto solo se ejecuta en la carga inicial. Para monitorear los cambios en MetaMask, puede usar una función de monitoreo que ejecuta una verificación basada en intervalos para ver si web3.eth.accounts[0] ha cambiado. Debe mantener la cuenta activa actual en una variable (por ejemplo, dirección actual) para realizar esta verificación.
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);
}
Esto es 100% como se diseñó. siempreweb3.eth.accounts[index_num]
se referirá a cualquier cuenta que se haya creado en ese orden en particular. Entonces se referiría a la novena cuenta creada, mientras que as será la octava cuenta creada. No estoy seguro de si puede usar web3js para seleccionar la cuenta actualmente seleccionada en metamask; sin embargo, podría verificar la dirección de la octava cuenta de la matriz a quien esté intentando enviar una transacción o invocar una llamada de función.web3.eth.accounts[8]
we3.eth.accounts[7]
eth.accounts
web3.eth.accounts
matriz y sería la cuenta actualmente activa en MetaMask.
hexteto
usuario19510
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"); }
levantamiento de máquinas
kws3778