通过这个Solidity gas优化技巧,节省超过十万的gas

  • bloqarl
  • 发布于 2024-01-13 20:58
  • 阅读 34

本文讨论了在Solidity智能合约中优化Gas消耗的方法,尤其是如何使用uint256代替布尔值,以减少不必要的SLOAD操作,进而节省Gas成本。文章通过示例展示了优化前后的Gas消耗差异,并提及相关工具与资源以帮助读者进一步了解气体优化策略。

照片由 Danny HoweUnsplash 上提供

如果你无法因为付费墙而阅读这篇文章,请点击此处免费阅读!

布尔值比 uint256 或任何占满一个字的类型更昂贵,因为每次写操作都会发出额外的 SLOAD 以首先读取插槽的内容,替换布尔值占用的位,然后再写回。

如果这听起来很熟悉,那是因为你可能在 Openzeppelin 的 ReentrancyGuard 智能合约中读到或听说过。

这种方法具有巨大的节省气体的潜力,我想向你展示在什么情况下它可以对优化智能合约的Gas消耗产生很大影响。

如果你还不知道如何通过热访问节省气体,尤其是不知道从零值更改为非零值是多么昂贵,请先阅读这篇文章:“ 理解 EVM 的工作原理可以节省你的气体”。

你现在也可以观看我在 Remix 中解释这个内容的视频:

如何在 uint256 中处理状态更改,而不是使用 bool?

让我们来找出答案。

这是一个简单的智能合约,我们能够将地址添加到或移除出白名单。

contract GasOptimization {

    address owner;

    mapping(address => bool) whitelistedAddresses;

    // 311497 gas
    constructor() {
      owner = msg.sender;
    }

    modifier onlyOwner() {
      require(msg.sender == owner, "Ownable: caller is not the owner");
      _;
    }

    modifier isWhitelisted(address _address) {
      require(whitelistedAddresses[_address], "Whitelist: You need to be whitelisted");
      _;
    }

    // 24857 gas
    function addUser(address _addressToWhitelist) public onlyOwner {
      whitelistedAddresses[_addressToWhitelist] = true;
    }

    // 7801 gas
    function…
  • 原文链接: medium.com/@bloqarl/save...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
bloqarl
bloqarl
江湖只有他的大名,没有他的介绍。