如何查询高于特定余额的特定以太坊代币的所有地址

时间:2021-06-08 17:39:20

标签: javascript ethereum solidity

我是以太坊区块链的新手,目前正在寻找一种方法来查询特定的以太坊代币合约,以找到该特定代币余额超过 x 数量的所有地址,然后将结果保存到 .txt 文件中.

我已经搜索了解决方案,但大多数似乎要么概述了查询特定地址的方法,要么查询以太坊主链本身。我想要做的是只查询与以太坊上一个特定代币相关联的地址。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

每个地址的代币余额存储在代币的合约中(而不是地址元数据中)。通常(但不总是)在映射 (address => uint256) 中。

大多数令牌标准(ERC-20ERC-721 等)都定义了一个名为 balanceOf(address) 的函数,该函数在实践中通常会访问此映射。

因此,为了仅通过查询合约存储来获取每个地址余额,您需要为每个现有地址查询 balanceOf() 函数。有 16^40(或大约 10^48)个可能的地址,所以这实际上是不可能的。


您在问题中提到的另一种概述方式——查询以太坊链——要容易得多。

您可以获得代币合约发出的 past event logs(选项中的 address 字段)。

您还可以按第一个主题进行过滤以仅包含 Transfer() 事件。主题值是事件签名的 keccak256。在你的情况下 keccak256("Transfer(address,address,uint256)") == ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

请注意,大多数第三方 JSON-RPC 提供程序(例如 Infura)仅允许有限的历史数据。因此,如果您想要所有历史数据,您很可能需要连接到您自己的完整节点。


区块链浏览器使用了一种类似的查询历史日志的方法。他们扫描每笔交易中的 Transfer() 事件,如果发射器是代币合约,他们会在各自的数据库中更新代币余额。每个地址的所有代币余额(来自这个单独的数据库)然后在地址详细信息页面上显示为代币余额。