Ethereum 回路上的气体还原

Ethereum 回路上的气体还原,ethereum,solidity,Ethereum,Solidity,我有一个功能,需要发送令牌到许多帐户。 我知道对存储进行写入操作的成本非常高。 我已经读到,当在存储器上进行计算时,最好在一个内存变量上进行计算,然后将这个内存变量设置到存储器中,这样就可以在存储器上保存写操作 所以我想做的是这样的事情 mapping (address => uint256) private _balances; function addToBalance(address[] memory accounts,uint[] memory amounts)

我有一个功能,需要发送令牌到许多帐户。 我知道对存储进行写入操作的成本非常高。 我已经读到,当在存储器上进行计算时,最好在一个内存变量上进行计算,然后将这个内存变量设置到存储器中,这样就可以在存储器上保存写操作

所以我想做的是这样的事情

    mapping (address => uint256) private _balances;

    function addToBalance(address[] memory accounts,uint[] memory amounts) public{
        mapping (address => uint256) memory balances = _balances;
       for(uint i=0;i<accounts.length;i++){
           balances[accounts[i]]+=amounts[i];
       }
       _balances = balances;
    }

映射(地址=>uint256)私有余额;
函数addToBalance(地址[]内存帐户,uint[]内存量)公共{
映射(地址=>uint256)内存平衡=\u平衡;
对于(uint i=0;i不使用映射

映射(和动态大小数组)值都“分散”在不同的存储插槽中。插槽位置是可以确定的,但因为它们是基于哈希计算的,所以键
1
的值可以在存储插槽
123456789
中,键
2
的值可以在存储插槽
5
中。(这些数字只是为了展示一个简单的例子。)

这意味着,当您将
N
值保存到映射中时(在
N
键下),您始终需要写入(相同数量的)
N
存储插槽。写入一个(256bit)插槽需要5000汽油,并且可以快速累积

因此,除了将值移动到固定大小的数组(在存储未知量的地址的情况下,在这种用例中没有多大意义),我会考虑将交易成本转移到您的用户(有一个合格用户列表和另一个已经使用过的空投列表,并让他们自己声明)。