【发布时间】:2021-06-08 17:39:20
【问题描述】:
我是使用以太坊区块链的新手,目前正在寻找一种方法来查询特定的以太坊代币合约,以找到该特定代币余额高于 x 金额的所有地址,然后将结果保存到 .txt 文件.
我已经搜索了解决方案,但大多数似乎要么概述了查询特定地址的方法,要么查询主以太坊链本身。我想要做的是只查询与以太坊上一个特定令牌关联的地址。
任何帮助将不胜感激。
【问题讨论】:
标签: javascript ethereum solidity
我是使用以太坊区块链的新手,目前正在寻找一种方法来查询特定的以太坊代币合约,以找到该特定代币余额高于 x 金额的所有地址,然后将结果保存到 .txt 文件.
我已经搜索了解决方案,但大多数似乎要么概述了查询特定地址的方法,要么查询主以太坊链本身。我想要做的是只查询与以太坊上一个特定令牌关联的地址。
任何帮助将不胜感激。
【问题讨论】:
标签: javascript ethereum solidity
每个地址的代币余额存储在代币的合约中(而不是地址元数据中)。通常(但不总是)在映射(address => uint256)。
大多数令牌标准(ERC-20、ERC-721 等)都定义了一个名为 balanceOf(address) 的函数,实际上通常会访问此映射。
因此,为了仅通过查询合约存储来获得每个地址余额,您需要为每个现有地址查询 balanceOf() 函数。有 16^40(或大约 10^48)个可能的地址,所以这实际上是不可能的。
您在问题中提到的另一种概述方式 - 查询以太坊链 - 更容易。
你可以获得你的代币合约发出的past event logs(选项中的address字段)。
您还可以按第一个主题过滤以仅包含 Transfer() 事件。主题值为事件签名的keccak256。在你的情况下keccak256("Transfer(address,address,uint256)") == ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
请注意,大多数第三方 JSON-RPC 提供商(例如 Infura)只允许有限的历史数据。因此,如果您想要所有历史数据,您很可能需要连接到您自己的完整节点。
区块链浏览器使用与查询历史日志类似的方法。他们扫描每笔交易以查找Transfer() 事件,如果发射器是代币合约,他们会更新其单独数据库中的代币余额。每个地址的所有代币余额(来自这个单独的数据库)然后显示为地址详细信息页面上的代币余额。
【讨论】:
Transfer() 事件并从中建立最终平衡。