在使用solidity开发以太坊智能合约时,可以为变量声明memory和storage关键字。那么,它们有什么不同之处?如果在声明合约变量时没有使用memory关键字,Solidity会尝试在storage中存储这个变量。
storage是什么
根据Solidity首席工程师Chriseth的说法:“你可以把storage想像成一个大数组,它有自己的结构,这个结构是由你的合约中的状态变量所决定的,因此在运行时不能改变”。
这就是说,storage的结构是在合约部署创建时,根据你的合约中状态变量的声明,就固定下来了,并且不能在将来的合约方法调用中改变这个结构。但是,storage中的内容是可以通过交易来改变的。这些交易调用因此将修改合约的状态,这也是为什么合约中的变量被称为状态变量的原因。因此在合约层面声明的一个uint8类型的storage变量, 它的值可以修改为任何0-255之间的有效uint8值,但是该变量在storage结构中的位置始终不会变化。
函数中的变量
如果你在合约函数中声明变量时没有使用memory关键字,那么solidity将会尝试使用storage结构,目前来讲,这样做可以通过编译,但是可能导致不可预期的结果。memory关键字告诉solidity应当在该函数运行时为变量创建一块空间,使其大小和结构满足函数运行的需要。
在合约层面你不能为变量应用memory关键字。
推荐两个以太坊相关的实战教程:
- 区块链初学者 :
- 区块链开发进阶:
更多的内容可以访问博客: