我有地址映射,需要在合同部署时以某种方式设置批量数据或能够稍后更新
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并且太昂贵。也许,直接传递数组是不可能的,但是在一次交易中获得10K地址列表而不循环(或减少gas费)的解决方案是什么呢?
我应该使用数组代替,并保留地址索引,以过滤它以后?请通知提前感谢
您不太可能进一步对其进行气体优化。
您将达到10,000个交易的块大小限制。
对于无法在一个以太坊交易中完成的操作,必须批量完成。
设置第一个0…一次交易中有1000个地址,然后是1000个……2000 .
或者你可以使用某种Merkle树索赔流程来优化以太坊状态大小并将gas成本推给用户。