在区块链里,区块链本身就是一个数据库。如果你使用区块链标记物产的所有权, 归属信息将会被记录到区块链上,所有人都无法篡改,以标明不可争议的拥有权。
在solidity编程中,有一个数据位置的属性用来标识变量是否需要持久化到区块链中。
我们可以通过 —— storage 或 memory 这两个关键字来存储变量
storage 与 memory 修饰的变量的区别
默认情况下,全局点状态变量会保存到区块链上,局部到变量保存在内存当中 storage修饰的变量是指永久存储在区块链中的变量。
Memory修饰变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。 你可以把它想象成存储在你电脑的硬盘或是RAM中数据的关系。 但是在很多时候你都用不到这些关键字,默认情况下 Solidity 会自动处理它们。
但是很多时候也需要我们进行一些特殊处理,下面我们通过代码来看一下.
contract Person {
struct Person {
string name;
string sex;
}
Person[] persons;
function eatSandwich(uint _index) public {
// Person person = persons[_index];
// ^ 看上去很直接,不过 Solidity 将会给出警告
// 告诉你应该明确在这里定义 `storage` 或者 `memory`。
// 所以你应该明确定义 `storage`:
Person storage myPerson = persons[_index];
// ...这样 `mySandwich` 是指向 `sandwiches[_index]`的指针
// 在存储里,另外...
myPerson.sex = "女!";
// ...这将永久把 `sandwiches[_index]` 变为区块链上的存储
// 如果你只想要一个副本,可以使用`memory`:
Person memory anotherPerson = persons[_index + 1];
// ...这样 `anotherSandwich` 就仅仅是一个内存里的副本了
// 另外
anotherPerson.sex = "Eaten!";
// ...将仅仅修改临时变量,对 `sandwiches[_index + 1]` 没有任何影响
// 不过你可以这样做:
persons[_index + 1] = anotherPerson;
// ...如果你想把副本的改动保存回区块链存储
}
}
通过以上代码,我们就可以在某些场合下也需要你显式地声明 storage 或 memory了!
网友评论