Actualice automáticamente el saldo de la cuenta con web3.js sin encuestas

Creé una interfaz de usuario en JavaScript con web3.js donde el usuario puede seleccionar una cuenta para usar. Las cuentas se muestran junto con su saldo actual para mayor comodidad.

Cargo las direcciones de cuenta así:

web3.eth.accounts

y cargo los saldos usando esta función:

web3.eth.getBalance(account, callback)

Obviamente, mientras uso mi DApp, el saldo de la cuenta del usuario puede cambiar. Cada vez que el uso de mi DApp cambia el saldo, lo actualizo llamando a getBalance(...). Sin embargo, esta no es una solución completa porque el saldo puede cambiar si el usuario hace algo fuera de mi DApp.

En este momento, estoy sondeando la función getBalance cada x segundos para mantener el saldo de la cuenta razonablemente actualizado. El sondeo no es la solución más limpia porque consume constantemente algo de energía y algunos ciclos de CPU. Si ahorro algo de energía sondeando solo una vez por minuto, es muy lento. ¿Hay alguna manera de evitar el sondeo y simplemente recibir una devolución de llamada cuando cambia el saldo de la cuenta?

Respuestas (2)

Puede instalar un filtro de bloqueo y solo actualizar los saldos cuando llega un nuevo bloqueo.

const Web3 = require('web3');

const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

const address = "0x9b....";

let balance = web3.eth.getBalance(address);

const filter = web3.eth.filter('latest');
filter.watch((err, res) => {
  if (err) {
    console.log(`Watch error: ${err}`);
  } else {
    // Update balance
    web3.eth.getBalance(address, (err, bal) => {
      if (err) {
        console.log(`getBalance error: ${err}`);
      } else {
        balance = bal;
        console.log(`Balance [${address}]: ${web3.fromWei(balance, "ether")}`);
      }
    });
  }
});

Desafortunadamente, un enfoque de empuje está en desarrollo ahora en web3, por lo que escuché de un desarrollador involucrado. Web3, en este caso, representa una conexión a un nodo Ethereum. Puede pedirle información, pero, por ahora, no tiene forma de "decirle" algo de manera proactiva. Necesita continuar sondeando por ahora.

¿Sigue siendo cierta esta respuesta?
Parcialmente. Web3js 1.0.0 admite websockets SIN EMBARGO, no puede usarlo en producción ya que no es compatible con metamask, que es la forma principal en que los usuarios interactuarán con una dApp.