EVM 儲存
儲存是合約的永久記憶——是資料在交易結束後仍能存活、下週、明年、或合約再次被呼叫時依然在那兒的唯一所在。每份合約都有自己私有的儲存:一張從 256 位元鍵到 256 位元值的巨大鍵值對映,概念上有 2²⁵⁶ 個槽、全部初始化為零。代幣的餘額、DAO 的票數、AMM 的儲備都存在這裡。
只有兩個操作碼能碰它:SLOAD 讀取某鍵的值,SSTORE 寫入。讓儲存特殊——也讓人不可隨意揮霍——的,是它的價格。由於每個全節點都必須永久保存這份資料並將之納入全域狀態樹,寫入是 EVM 中最昂貴的操作之一。依現行規則,把一個槽從零寫成非零的 SSTORE 要 20,000 gas;修改一個已非零的槽要 5,000(2,900 加上冷存取附加費);而自 EIP-2929 起,交易中對某槽的首次讀取是 2,100 gas 的「冷」SLOAD,之後的「熱」讀取則只要 100。
被以密碼學方式提交的,正是儲存。每份合約的儲存是一棵默克爾帕特里夏字典樹,其根雜湊記在該合約的帳戶裡,而所有帳戶又匯總成區塊唯一的狀態根。這就是為什麼輕用戶端能收到一段簡短的默克爾證明「帳戶 X 的餘額是 Y」並對照區塊頭加以驗證——儲存不只是資料,它是經過認證的資料。
其實務後果催生了一整套 gas 最佳化的功夫:把儲存變數一次讀進區域(堆疊/記憶體)變數重複使用,而非反覆讀取;把數個小變數打包進同一個 32 位元組槽,讓單一 SSTORE 一併更新它們;以及清空不再需要的槽以回收部分 gas 退款。判斷錯儲存佈局也是一種安全隱患——它正是代理合約中 delegatecall 儲存碰撞臭蟲的根源。
一個常見誤解是把儲存當成「在區塊鏈上、要付租金的位元組」;你付的是寫入時一次性的高額 gas 成本,但以太坊目前沒有持續性的儲存租金——這正是何以失控的狀態增長是一項長期隱憂。