第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.