在 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 成本推给用户。
我有地址映射,需要以某种方式在合约部署时设置批量数据或能够稍后更新它
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 成本推给用户。