Solidity是一種智能合約高級語言,運行在Ethereum虛擬機(EVM)之上。這里我會講解一下關鍵字storage和memory的區別。
storage的結構是在合約部署創建時,根據你的合約中狀態變量的聲明,就固定下來了,並且不能在將來的合約方法調用中改變這個結構。但是,storage中的內容是可以通過交易來改變的。這些交易調用因此將修改合約的狀態。
memory關鍵字告訴solidity應當在該函數運行時為變量創建一塊空間,使其大小和結構滿足函數運行的需要。
首先局部變量默認是storage類型,狀態變量是強制為storage類型。
pragma solidity ^0.4.7; contract text{ string x; function f(uint[] memoryArray){ string memory y; } }
在上面的代碼中,x為狀態變量,y為局部變量,若將x聲明為memory,則remix會報錯
browser/Untitled.sol:3:12: ParserError: Expected identifier but got 'memory'
在函數中傳遞參數是聲明為memory,則是值傳遞,若為storage,則是指針傳遞。
pragma solidity ^0.4.7; contract Unt{ string public x = "ttt"; function f(string memory memoryArray) private{ string memory my = memoryArray; bytes(my)[0] = 's'; } function f1() public{ f(x); } }
上面的代碼在remix中運行之后,先調用f1函數,因為函數傳遞是值傳遞,因此查詢變量x沒有變化。接下來我們將函數的參數修改為storage。
pragma solidity ^0.4.7; contract Unt{ string public x = "ttt"; function f(string storage storageArray) private{ var my = memoryArray; bytes(my)[0] = 's'; } function f1() public{ f(x); } }
合約部署之后,先查看變量x為“ttt”,調用函數f1之后,再查看變量x此時已經被修改為“xtt”。storage
類型拷貝的不是值,而是x指針,當調用f函數時,相當於同時有x,y,storageArray三個指針同時指向同一個對象,我們可以通過三個指針中的任何一個指針修改他們共同指向的內容的值。
函數默認為public
類型,但是當我們的函數參數如果為storage
類型時,函數的類型必須為internal
或者private
·