以太坊區塊鏈提供永久存儲。隻要區塊鏈存在,保存在區塊鏈上的所有內容都將永遠可用,但這種永久性是有代價的。優化存儲不僅可以降低成本,還可以確保以太坊的全局狀態得到高效利用。
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;
}
在Remix中部署這兩個合約,併註意在使用不衕變量時gas的差異。
在優化版本中,value1
和value2
共享一個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;
}
}
在Remix中部署此合約。
存儲一些臨時數據,然後清除數據。
查看gas費用。留意執行刪除(delete
)操作穫得的gas退款。
如果數據不需要在鏈上訪問,可以考慮將其記録爲事件而不是存儲該數據。事件比存儲操作便宜得多。
Solidity
pragma solidity ^0.8.9;
contract EventExample {
event DataStored(uint256 data);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
在Remix中部署併運行合合約。
請註意,與存儲相比,gas成本更低。
現在,你已經掌握了一些基本的存儲優化方法,務必要多加練習。你可以使用我們提供的示例,也可以嘗試創建自己的方法。在接下來的課程中,我們將深入探討函數的優化和庫中代碼的覆用。優化策略既是一門藝術,也是一門科學。跟我們一起繼續探索吧!
以太坊區塊鏈提供永久存儲。隻要區塊鏈存在,保存在區塊鏈上的所有內容都將永遠可用,但這種永久性是有代價的。優化存儲不僅可以降低成本,還可以確保以太坊的全局狀態得到高效利用。
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;
}
在Remix中部署這兩個合約,併註意在使用不衕變量時gas的差異。
在優化版本中,value1
和value2
共享一個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;
}
}
在Remix中部署此合約。
存儲一些臨時數據,然後清除數據。
查看gas費用。留意執行刪除(delete
)操作穫得的gas退款。
如果數據不需要在鏈上訪問,可以考慮將其記録爲事件而不是存儲該數據。事件比存儲操作便宜得多。
Solidity
pragma solidity ^0.8.9;
contract EventExample {
event DataStored(uint256 data);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
在Remix中部署併運行合合約。
請註意,與存儲相比,gas成本更低。
現在,你已經掌握了一些基本的存儲優化方法,務必要多加練習。你可以使用我們提供的示例,也可以嘗試創建自己的方法。在接下來的課程中,我們將深入探討函數的優化和庫中代碼的覆用。優化策略既是一門藝術,也是一門科學。跟我們一起繼續探索吧!