Evm

Solidity 0.5.0 動態大小的參數如何聲明為儲存?

  • January 9, 2019

據我了解,EVM 中的“記憶體”是一個字節數組,不能動態調整大小,而“儲存”可以調整大小。將參數聲明為儲存時會發生什麼。這個儲存寫入到哪裡?

我的假設是否正確,即當“記憶體”數組作為參數傳入時,它具有固定大小?

據我了解,EVM 中的“記憶體”是一個字節數組,不能動態調整大小,而“儲存”可以調整大小。將參數聲明為儲存時會發生什麼。這個儲存寫入到哪裡?

當標記的參數storage傳遞給函式時,傳遞的是對儲存中已存在的某些數據的*引用。*考慮以下程式碼:

pragma solidity 0.5.2;

contract Test {
   uint256[] public foo;

   function test() external {
       uint256 oldLength = foo.length;

       append(foo);

       assert(foo.length == oldLength + 1 && foo[oldLength] == 42);
   }

   function append(uint256[] storage arr) internal {
       arr.push(42);
   }
}

在這裡,foo數組一直保留在儲存中。append可以修改傳入的數組。

我的假設是否正確,即當“記憶體”數組作為參數傳入時,它具有固定大小?

作為參數傳入的記憶體數組可以是固定大小或動態大小,但我認為你得到的是它們無法調整大小,你是對的。記憶體中的數組通常不能調整大小,這包括作為memory參數傳遞的數組。這僅僅是由於記憶體佈局和儲存佈局之間的差異。有關更多詳細資訊,請參閱有關儲存佈局記憶體佈局的 Solidity 文件。

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