Storage

作為局部變數的值類型(uint,bool等)最初設置為記憶體?

  • January 12, 2022

根據這個答案,它說像 bool、uint 等更簡單的變數在長度上不是可變的,因此預設為 memory,而這個提到uint256 v;的是預設為 storage 。所以我有點困惑函式中使用的原始類型(int,uint,bool)是否設置為記憶體或儲存作為其預設類型。我知道數組是預設儲存的,例如:uint256[] x.

任何人都可以澄清一下嗎?

根據開發 Solidity 文件,局部變數在函式範圍內的位置似乎確實是storage.

但是,這似乎與將pure函式修飾符用作以下函式相矛盾:

function check() public pure returns (uint256) {
   uint256 a = 2;
   return a;
}

包含完全有效的語法。該關鍵字對不修改合約狀態或訪問它的pure函式有效,這意味著不可能引用變數。uint256 a``storage

為了驗證上述假設,我使用以下程式碼片段進行了測試:

儲存變數分配:

pragma solidity ^0.4.23;

contract StorageVariableTest {
   uint256 k;

   function assignValue() public {
       k = 2;
   }
}

局部函式變數賦值:

pragma solidity ^0.4.23;

contract LocalVariableTest {
   function assignValue() public {
       uint256 k = 2;
   }
}

在我的 Ganache 區塊鏈上測試這些功能顯示第二個合約片段的成本較低,這表明uint256 k = 2聲明從未儲存在合約的 storage/state中。

因此,正確的解釋是只有明確聲明為storage或存在於函式範圍之外的變數實際上才是storagevariables

Gas 費用截圖:

甘納許截圖

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