Web3js
使用 web3.js 自動更新賬戶餘額,無需輪詢
我用 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 代表與乙太坊節點的連接。你可以向它詢問資訊,但就目前而言,它還沒有辦法主動“告訴”你一些事情。您現在需要繼續投票。