Solidity

讀取全域結構成員的 gas 成本是多少?

  • February 23, 2022

假設我有一個struct MyStruct具有多個成員/屬性/欄位的全域狀態變數,讀取特定成員的 gas 成本是多少?它是等於讀取整個結構的氣體成本還是更少並與該成員成比例。因此,如果一個結構有 16 個uint成員,那麼從儲存中讀取/載入 16 個成員中的 1 個的氣體成本大約是讀取/ SLOAD整個結構的氣體成本的 1/16?

從合約中的儲存讀取完整結構的成本很大程度上取決於您的結構。

您為訪問的每個儲存槽支付 gas 費用。如果您的結構跨越多個儲存槽並且您一次讀取它們(通過載入整個結構),您將比僅載入結構的特定成員支付更多的氣體。

但 Solidity 可以將多個參數放入一個插槽中。(請參閱相關問題Solidity 文件)。在這種情況下,一次讀取會更便宜,因為您一次只能訪問一個儲存槽。

當您更新結構(因此儲存寫入)時,Solidity 的這些結構儲存優化變得更加重要,因為寫入多個儲存槽比寫入單個儲存槽要昂貴得多。

注意:使用EIP-2929重複寫入或讀取相同的儲存槽變得便宜很多

引用自:https://ethereum.stackexchange.com/questions/121468