Web3.eth.accounts[0] nunca se actualiza

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.

ingrese la descripción de la imagen aquí

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!

Respuestas (2)

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 ligeramente incorrecto y solo se aplicaría si tuviera dos proveedores diferentes, metamask y ganache. OP configuró su extensión metamask para omitir el nodo eth proporcionado y, en su lugar, lo conectó a su instancia de ganache, por lo que es lo mismo. Recuerde, metamask puede conectarse a CUALQUIER nodo y usarlo como proveedor
@hextet No importa para qué esté configurado MetaMask aquí, porque el código en la pregunta del OP no usa MetaMask. (Utiliza un proveedor HTTP para conectarse directamente a ganache).
@smarx Gracias. Cuando cambio web3 para usar Metamask como proveedor e intento acceder a web3.eth.accounts[0], devuelve Error: Respuesta JSON RPC no válida: indefinido. Mi Metamask está conectado a HTTP://127.0.0.1:7545 (ejecutándose a través de Ganache). El código es: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"); }
No he podido reproducir un error de su código. Obtengo un web3 en funcionamiento que se conecta a MetaMask. ¿Qué versión de web3 está ejecutando y qué respuesta recibe de - console.log (web3.currentProvider); - en tu código?
Actualización: lo arreglé, tuve que cambiar la versión de web3js a una versión 0.2. Estaba usando 1.0.0-beta.34 ¡Gracias por la ayuda!

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

@KevinShen Esta respuesta es incorrecta. La respuesta de @machine-uprising es correcta. Su código actual no usa MetaMask. Si usara MetaMask, solo vería una cuenta en la web3.eth.accountsmatriz y sería la cuenta actualmente activa en MetaMask.