天天看點

Solidity存儲關鍵詞memory含義?

在以太坊Solidity中關鍵詞

memory

的含義或者說作用(purpose)是什麼?

在檢視智能合約時,有時數組arrays用

memory

來聲明,有時不是。有什麼差別不同嗎?

以太坊開發語言solidity中的memory

沒有

memory

這個關鍵字,solidity在存儲

storage

中聲明變量。

上司Solidity開發的chriseth這麼說:”你可以把存儲

storage

看作是一個大的數組,它有一個虛拟結構,一個在運作時不能改變的結構——它是由你的智能合約中的狀态變量決定的”。

也就是說,在基于智能合約級别的變量聲明在智能合約建立時,存儲結構是在

stone

中設定的,并且不能被将來的方法調用和更改。但是,存儲的内容可以用

state variables

調用來改變。這樣的調用改變了

state

,這就是為什麼合約級變量被稱為狀态變量。是以,在合約級别聲明的變量

uint8

存儲變量可以更改為uint8(0~255)的任何有效值,但是uint8類型的值的

slot

槽位将始終存在。

如果在沒有

memory

關鍵字的函數中聲明變量,那麼solidity将嘗試使用目前已經編譯好的存儲結構,但會産生意想不到的結果。

memory

告訴solidity,以便在方法運作時為變量建立一塊空間,保證其大小和結構,這樣将來就可以在該方法中使用。

memory

不能在合約級别使用。隻有方法中使用。

以太坊虛拟機存儲

以太坊虛拟機有三個可以用來存儲的區域:

  • 1.第一個是

    storage

    存儲,所有的智能合約狀态變量都駐留在其中。每個合約都有自己的存儲,它在函數調用之間是持久的,但使用起來相當昂貴。
  • 2.第二個是

    memory

    記憶體,這是用來儲存臨時值的。它在(外部)函數調用後被清除,使用起來更便宜。
  • 3.第三個是stack棧,用來儲存小的局部變量。它幾乎是免費使用的,但隻能維護有限數量的值。

對于幾乎所有類型,都不能指定它們存儲的位置,因為它們每次使用時都會被複制。

所謂存儲位置重要的類型是結構和數組。如果你在函數調用中傳遞這些變量,那麼如果它們可以留在

memory

記憶體中或留在

storage

存儲中,它們的資料就不會被複制。這意味着你可以通過調用函數中修改它們的内容,這些修改對調用方仍然可見。

存儲位置的預設值取決于它關注的變量類型:

  • 狀态變量總是存儲在

    storage

    中。
  • 函數參數總是存儲在

    memory

  • 結構

    struct

    、數組

    array

    或映射

    mapping

    類型的局部變量預設引用存儲在

    storage

  • 在堆棧中隻是存儲值類型的局部變量(即,既不是

    array

    數組,也不是

    struct

    結構也不是

    mapping

    映射)。

原文:

http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/2/

另外推薦一些之前的教程:

  • python以太坊 ,主要是針對python圍繞web3.py進行區塊鍊以太坊應用開發的講解。
  • web3j ,主要是針對java和android程式員圍繞web3j庫進行區塊鍊以太坊開發的講解。
  • php以太坊 ,主要是介紹使用php進行智能合約開發互動,進行賬号建立、交易、轉賬、代币開發以及過濾器和事件等内容。
  • 以太坊開發 ,主要是介紹使用node.js、mongodb、區塊鍊、ipfs實作去中心化電商DApp實戰,适合進階。
  • 以太坊教程 ,主要介紹智能合約與dapp應用開發,适合入門。