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