存储
每个账户有一块持久化内存区域被称为存储。其形式为 key-value,key 和 value 的长度
均为 256 比特。
在合约里,不能遍历账户的存储。相对于另外两种,存储的读操作相对来
说开销较大,修改存储更甚。
一个合约只能对它自己的存储进行读写。
主存
第二个内存区被称为主存。合约执行每次消息调用时,都有一块新的,被清除过的主存。
主存可以以字节粒度寻址,但是读写粒度为 32 字节(256 比特)。操作主存的开销随着其增
长而变大(平方级别)。
栈
EVM 不是基于寄存器,而是基于栈的虚拟机。因此所有的计算都在一个被称为栈的区域执
行。栈最大有 1024 个元素,每个元素 256 比特。对栈的访问只限于其顶端,方式为:允
许拷贝最顶端的 16 个元素中的一个到栈顶,或者是交换栈顶元素和下面 16 个元素中的一
个。
所有其他操作都只能取最顶的两个(或一个,或更多,取决于具体的操作)元素,并把
结果压在栈顶。当然可以把栈上的元素放到存储或者主存中。但是无法只访问栈上指定深度
的那个元素,在那之前必须要把指定深度之上的所有元素都从栈中移除才行。