Web3js

使用 web3.js 自動更新賬戶餘額,無需輪詢

  • August 15, 2019

我用 web3.js 在 JavaScript 中創建了一個使用者界面,使用者可以在其中選擇要使用的帳戶。為方便起見,這些帳戶與其目前餘額一起顯示。

我像這樣載入帳戶地址:

web3.eth.accounts

我使用這個函式載入天平:

web3.eth.getBalance(account, callback)

顯然,在使用我的 DApp 時,使用者的賬戶餘額可能會發生變化。每當使用我的 DApp 更改餘額時,我都會通過呼叫 getBalance(…) 來更新它。但是,這不是一個完整的解決方案,因為如果使用者在我的 DApp 之外執行任何操作,餘額可能會發生變化。

現在,我每 x 秒輪詢一次 getBalance 函式,以使帳戶餘額保持最新。輪詢不是最乾淨的解決方案,因為它不斷地消耗一些電源和一些 CPU 週期。如果我只通過每分鐘輪詢一次來節省一些電量,那將非常慢。有沒有辦法避免輪詢並在賬戶餘額發生變化時收到回調?

您可以安裝塊過濾器,僅在新塊到達時更新余額。

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

不幸的是,據我從參與其中的開發人員那裡聽說,現在 web3 中的推送方法正在醞釀之中。在這種情況下,Web3 代表與乙太坊節點的連接。你可以向它詢問資訊,但就目前而言,它還沒有辦法主動“告訴”你一些事情。您現在需要繼續投票。

引用自:https://ethereum.stackexchange.com/questions/25733