下方将介绍EVM的各种存储区域。

Storage

该存储区保存contract的全局变量,是合约状态的一部分,其值在每次交易间保持连贯性,是持久的存储区。

  1. permission:rw
  2. opcode:sstore,sload...
  3. gas fee:较高,因为区块链需要一直保留这个区域内的数据,会被认为是一种昂贵的操作。
  4. 可用地址范围:0~2^256,同时,分配是离散的,只有被使用了的区域会被分配和保留。

Storage

Memory

每次call都会新建的区域,内部的数据仅供本次call使用,是一个临时区域。同时许多opcode强制从memory读取数据,比如SHA3、RETURN等,同时也用于存储一些比较大的数据结构(?暂时没这种例子。。。)。

  1. permission:rw
  2. opcode:mstore,mload...
  3. gas fee:较低,费用同时还和本次新分配出的内存大小相关,参考文档
  4. 可用地址范围:0~2^256,从gas fee的设计上可以认为EVM对齐的分配是连续的,使用addr时会确保0~addr都分配出来,所以由于gas fee限制,真正可用的地址范围不大。

Memory

Calldata

call到合约时参数的存储区域,大小不可变,内容也不可变。在solidity中标识为calldata是用于指示编译器不要将数据从calldata区拷贝到memory,节省gas。

  1. permission:r