在深入探讨以太坊虚拟机(EVM)的内部工作机制时,“内存”(Memory)是一个不可或缺的核心概念,它并非我们日常计算机中物理意义上的RAM,而是EVM为每个独立合约调用提供的一块临时、易失性的存储区域,理解以太坊的Memory,对于开发者编写高效、安全的智能合约,以及分析合约的执行成本至关重要。

以太坊Memory是什么?

以太坊Memory可以看作是EVM在执行智能合约函数时的一块“工作台”或“草稿纸”,它是一个线性的字节数组,其大小在合约执行过程中可以动态扩展,与EVM的另外两个存储区域——存储(Storage).calldata(调用数据)——相比,Memory具有以下显著特性:

  1. 临时性(Volatile):Memory的生命周期仅限于当前合约调用,当合约执行结束(无论是成功返回还是异常终止),Memory中的所有数据都会被清空,不会被持久化保存。
  2. 线性结构:Memory被组织成一个从0地址开始的连续的字节数组,访问Memory中的数据需要指定起始位置和长度。
  3. 动态可扩展:Memory的初始大小为0,但在合约执行过程中,当需要写入超出当前Memory大小的数据时,EVM会自动扩展Memory的大小,这种扩展操作不是免费的,它会消耗一定的Gas。
  4. 读写速度较快:相比Storage,Memory的读写操作要快得多,消耗的Gas也相对较少,这使得Memory非常适合存储临时计算过程中的中间变量、复杂数据结构(如动态数组、结构体)的副本,或者作为函数参数和返回值的传递媒介。

Memory与Storage、Calldata的区别

为了更好地理解Memory,我们将其与EVM的其他存储空间进行对比:

特性 Memory (内存) Storage (存储) Calldata (调用数据)
持久性 临时,调用结束即清空 持久化,存储在区块链上 临时,仅用于函数调用参数
访问速度 最快(只读)
Gas成本 写入扩展时成本较高,读写相对较低 读写成本都较高 读取免费
数据结构 线性字节数组,可动态扩展 键值对(哈希映射) 线性字节数组,大小固定,不可修改
主要用途 临时变量、计算中间结果、数据副本 合约的状态变量,持久化存储 函数输入参数
  • Storage 是“硬盘”,用于保存合约的长期状态,修改成本高。
  • Memory 是“内存条”,用于当前调度的快速计算和数据处理,临时存在。
  • Calldata 是“只读输入参数区”,用于传递函数调用时的原始数据。随机配图