【问题标题】:gas reduce on loops气体减少循环
【发布时间】:2021-04-29 18:42:01
【问题描述】:

我有一个需要向很多帐户发送令牌的功能。 我知道对商店的写操作非常昂贵。 我读过在存储计算时最好在内存变量上执行,然后将此内存变量设置到存储中,然后将写入操作保存在存储上。

所以我想做的是这样的

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

_balances 映射可以变得非常大。那么它真的是降低成本的更好方法吗?

【问题讨论】:

    标签: ethereum solidity


    【解决方案1】:

    没有映射。

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

    这意味着,当您将 N 值保存到映射中(在 N 键下)时,您始终需要写入(相同数量的)N 存储槽。写入一个(256 位)插槽需要 5,000 个 gas,而且可以很快加起来。

    因此,除了将值移动到固定大小的数组中(在此用例中,当您存储未知数量地址的余额时,这没有多大意义),我会考虑将交易成本转移到您的用户(有一个符合条件的用户列表和另一个已使用空投的列表,让他们自己认领)。

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2011-12-22
      相关资源
      最近更新 更多