以太坊虛擬機(EVM)數據存儲機制概述
以太坊虛擬機(EVM)是執行智能合約的運行時環境,其高效且安全的數據存儲機制是整個以太坊生態系統穩定運行的基石。理解EVM如何處理和存儲數據,對於智能合約開發者優化合約性能、降低Gas成本以及確保合約安全至關重要。EVM主要提供了五種數據存儲區域,每種都有其獨特的特性、生命週期和Gas成本模型。
Storage:智能合約的持久化存儲

Storage 是智能合約最核心的存儲區域,用於保存合約的永久狀態數據。其主要特性包括:
- 持久性:數據永久保存在區塊鏈上,可在不同函數調用和交易之間持續訪問。
- 結構:每個智能合約擁有獨立的存儲空間,被組織成一個巨大的鍵值對映射,共有2^256個槽位,每個槽位大小為32字節(256位)。
- 數據結構存儲方式:
- 基本類型:固定大小的變量(如
uint256)按聲明順序依次佔用存儲槽位,從槽位0開始。EVM會嘗試將小於32字節的變量打包到同一個槽位以節省空間和Gas。 - 靜態數組:元素按順序存儲在連續的槽位中。
- 動態數組:第一個存儲槽位保存數組長度,實際元素從
keccak256(slot)計算出的位置開始存儲。 - 映射(Mappings):類似於哈希表,鍵值對不連續存儲。每個鍵值對的存儲位置通過對鍵和映射在存儲中的位置進行哈希計算得出。
- 結構體(Structs):結構體內的變量按順序存儲,EVM會嘗試將多個變量打包到單個32字節的存儲槽位中。
- 基本類型:固定大小的變量(如
- Gas成本:寫入數據到Storage的Gas費用最高。修改一個存儲槽位從零到非零值成本約20,000 Gas。首次讀取(cold SLOAD)成本約2,100 Gas,後續讀取(warm SLOAD)成本約100 Gas。
截至2026年4月,關於存儲定價和Gas核算的設計仍在持續探索中,旨在優化EVM存儲增長的控制,例如實時Gas核算、延遲Gas核算、分離存儲費用和按數量控制存儲增長等方法。
Memory:函數執行期間的臨時內存
Memory 是一個臨時、可變的存儲區域,其數據僅在合約函數執行期間存在。函數執行結束後,Memory中的數據即被釋放。

- 用途:適用於中間計算、臨時變量以及在單個函數調用內的數據操作。
- Gas成本:比Storage便宜,但隨着內存使用量的增加,Gas成本呈二次方增長。
Calldata:外部函數調用的只讀參數
Calldata 是一種只讀、不可變的特殊數據位置,主要用於存儲外部函數調用的參數。它是一個字節可尋址的空間,比Memory更高效,特別適用於傳遞動態數據且無需修改的情況。
- 用途:外部函數調用的輸入參數。
- Gas成本:比Memory更便宜。每個非零字節的Calldata成本為16 Gas,零字節為4 Gas。
Stack:EVM的執行棧

EVM是一個基於棧的虛擬機,Stack 是一個後進先出(LIFO)的數據結構,用於存儲智能合約執行過程中的臨時值。EVM的操作碼(Opcode)直接操作棧上的數據。
- 特性:每個棧元素32字節,最大深度為1024個元素。
- 限制:棧不能直接存儲數組、字符串或映射等複雜類型。
- Gas成本:操作Gas成本相對較低,但有深度限制。
Transient Storage:單交易生命週期的瞬時存儲
通過EIP-1153引入的Transient Storage 是一種非永久性存儲,其數據僅在單個交易的持續時間內存在,交易結束後即被清除。它提供了一種在同一交易內不同函數調用之間共享數據的低成本方式,而無需將數據永久寫入區塊鏈。
- 可用性:Solidity v0.8.30開始支持值類型(如
uint256,bool)的瞬時存儲,通過transient關鍵字訪問。對引用類型的支持預計在未來版本中提供。 - Gas成本:相對於Storage的永久寫入,Transient Storage的成本顯著降低,因為它不涉及鏈上狀態的永久修改。
Gas成本對比與優化策略

理解不同存儲類型的Gas成本差異,是智能合約開發者進行優化的關鍵。Storage的寫入成本最高,應儘量減少不必要的鏈上存儲。Memory和Calldata則適用於臨時數據和函數參數傳遞,其中Calldata因其只讀特性,在傳遞大量動態數據時通常更具成本效益。Transient Storage則為單交易內的跨函數數據共享提供了新的低成本選擇。
智能合約開發者應根據數據的持久性、可變性、訪問頻率和Gas成本來選擇合適的存儲位置。例如,重排結構體變量以最小化槽位使用,儘可能使用靜態數組,並明智地使用映射,都是優化存儲佈局、降低Gas成本的有效方法。同時,審計師也需要深入理解EVM的內存模型和存儲機制,以識別潛在的漏洞和Gas優化機會。



