Автоматически обновлять баланс учетной записи с помощью web3.js без опроса

Я создал пользовательский интерфейс на JavaScript с помощью web3.js, где пользователь может выбрать учетную запись для использования. Счета отображаются вместе с их текущим балансом для удобства.

Я загружаю адреса учетных записей следующим образом:

web3.eth.accounts

и я загружаю балансы с помощью этой функции:

web3.eth.getBalance(account, callback)

Очевидно, что при использовании моего DApp баланс аккаунта пользователя может измениться. Всякий раз, когда использование моего DApp изменяет баланс, я обновляю его, вызывая getBalance(...). Однако это не полное решение, потому что баланс может измениться, если пользователь сделает что-то за пределами моего DApp.

Прямо сейчас я опрашиваю функцию getBalance каждые x секунд, чтобы поддерживать баланс учетной записи в достаточно актуальном состоянии. Опрос — не самое чистое решение, потому что он постоянно требует некоторой мощности и некоторых циклов процессора. Если я сэкономлю немного энергии, опрашивая только раз в минуту, это будет очень медленно. Есть ли способ избежать опроса и просто получить обратный вызов при изменении баланса счета?

Ответы (2)

Вы можете установить фильтр блоков и обновлять балансы только при поступлении нового блока.

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")}`);
      }
    });
  }
});

К сожалению, насколько я слышал от разработчика, push-подход сейчас только разрабатывается в web3. Web3 в данном случае представляет собой соединение с узлом Ethereum. Вы можете запросить у него информацию, но он пока не имеет возможности «рассказать» вам что-то проактивно. Вам нужно продолжить голосование.

Этот ответ все еще верен?
Частично. Web3js 1.0.0 поддерживает веб-сокеты, ОДНАКО вы не можете использовать его в производстве, поскольку он не совместим с метамаской, которая является основным способом взаимодействия пользователей с dApp.