智能合约是怎么样存储数据的, 在memory里还是storage里存储
solidity变量怎么样存储数据的, 在memory里还是storage里
pragma solidity^0.4.17;
contract Funding{
Request[] public requests;
//请求的结构体struct
struct Request{
string name;
}
//内容返回到request[]数组中
function createRequest(string _name) public{
Request memory request = Request({
name:_name
});
requests.push(request);
}
Request[] public requests; 这个数组包含的内容就存到了storage里,也就是直接写到了所有的区块链账本里了
实验一:
pragma solidity^0.4.17;
contract test{
uint[] public array;
function Array() public{
array.push(1);
array.push(2);
uint[] storage a = array;
a[0] = 27;
}
}
//如果是storage,那么角标为0的时候输出为27
//如果是memory,那么角标为0的时候输出为1
可以得出的结论是: a和array指向的是相同的地方, a的值改了,那么也会把array里的值也改掉
实验二:
pragma solidity^0.4.17;
contract test{
uint[] public array;
function Array() public{
array.push(1);
array.push(2);
uint[] a = array;
// a[0] = 27;
change(array);
}
function change(uint[] arr){
arr[0] = 33;
}
}
//这次角标为0的时候输出为1,角标为1的时候输出为2,和实验一不同了
值传递: memory
引用传递: storage
memory是copy之前的变量然后创建新的变量,而storage是直接指向这个变量
如果是storage,那么角标为0的时候输出为27, 说明他是永久性的, 可以不断地进行调用
如果是memory,那么角标为0的时候输出为1, 说明是临时性的, 调用一次后就不能继续调用了
加一句:
所有编程语言都只有值传递, 但是这个传递的是某个对象或者变量的地址时, 就可以理解为是引用传递
这个是编写solidity的工具网址
http://remix.ethereum.org/#optimize=false&version=soljson-v0.4.24+commit.e67f0147.js