以太坊作为全球领先的智能合约平台,其核心之一是能够支持复杂的应用逻辑和持久化状态数据,这一切的背后,以太坊虚拟机(EVM)的存储机制扮演着至关重要的角色,EVM存储不仅是智能合约执行结果的载体,更是整个以太坊状态树的关键组成部分,理解EVM的存储机制,对于智能合约开发者、优化者以及任何希望深入以太坊工作原理的人来说,都是必不可少的一课。

什么是EVM存储?

EVM存储,通常我们指的是合约的“永久存储”(Permanent Storage),也称为“状态存储”(State Storage),它是一个位于以太坊状态 trie 中的特定键值对数据库,每个智能合约都拥有自己独立的存储空间。

  • 数据持久性:存储在EVM存储中的数据会在交易之间持续存在,除非被显式修改或删除,这与EVM的“内存”(Memory)和“栈”(Stack)形成了鲜明对比,后两者都是临时性的,仅在合约执行期间存在。
  • 键值对结构:每个合约的存储空间是一个从256位(32字节)整数(键)到256位整数(值)的映射,键和值都是以太坊中的基本数据类型。
  • 全局状态的一部分:所有合约的存储共同构成了以太坊全局状态树(State Trie)的一个子集,即存储树(Storage Trie),这个状态树是以太坊区块链数据完整性的核心。

EVM存储的工作原理

  1. 存储访问与修改

    • 当智能合约需要读取或写入存储时,它会通过特定的EVM操作码(如 SLOAD 用于读取,SSTORE 用于写入)与存储进行交互。
    • SLOAD (Storage Load):从合约的存储中读取指定键对应的值,读取操作会消耗一定的 gas。
    • SSTORE (Storage Store):将一个值写入合约存储的指定键,写入操作是 EVM 中最昂贵的操作之一,其 gas 消费取决于值的变化情况(从零到非零,或从非零到零/另一个非零值)。
  2. 存储布局

    • 以太坊合约的存储在底层是以“槽位”(Slot)为单位组织的,每个槽位大小为32字节(256位)。
    • 基本数据类型:对于 uint256, int256, 随机配图