1. 程式人生 > >solidity中的memory和 storage詳解

solidity中的memory和 storage詳解

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·