第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赞同其观点或证实其描述。