以太坊 存儲(chǔ)、內(nèi)存和堆棧

2022-05-09 15:10 更新

以太坊虛擬機(jī)具有三個(gè)可以存儲(chǔ)數(shù)據(jù)的區(qū)域:存儲(chǔ)、內(nèi)存和堆棧。

每個(gè)帳戶都有一個(gè)稱為storage的數(shù)據(jù)區(qū)域,它在函數(shù)調(diào)用和事務(wù)之間是持久的。存儲(chǔ)是將 256 位字映射到 256 位字的鍵值存儲(chǔ)。無法從合約中枚舉存儲(chǔ),讀取成本相對較高,初始化和修改存儲(chǔ)的成本更高。由于這個(gè)成本,您應(yīng)該將存儲(chǔ)在持久存儲(chǔ)中的內(nèi)容最小化為合約需要運(yùn)行的內(nèi)容。在合約之外存儲(chǔ)衍生計(jì)算、緩存和聚合等數(shù)據(jù)。合約既不能讀取也不能寫入除了自己的存儲(chǔ)之外的任何存儲(chǔ)。

第二個(gè)數(shù)據(jù)區(qū)域稱為內(nèi)存,其中合約為每個(gè)消息調(diào)用獲取一個(gè)新清除的實(shí)例。內(nèi)存是線性的,可以在字節(jié)級(jí)別尋址,但讀取的寬度限制為 256 位,而寫入的寬度可以是 8 位或 256 位。當(dāng)訪問(讀取或?qū)懭耄┮郧拔从|及的內(nèi)存字(即字內(nèi)的任何偏移量)時(shí),內(nèi)存會(huì)擴(kuò)展一個(gè)字(256 位)。擴(kuò)張時(shí),必須支付gas費(fèi)用。內(nèi)存越大,它的成本就越高(它以二次方縮放)。

EVM 不是寄存器機(jī),而是堆棧機(jī),因此所有計(jì)算都在稱為堆棧的數(shù)據(jù)區(qū)域上執(zhí)行。它的最大大小為 1024 個(gè)元素并包含 256 位的字。通過以下方式對堆棧的訪問僅限于頂端:可以將最頂端的 16 個(gè)元素之一復(fù)制到堆棧的頂部,或者將最頂端的元素與它下面的 16 個(gè)元素之一交換。所有其他操作從堆棧中獲取最頂部的兩個(gè)(或一個(gè)或多個(gè),取決于操作)元素并將結(jié)果壓入堆棧。當(dāng)然,可以將堆棧元素移動(dòng)到存儲(chǔ)或內(nèi)存中,以便更深入地訪問堆棧,但在不首先移除堆棧頂部的情況下,不可能僅訪問堆棧中更深的任意元素。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)