Урок 3

Remix中的Gas优化策略

以太坊的大部分gas支出都集中在存储方面。每个改变以太坊网络状态(存储)的操作通常都很昂贵。因此,专注于数据的保存和访问方式可以显著降低成本。在本章中,我们将探讨几种在Remix中进行存储优化的方法。

存储为何如此昂贵?

以太坊区块链提供永久存储。只要区块链存在,保存在区块链上的所有内容都将永远可用,但这种永久性是有代价的。优化存储不仅可以降低成本,还可以确保以太坊的全局状态得到高效利用。

打包存储变量

介绍

Solidity将变量存储在存储插槽中。每个插槽大小为32字节。当变量可以容纳在单个插槽时,可以分别使用单个SLOAD或SSTORE操作来读取或更新它们。

示例

请看两份合约:

Solidity
// Without Optimization
pragma solidity ^0.8.9;

contract UnoptimizedStorage {
    uint256 public value1;
    uint256 public value2;
}
Solidity
// With Optimization
pragma solidity ^0.8.9;

contract OptimizedStorage {
    uint128 public value1;
    uint128 public value2;
}
  1. 在Remix中部署这两个合约,并注意在使用不同变量时gas的差异。

  2. 在优化版本中,value1value2共享一个32字节的插槽。

复用存储插槽

介绍

在完成存储插槽的使用后(尤其是完成临时数据存储时),你可以删除插槽或将其清零,以获得gas费用返还。

示例

Solidity
pragma solidity ^0.8.9;

contract RefundExample {
    uint256 public temporaryData;

    function storeTemporaryData(uint256 data) public {
        temporaryData = data;
    }

    function clearTemporaryData() public {
        delete temporaryData;
    }
}
  1. 在Remix中部署此合约。

  2. 存储一些临时数据,然后清除数据。

  3. 查看gas费用。留意执行删除(delete)操作获得的gas退款。

用事件代替存储

介绍

如果数据不需要在链上访问,可以考虑将其记录为事件而不是存储该数据。事件比存储操作便宜得多。

示例

Solidity
pragma solidity ^0.8.9;

contract EventExample {
    event DataStored(uint256 data);

    function storeData(uint256 data) public {
        emit DataStored(data);
    }
}
  1. 在Remix中部署并运行合合约。

  2. 请注意,与存储相比,gas成本更低。

小结

现在,你已经掌握了一些基本的存储优化方法,务必要多加练习。你可以使用我们提供的示例,也可以尝试创建自己的方法。在接下来的课程中,我们将深入探讨函数的优化和库中代码的复用。优化策略既是一门艺术,也是一门科学。跟我们一起继续探索吧!

Отказ от ответственности
* Криптоинвестирование сопряжено со значительными рисками. Будьте осторожны. Курс не является инвестиционным советом.
* Курс создан автором, который присоединился к Gate Learn. Мнение автора может не совпадать с мнением Gate Learn.
Каталог
Урок 3

Remix中的Gas优化策略

以太坊的大部分gas支出都集中在存储方面。每个改变以太坊网络状态(存储)的操作通常都很昂贵。因此,专注于数据的保存和访问方式可以显著降低成本。在本章中,我们将探讨几种在Remix中进行存储优化的方法。

存储为何如此昂贵?

以太坊区块链提供永久存储。只要区块链存在,保存在区块链上的所有内容都将永远可用,但这种永久性是有代价的。优化存储不仅可以降低成本,还可以确保以太坊的全局状态得到高效利用。

打包存储变量

介绍

Solidity将变量存储在存储插槽中。每个插槽大小为32字节。当变量可以容纳在单个插槽时,可以分别使用单个SLOAD或SSTORE操作来读取或更新它们。

示例

请看两份合约:

Solidity
// Without Optimization
pragma solidity ^0.8.9;

contract UnoptimizedStorage {
    uint256 public value1;
    uint256 public value2;
}
Solidity
// With Optimization
pragma solidity ^0.8.9;

contract OptimizedStorage {
    uint128 public value1;
    uint128 public value2;
}
  1. 在Remix中部署这两个合约,并注意在使用不同变量时gas的差异。

  2. 在优化版本中,value1value2共享一个32字节的插槽。

复用存储插槽

介绍

在完成存储插槽的使用后(尤其是完成临时数据存储时),你可以删除插槽或将其清零,以获得gas费用返还。

示例

Solidity
pragma solidity ^0.8.9;

contract RefundExample {
    uint256 public temporaryData;

    function storeTemporaryData(uint256 data) public {
        temporaryData = data;
    }

    function clearTemporaryData() public {
        delete temporaryData;
    }
}
  1. 在Remix中部署此合约。

  2. 存储一些临时数据,然后清除数据。

  3. 查看gas费用。留意执行删除(delete)操作获得的gas退款。

用事件代替存储

介绍

如果数据不需要在链上访问,可以考虑将其记录为事件而不是存储该数据。事件比存储操作便宜得多。

示例

Solidity
pragma solidity ^0.8.9;

contract EventExample {
    event DataStored(uint256 data);

    function storeData(uint256 data) public {
        emit DataStored(data);
    }
}
  1. 在Remix中部署并运行合合约。

  2. 请注意,与存储相比,gas成本更低。

小结

现在,你已经掌握了一些基本的存储优化方法,务必要多加练习。你可以使用我们提供的示例,也可以尝试创建自己的方法。在接下来的课程中,我们将深入探讨函数的优化和库中代码的复用。优化策略既是一门艺术,也是一门科学。跟我们一起继续探索吧!

Отказ от ответственности
* Криптоинвестирование сопряжено со значительными рисками. Будьте осторожны. Курс не является инвестиционным советом.
* Курс создан автором, который присоединился к Gate Learn. Мнение автора может не совпадать с мнением Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.