3

是否可以从另一个 Solidity 合约中获取给定 ERC20 代币的代币持有者列表?

由于“余额”存储在大多数 ERC20 合约的映射中,我认为这是不可能的,因为您无法获得可靠映射的键列表。

有什么我错过的吗?或者这是不可能的?

谢谢!

4

2 回答 2

7

无法直接从合约中获取 ERC20 代币持有者名单。

您是正确的,因为您无法获得 Solidity 中映射的键列表,因此您无法做到这一点,因此没有外部干预是不可能的。

话虽如此,有很多人需要此功能并执行任务来实现此目的。我能想到的最大的例子是根据他们持有的另一个代币向各个账户空投代币。大多数人这样做的方式是从区块链中读取所有代币持有者并将其存储在本地数据库中。从那里,他们将实现一个节省气体的功能,该功能将地址作为参数并以这种方式对其执行操作。

仅使用区块链是不可能实现您想要的,但是使用链上/链下逻辑的组合可以实现您的目标。

于 2018-10-02T02:43:54.693 回答
0

这也许是可能的。如果您创建一个可以在调用传输函数时选择发送者和接收者的函数,这是可能的。

mapping(address => bool) _holderList;

function transferFrom(address from, address to, uint256 amount) {
    checkHolderList(from);
    checkHolderList(to);
    _transfer(from, to, amount);
}

function checkHolderList(address _address) {
    require(balanceOf(_address) > 0, "this address can't be holder");
    require(_holderList[address] != true, "this address is already in holder list");
    _holderList[_address] = true;
}
于 2021-12-02T03:33:27.983 回答