NEO Development(5) - Storage on the Blockchain 儲存空間的使用
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
這個函式庫的三個函式:Get
、Put
、Delete
來操作儲存空間。這個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
現在也越來越成熟了,歡迎大家入坑一起來學寫自己的智能合約喔!
有点深奥啊。作者应该是技术达人。赞。同时区块链爱好者,欢迎交流。
感謝你看帖,哈哈
不敢不敢,只是自己玩玩而已,跟真正達人還是很大差距的
你今天过的开心吗?听说有才的人都去参加 “三个一” 活动了呢,你要不要去耍耍?倘若你想让我隐形,请回复“取消”。
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
Congratulations,
you just received a 33.33% upvote from @steemhq - Community Bot!
Wanna join and receive free upvotes yourself?
![](https://steemitimages.com/0x0/https://www.steemhq.com/steemhq_voting.gif)
Vote for
steemhq.witness
on Steemit or directly on SteemConnect and join the Community Witness.This service was brought to you by SteemHQ.com