【问题标题】:Getting a list of ERC20 token holders in solidity获得一份可靠的 ERC20 代币持有者名单
【发布时间】:2019-03-07 03:56:22
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: ethereum solidity smartcontracts erc20 ether


    【解决方案1】:

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

    您是正确的,因为您无法获取 Solidity 中映射的键列表,因此如果没有外部干预,这是不可能的。

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

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

    【讨论】:

    • 谢谢谢恩!不幸的是,脱链解决方案无法正常工作,因为我需要不信任地执行此操作。哦,好吧!
    • 如果代币是像 Safemoon 这样对销售交易征税并将金额分配给代币持有者的代币怎么办 - 如果 Safemoon 合约可以遍历账户列表,也许也可以从另一个合约中执行? (作为一个完整的初学者提问)
    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2021-11-01
      • 1970-01-01
      • 2018-04-04
      • 2021-06-24
      • 2019-11-30
      相关资源
      最近更新 更多