我们如何从令牌中获取令牌持有者?
how can we get token holders from token?
我已经创建了自己的 ERC-20 代币 (AJR) 并部署在以太坊私有节点上,现在我想按代币名称列出所有交易。
此外,我需要使用合约地址或代币名称列出所有代币持有者。
我尝试使用 web3 获取,但我只得到符号、名称、总供应量等,但没有令牌持有者或交易
下面是我的示例代码:
从 web3 导入 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())
代币持有者不能直接通过 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()
事件日志构建和维护持有者数据库。收集过去的事件日志以构建历史数据,并订阅新发出的日志以使其保持最新。然后,您可以将所有这些原始传输数据聚合为“地址 => 当前余额”的形式,并仅过滤可搜索数据库中余额非零的地址。
文档:
区块链探索者实际使用的也是同样的方式。他们扫描每笔交易以查找 Transfer()
事件,如果发射器是代币合约,他们将更新其单独数据库中的代币余额。所有持有者的列表(来自这个单独的数据库)然后显示在令牌详细信息页面上。
我已经创建了自己的 ERC-20 代币 (AJR) 并部署在以太坊私有节点上,现在我想按代币名称列出所有交易。
此外,我需要使用合约地址或代币名称列出所有代币持有者。
我尝试使用 web3 获取,但我只得到符号、名称、总供应量等,但没有令牌持有者或交易
下面是我的示例代码:
从 web3 导入 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())
代币持有者不能直接通过 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()
事件日志构建和维护持有者数据库。收集过去的事件日志以构建历史数据,并订阅新发出的日志以使其保持最新。然后,您可以将所有这些原始传输数据聚合为“地址 => 当前余额”的形式,并仅过滤可搜索数据库中余额非零的地址。
文档:
区块链探索者实际使用的也是同样的方式。他们扫描每笔交易以查找 Transfer()
事件,如果发射器是代币合约,他们将更新其单独数据库中的代币余额。所有持有者的列表(来自这个单独的数据库)然后显示在令牌详细信息页面上。