阅读(1520) (13)

以太坊 存储、内存和堆栈

2022-05-09 15:07:47 更新

以太坊虚拟机具有三个可以存储数据的区域:存储、内存和堆栈。

每个帐户都有一个称为storage的数据区域,它在函数调用和事务之间是持久的。存储是将 256 位字映射到 256 位字的键值存储。无法从合约中枚举存储,读取成本相对较高,初始化和修改存储的成本更高。由于这个成本,您应该将存储在持久存储中的内容最小化为合约需要运行的内容。在合约之外存储衍生计算、缓存和聚合等数据。合约既不能读取也不能写入除了自己的存储之外的任何存储。

第二个数据区域称为内存,其中合约为每个消息调用获取一个新清除的实例。内存是线性的,可以在字节级别寻址,但读取的宽度限制为 256 位,而写入的宽度可以是 8 位或 256 位。当访问(读取或写入)以前未触及的内存字(即字内的任何偏移量)时,内存会扩展一个字(256 位)。扩张时,必须支付gas费用。内存越大,它的成本就越高(它以二次方缩放)。

EVM 不是寄存器机,而是堆栈机,因此所有计算都在称为堆栈的数据区域上执行。它的最大大小为 1024 个元素并包含 256 位的字。通过以下方式对堆栈的访问仅限于顶端:可以将最顶端的 16 个元素之一复制到堆栈的顶部,或者将最顶端的元素与它下面的 16 个元素之一交换。所有其他操作从堆栈中获取最顶部的两个(或一个或多个,取决于操作)元素并将结果压入堆栈。当然,可以将堆栈元素移动到存储或内存中,以便更深入地访问堆栈,但在不首先移除堆栈顶部的情况下,不可能仅访问堆栈中更深的任意元素。