在 Solidity 中更新许多地址的状态是消耗 gas 的

Updating the state of many addresses in Solidity is gas costly

我有地址映射,需要以某种方式在合约部署时设置批量数据或能够稍后更新它

mapping (address => bool) private accounts;

这是设置地址的当前解决方案

 function setAccounts(address[] memory _accounts) public onlyOwner { 
    for(uint i=0; i< _accounts.length; i++){
       accounts[_accounts[i]] = true;
    } 

}

问题是我需要设置大约 10,000 个地址并且使用循环来完成它需要大量的 gas 并且太昂贵了。 可能无法直接传递数组,但是在没有循环的情况下在 1 笔交易中获得 10K 地址列表的解决方案是什么(或减少汽油费)

我应该改用数组并保留地址索引以便稍后过滤吗? 请指教 提前致谢

您不太可能进一步优化它。

您将达到 10,000 个交易的块大小限制。

对于一个以太坊交易无法完成的操作,必须分批进行。

只需在一次交易中先设置 0...1000 个地址,然后设置 1000...2000。

您可以使用某种替代方案 Merkle tree claim process 来优化以太坊状态大小并将 gas 成本推给用户。