如何从token中获取token持有者?

问题描述 投票:0回答:3

我已经创建了自己的ERC-20代币(AJR)并部署在以太坊私有节点上,现在我想按代币名称列出所有交易。

此外,我需要使用合约地址或代币名称列出所有代币持有者。

我尝试使用 web3 获取,但我只得到符号、名称、总供应量等,而不是代币持有者或交易

以下是我的示例代码:

from web3 import Web3

Web3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

contract_instance = Web3.eth.contract(contract_address, abi=abi)

print(contract_instance.functions.name().call())
python smartcontracts erc20 web3py go-ethereum
3个回答
20
投票

代币持有者不能通过 RPC 协议和 RPC 包装器(例如 Web3)直接获得。

有关代币持有者的信息存储在区块链上的代币合约(或其某些依赖项)中,通常以映射的形式。这意味着您不能只循环遍历所有持有者,而是需要知道地址并询问他们的余额。

// the key is the holder address, the value is their token amount
mapping (address => uint256) public balanceOf;

但是 - ERC-20 标准定义了代币合约在发生转账时应发出的

Transfer()
事件。

mapping (address => uint256) public balanceOf;

event Transfer(address indexed _from, address indexed _to, uint256 _amount);

function transfer(address _to, uint256 _amount) external returns (bool) {
    balanceOf[msg.sender] -= _amount;
    balanceOf[_to] += _amount;
    emit Transfer(msg.sender, _to, _amount);
    return true;
}

因此,您需要构建和维护该代币合约发出的所有

Transfer()
事件日志的持有者数据库。收集过去的事件日志以构建历史数据,并订阅新发出的日志以保持最新。然后,您可以将所有这些原始传输数据聚合为“地址 => 当前余额”的形式,并仅过滤可搜索数据库中具有非零余额的地址。

文档:

  • 获取 Web3 中过去的事件日志 - link
  • 订阅 Web3 中的新事件日志 - 链接

区块链探索者实际上也使用同样的方式。他们扫描每笔交易中的

Transfer()
事件,如果发射者是代币合约,他们会更新其单独数据库中的代币余额。然后,所有持有者的列表(来自这个单独的数据库)将显示在代币详细信息页面上。


7
投票

我专门为此制作了一个简单的工具holders.at。您可以导出任意区块的 ERC20、ERC721 和 ERC1155 代币持有者。

例如,这是区块高度

0x5a98fcbea516cf06857215779fd812ca3bef1b32
15000000
代币的所有代币持有者的列表:https://holders.at/ethereum/0x5a98fcbea516cf06857215779fd812ca3bef1b32/15000000


0
投票

您可以使用 Bitquery 的 代币持有者 api

这是获取代币持有者的示例

您可以在这里尝试这个API

{
  EVM(dataset: archive, network: eth) {
    TokenHolders(
      date: "2024-04-17"
      tokenSmartContract: "0x60E4d786628Fea6478F785A6d7e704777c86a7c6"
      limit: {count: 100}
      orderBy: {descending: Balance_Amount}
    ) {
      Holder {
        Address
      }
      Balance {
        Amount
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.