Solidity

Solidity 中的值類型函式參數儲存在哪裡?

  • August 27, 2021

當我們定義一個函式時,比如說test(uint256 val)。我認為val會在記憶體中隱式定義。但是如果我們改變函式可見性修飾符,會改變 whereval定義的位置嗎?

我對 3 個函式可見性修飾符 、publicinternal它們對可能存在external的位置的影響感興趣。val考慮到設置了函式可見性修飾符,我還對如果我們在內部或外部訪問該函式是否會有所作為感興趣。如果函式被定義為external並且我們嘗試從相同的合約程式碼內部訪問它與我們從另一個合約或從 EOA 外部訪問它,這會有所不同嗎?

如果從合約外部呼叫(交易),傳遞給外部和公共函式的參數將通過 calldata 傳遞給合約。它們不能直接修改;(如果需要,它們會被複製到記憶體中)。

功能可見性不會改變儲存位置

https://docs.soliditylang.org/en/v0.8.7/introduction-to-smart-contracts.html?highlight=storage#storage-memory-and-the-stack

$$ … $$,被呼叫的合約(可以與呼叫者相同)將接收一個新清除的記憶體實例,並可以訪問呼叫有效負載 - 這將在稱為 calldata 的單獨區域中提供。$$ … $$

要檢查這一點,您可以使用 remix 中的函式創建一個簡單的合約,例如

   function asd(uint256 value) public pure returns(uint256) {
       value = value +100;
       return value;
   }

通過調試事務,您可以在左側的記憶體面板中看到該值已復製到記憶體


除非通過storage關鍵字指定,否則在函式內部創建的變數是在記憶體中創建的,並且顯然不會在不同事務之間持久化。

– 例如,如果一個合約函式定義了一個新變數,然後呼叫另一個函式將該變數作為參數傳遞,它將從記憶體中讀取,因為它是最初創建的位置。

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