Web3js

在不知道地址可能持有的代幣的情況下讀取 ERC20 餘額的最有效方法是什麼?

  • September 27, 2018

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事件時帶來額外的維護成本。

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