自動更新前端顯示的餘額的最佳方法
我試圖找出在接收和發送令牌時自動更新前端餘額的最佳方法。我嘗試在我的反應應用程序中創建一個令牌實例,然後創建一個事件監聽器和過濾器來監聽進出我的合約地址的“傳輸”事件,然後它將執行一個更新合約令牌餘額和我的錢包的函式在轉賬上花費汽油後的餘額(我的錢包乙太餘額顯示在我的 UI 中)。當使用者將令牌發送到合約時,這種方式有效,但它不會跟踪每個使用者發送了多少。為了跟踪,我在我的合約中創建了一個代幣的實例,我添加了一個呼叫代幣傳輸函式的傳輸函式,它將餘額添加到 addressToBalance 映射,然後發出一個事件。我試著聽這個事件,但問題是,我相信它會在令牌實際傳輸之前發出事件,對嗎?因此在傳輸令牌之前觸發事件偵聽器。有沒有“行業標準”的方式來做到這一點?我的猜測是監聽代幣合約的傳輸事件是最可靠的,但是你必須小心過濾取消訂閱,否則它會被觸發一千次。任何提示表示讚賞!否則它會被觸發一千次。任何提示表示讚賞!否則它會被觸發一千次。任何提示表示讚賞!
在您的瀏覽器資源上,列出所有持有人的所有餘額並同時更新它們將是非常繁重的。
您的賭注是顯示一些餘額並根據您嘗試更新的每個錢包地址使用過濾主題收聽轉移事件。如果一個錢包觸發了一個事件,你可以呼叫令牌並獲取該錢包的新余額。您還應該對事件進行一些排序,因為您可以輕鬆地在同一個塊中將 2 次或更多次轉移到同一個地址,這將導致多個無用的 balanceOf 請求。
您有 2 個選項:
1- 每 x 秒使用一次鏈上讀取,但使用 Maker 的 Multicall 合約或通過像@pooltogether/etherplex這樣抽象 Multicall 的 JS 庫批量處理所有鏈上讀取請求。最好批量讀取呼叫以保持低於 Infura 或 Alchemy API 限制。
2- 利用The Graph 協議的強大功能進行鏈上數據記憶體和索引。UI 基本上會使用 Apollo GraphQL 客戶端通過每 x 秒進行一次池化(Apollo 支持輪詢)從部署的子圖中獲取數據。