在區(qū)塊鏈里,區(qū)塊鏈本身就是一個數(shù)據(jù)庫柠衍。如果你使用區(qū)塊鏈標(biāo)記物產(chǎn)的所有權(quán), 歸屬信息將會被記錄到區(qū)塊鏈上萤晴,所有人都無法篡改胀茵,以標(biāo)明不可爭議的擁有權(quán)社露。
在solidity編程中,有一個數(shù)據(jù)位置的屬性用來標(biāo)識變量是否需要持久化到區(qū)塊鏈中琼娘。
我們可以通過 —— storage 或 memory 這兩個關(guān)鍵字來存儲變量
storage 與 memory 修飾的變量的區(qū)別
默認(rèn)情況下峭弟,全局點狀態(tài)變量會保存到區(qū)塊鏈上,局部到變量保存在內(nèi)存當(dāng)中 storage修飾的變量是指永久存儲在區(qū)塊鏈中的變量脱拼。?
Memory修飾變量則是臨時的瞒瘸,當(dāng)外部函數(shù)對某合約調(diào)用完成時,內(nèi)存型變量即被移除熄浓。 你可以把它想象成存儲在你電腦的硬盤或是RAM中數(shù)據(jù)的關(guān)系情臭。 但是在很多時候你都用不到這些關(guān)鍵字,默認(rèn)情況下 Solidity 會自動處理它們赌蔑。?
但是很多時候也需要我們進(jìn)行一些特殊處理,下面我們通過代碼來看一下.
contract Person {
? struct Person {
? ? string name;
? ? string sex;
? }
? Person[] persons;
? function eatSandwich(uint _index) public {
? ? // Person person = persons[_index];
? ? // ^ 看上去很直接俯在,不過 Solidity 將會給出警告
? ? // 告訴你應(yīng)該明確在這里定義 `storage` 或者 `memory`。
? ? // 所以你應(yīng)該明確定義 `storage`:
? ? Person storage myPerson = persons[_index];
? ? // ...這樣 `mySandwich` 是指向 `sandwiches[_index]`的指針
? ? // 在存儲里娃惯,另外...
? ? myPerson.sex = "女!";
? ? // ...這將永久把 `sandwiches[_index]` 變?yōu)閰^(qū)塊鏈上的存儲
? ? // 如果你只想要一個副本跷乐,可以使用`memory`:
? ? Person memory anotherPerson = persons[_index + 1];
? ? // ...這樣 `anotherSandwich` 就僅僅是一個內(nèi)存里的副本了
? ? // 另外
? ? anotherPerson.sex = "Eaten!";
? ? // ...將僅僅修改臨時變量,對 `sandwiches[_index + 1]` 沒有任何影響
? ? // 不過你可以這樣做:
? ? persons[_index + 1] = anotherPerson;
? ? // ...如果你想把副本的改動保存回區(qū)塊鏈存儲
? }
}
通過以上代碼石景,我們就可以在某些場合下也需要你顯式地聲明 storage 或 memory了劈猿!