NEO Development(5) - Storage on the Blockchain 儲存空間的使用

in #cn6 years ago

NEO Development(5) - Storage on the blockchain

如之前所說的,智能合約在區塊鏈上運作就好像是一個class的存在,而在合約的執行過程中我們勢必須要一些「變數」來儲存資訊,例如每個人的token餘額等等。這時,就需要使用到區塊鏈上的儲存空間了。

在區塊鏈語言之中,大部分的儲存空間都是用一個key - value的方式來儲存。在Solodity裡面,常常用一個叫做mapping的資料結構,我們可以指定balance 是一個 address-to-value的mapping,每當我們輸入地址(address),就回傳餘額(value)。

Storage in neo-python

neo-python中,承襲了python不需定義變數型態的隨便方便性,我們可以簡單的動用Storage這個函式庫的三個函式:GetPutDelete來操作儲存空間。這個Storage非常簡單,可以把他想像成一個很大的字典,只要放入相對應的Key就可以得到儲存的值(可能是各種型態)。

因此我們在程式中唯一要做的就是使用不同的key來配對不同數值,例如儲存address_a餘額的空間,可以設定存取這個值的key為address_a_balance,而儲存它的使用者名稱為address_a_username,在搞清楚我們自己key的設計之後,我們就只要利用下面的寫法就能儲存一個變數到Storage中:

儲存:Put(GetContext(), key_string, value)
取出:Get(GetContext(), key_string)
刪除:Delete(GetContext(), key_string)

Small Example

小小舉個例,大家可以到我的GitHub上面看到原始碼:GitHub/@antoncoding

這裡我們先做了一個balance_key,然後就試試看用這個balance_key去讀取storage中的資料(如果沒有資料,則設為0)。讀到之後我們把這個值更新,再放回Storage中。如果你不斷重複執行這個合約,值就會不斷更新。

Store other Data Structure

在儲存的過程中,總不可能永遠只是key-value的配對,像是我們最常想要儲存的東西就是List,可以用來儲存已經註冊的帳號等等。但List這個東西現在還不能直接丟到Storage中(未來搞不好會支援),所以一定要在丟進去之前先進行Serialize的動作,把陣列轉換成Binary才能儲存。而讀取出來之後,我們則需要透過Deserialize,將它轉回List進行操作。

GitHub Link: https://github.com/antoncoding/neo-smart-contracts/blob/master/sample-list.py

大概就是這樣了,這就是智能合約中會需要用到的儲存技巧了。neo-python現在也越來越成熟了,歡迎大家入坑一起來學寫自己的智能合約喔!

Sort:  

有点深奥啊。作者应该是技术达人。赞。同时区块链爱好者,欢迎交流。

感謝你看帖,哈哈

不敢不敢,只是自己玩玩而已,跟真正達人還是很大差距的

你今天过的开心吗?听说有才的人都去参加 “三个一” 活动了呢,你要不要去耍耍?倘若你想让我隐形,请回复“取消”。

You got a 2.38% upvote from @upme thanks to @antonsteemit! Send at least 3 SBD or 3 STEEM to get upvote for next round. Delegate STEEM POWER and start earning 100% daily payouts ( no commission ).

You got a 58.26% upvote from @oceanwhale With 35+ Bonus Upvotes courtesy of @antonsteemit! Delegate us Steem Power & get 100%daily rewards Payout! 20 SP, 50, 75, 100, 150, 200, 300, 500,1000 or Fill in any amount of SP Earn 1.25 SBD Per 1000 SP | Discord server

YOU JUST GOT UPVOTED

Congratulations,
you just received a 33.33% upvote from @steemhq - Community Bot!

Wanna join and receive free upvotes yourself?
Vote for steemhq.witness on Steemit or directly on SteemConnect and join the Community Witness.

This service was brought to you by SteemHQ.com

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 60793.36
ETH 2909.65
USDT 1.00
SBD 3.64