1. 程式人生 > >solidity智慧合約[37]-以太坊虛擬機器資料儲存

solidity智慧合約[37]-以太坊虛擬機器資料儲存

EVM

當呼叫solidity函式時,都會在以太坊虛擬機器當中來執行。因此瞭解以太坊虛擬機器的細節,瞭解其資料的儲存機制變得尤為重要。
以太坊虛擬機器中的空間分為3大部分。分別為storage、stack與memory。 storage空間非常特殊,其值會被礦工提交到區塊鏈上,改變區塊鏈的狀態。

下面我們將分析下面例子中,每一個變數所在以太坊evm中的位置。

下面的例子中,在執行合約中的程式碼時,變數a會儲存在以太坊evm的storage空間中。其實所有的狀態變數都會儲存在storage空間中。
add函式中的函式引數num儲存在memory空間中。
在函式中定義的變數,如在test函式中的i、j都儲存在stack空間中。
當呼叫cahngeIt函式時,會修改storage空間中的a值。
當呼叫add函式時,會將memory空間中的num值加1.
當呼叫test方法時,會在stack中開闢空間i、j。i賦值為2. j賦值為add函式的返回值3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
contract storageAndMemory{

   uint  a = 5;

   function changeIt() public {
       a  = 1000;
   }

   function add(uint num) public  returns(uint){
       num = num +1
;

       return num;
   }

   function test() public   returns(uint,uint){
        uint i  = 2;
        uint j = add(i);
        return(i,j);
   }

}

總結

1
2
3
4
5
6
7

狀態變數總是存在於storage中

函式的引數預設在memory中

函式中的本地變數預設是在stack中

storage與memory都需要消耗gas,但是storage更貴

image.png