在区块链里,区块链本身就是一个数据库。如果你使用区块链标记物产的所有权,归属信息将会被记录到区块链上,所有人都无法篡改,以标明不可争议的拥有权。所以在区块链中编程中,有一个数据位置的属性用来标识变量是否需要持久化到区块链中。
变量的存储有三种类型,memory,storage和calldata。最后一种数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata。这种数据位置是只读的,不会持久化到区块链。一般我们可以选择指定的是memory和storage。
memory存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。而对于storage的变量,数据将永远存在于区块链上。
1.默认的函数参数,包括返回的参数,他们是memory。而默认的局部变量是storage的。
pragma solidity ^0.4.0;
contract SimpleAssign{
struct S{string a;uint b;}
//默认参数是memory
function assign(S s) internal{
//默认的变量是storage的指针
//Type struct MemoryToLocalVar.S memory is not implicitly convertible to expected type struct MemoryToLocalVar.S storage pointer.
//S tmp = s;
}
}
pragma solidity ^0.4.0;
contract StateVariable{
struct S{