Web3js
在不知道地址可能持有的代幣的情況下讀取 ERC20 餘額的最有效方法是什麼?
balanceOf.call
在事先知道代幣合約地址的情況下,有很多例子可以從地址中讀取 ERC20 代幣的餘額。但是,如何在不知道地址可能持有哪些代幣的情況下讀取地址的餘額?例如,使用者希望知道其地址的總餘額(ETH + 代幣)。在不進行任何不必要計算的情況下檢索此資訊的最有效方法是什麼?
我是否應該遍歷一系列最流行的代幣合約地址?查看傳入的代幣轉移事件?還是有更有效的方法?
只是為了說明,我正在尋找一個私有節點而不是 API 的解決方案。
實現這一目標的頁面範例:
任何幫助將不勝感激!
如果你只對流行 ERC20 代幣的一小部分感興趣,那麼循環它們可能沒問題。
但如果你想要一切,我認為你最好的辦法是在你去的時候處理日誌並尋找
Transfer(address,address,uint256)
事件。對於每個事件,如果源看起來像 ERC20 令牌(例如具有名稱/符號/小數),請在您的數據庫中進行一些記賬,以便您跟踪這些事情。
正如@smarx 所建議的那樣,我繼續測試了使用一種
balanceOf
方法簡單地循環ERC20合約子集的效率,結果如下:使用Infura RPC的代幣合約數量的中位響應時間(包括獲取代幣符號、餘額和小數)
- 1 = 0.6s
- 10 = 0.8 秒
- 50 = 1.2s
- 100 = 1.5 秒
- 200 = 2s
- 300 = 2.5 秒
- 400 = 3 秒
- 500 = 3.5 秒
- 1000 = 6s
從Coinmarketcap上總共列出 410 個乙太坊代幣的事實來看,簡單地循環通過 400 個代幣合約大約需要 3 秒,這可能就足夠了,具體取決於案例。
知道地址持有的代幣,將因此將效率提高約 2.3 秒(假設平均地址持有約 5 個代幣)。這肯定會帶來更好的使用者體驗,但也會在觀察
Transfer
事件時帶來額外的維護成本。