如之前所說的,智能合約在區塊鏈上運作就好像是一個class的存在,而在合約的執行過程中我們勢必須要一些「變數」來儲存資訊,例如每個人的token餘額等等。這時,就需要使用到區塊鏈上的儲存空間了。
在區塊鏈語言之中,大部分的儲存空間都是用一個key - value的方式來儲存。在Solodity裡面,常常用一個叫做mapping的資料結構,我們可以指定balance 是一個 address-to-value的mapping,每當我們輸入地址(address),就回傳餘額(value)。
在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)
小小舉個例,大家可以到我的GitHub上面看到原始碼:GitHub/@antoncoding
這裡我們先做了一個balance_key,然後就試試看用這個balance_key去讀取storage中的資料(如果沒有資料,則設為0)。讀到之後我們把這個值更新,再放回Storage中。如果你不斷重複執行這個合約,值就會不斷更新。
在儲存的過程中,總不可能永遠只是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現在也越來越成熟了,歡迎大家入坑一起來學寫自己的智能合約喔!