Я создал пользовательский интерфейс на JavaScript с помощью web3.js, где пользователь может выбрать учетную запись для использования. Счета отображаются вместе с их текущим балансом для удобства.
Я загружаю адреса учетных записей следующим образом:
web3.eth.accounts
и я загружаю балансы с помощью этой функции:
web3.eth.getBalance(account, callback)
Очевидно, что при использовании моего DApp баланс аккаунта пользователя может измениться. Всякий раз, когда использование моего DApp изменяет баланс, я обновляю его, вызывая getBalance(...). Однако это не полное решение, потому что баланс может измениться, если пользователь сделает что-то за пределами моего DApp.
Прямо сейчас я опрашиваю функцию getBalance каждые x секунд, чтобы поддерживать баланс учетной записи в достаточно актуальном состоянии. Опрос — не самое чистое решение, потому что он постоянно требует некоторой мощности и некоторых циклов процессора. Если я сэкономлю немного энергии, опрашивая только раз в минуту, это будет очень медленно. Есть ли способ избежать опроса и просто получить обратный вызов при изменении баланса счета?
Вы можете установить фильтр блоков и обновлять балансы только при поступлении нового блока.
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. Вы можете запросить у него информацию, но он пока не имеет возможности «рассказать» вам что-то проактивно. Вам нужно продолжить голосование.
Ли Хан Кёль
Нико