solidity中的memory和 storage详解
Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上。这里我会讲解一下关键字storage和memory的区别。
storage的结构是在合约部署创建时,根据你的合约中状态变量的声明,就固定下来了,并且不能在将来的合约方法调用中改变这个结构。但是,storage中的内容是可以通过交易来改变的。这些交易调用因此将修改合约的状态。
memory关键字告诉solidity应当在该函数运行时为变量创建一块空间,使其大小和结构满足函数运行的需要。
首先局部变量默认是storage类型,状态变量是强制为storage类型。
pragma solidity ^0.4.7; contract text{ string x; function f(uint[] memoryArray){ string memory y; } }
在上面的代码中,x为状态变量,y为局部变量,若将x声明为memory,则remix会报错
browser/Untitled.sol:3:12: ParserError: Expected identifier but got 'memory'
在函数中传递参数是声明为memory,则是值传递,若为storage,则是指针传递。
pragma solidity ^0.4.7; contract Unt{ string public x = "ttt"; function f(string memory memoryArray) private{ string memory my = memoryArray; bytes(my)[0] = 's'; } function f1() public{ f(x); } }
上面的代码在remix中运行之后,先调用f1函数,因为函数传递是值传递,因此查询变量x没有变化。接下来我们将函数的参数修改为storage。
pragma solidity ^0.4.7; contract Unt{ string public x = "ttt"; function f(string storage storageArray) private{ var my = memoryArray; bytes(my)[0] = 's'; } function f1() public{ f(x); } }
合约部署之后,先查看变量x为“ttt”,调用函数f1之后,再查看变量x此时已经被修改为“xtt”。storage
类型拷贝的不是值,而是x指针,当调用f函数时,相当于同时有x,y,storageArray三个指针同时指向同一个对象,我们可以通过三个指针中的任何一个指针修改他们共同指向的内容的值。
函数默认为public
类型,但是当我们的函数参数如果为storage
类型时,函数的类型必须为internal
或者private
·