如何使用Storage API實現(xiàn)區(qū)塊鏈智能合約中持久化存儲的增刪改查
本期我們討論如何使用第二個模塊:Storage API (存儲 API)。Storage API 共有五個相關的 API,實現(xiàn)了對區(qū)塊鏈智能合約中持久化存儲的增刪改查。這五個 API 的簡單描述如下:
下面我們具體講述一下這五個 API 的使用方法。在這之前,小伙伴們可以在本體智能合約開發(fā)工具 SmartX 中新建一個合約,跟著我們進行操作。同樣,在文章最后我們將給出這次講解的所有源代碼以及視頻講解。
2. Storage API 使用方法
2.1 GetContext & GetReadOnlyContext
GetContext & GetReadOnlyContext 獲取當前智能合約運行的上下文環(huán)境,返回值為當前智能合約 hash 的反序。顧名思義,GetReadOnlyContext 獲取的是只讀模式的上下文環(huán)境。在下面的例子中,返回值是右上角顯示的合約哈希的反序。
2.2 Put
Put 函數(shù)負責將數(shù)據(jù)以字典形式存入?yún)^(qū)塊鏈。如圖所示,Put 接受三個參數(shù)。其中,GetContext 獲取當前智能合約的運行的上下文環(huán)境,key 是當前需要存儲數(shù)據(jù)的 key 值,而 value 當前需要存儲數(shù)據(jù)的 value 值。特別需要注意的是:如果 key 值在已經(jīng)在存儲中存在,那么該函數(shù)將更新其對應的 value 值。
2.3 Get
Get 函數(shù)負責通過 key 值來讀取存在區(qū)塊鏈中的數(shù)據(jù)。在下圖的示例中,可以在右側(cè)參數(shù)面板處填入 key 值運行函數(shù),讀取區(qū)塊鏈中該 key 值對應的數(shù)據(jù):
2.4 Delete
Delete 函數(shù)負責通過 key 值來刪除存在區(qū)塊鏈中的數(shù)據(jù)。在下圖的示例中,可以在右側(cè)參數(shù)面板處填入 key 值運行函數(shù),刪除區(qū)塊鏈中該 key 值對應的數(shù)據(jù):
3. Storage API 代碼示例
下面的代碼給出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五個 API 的詳細使用示例,小伙伴們可以在 SmartX 試著運行一下。
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime import Notify
def Main(operaTIon,args):
if operaTIon == ‘get_sc’:
return get_sc()
if operaTIon == ‘get_read_only_sc’:
return get_read_only_sc()
if operaTIon == ‘get_data’:
key=args[0]
return get_data(key)
if operation == ‘save_data’:
key=args[0]
value=args[1]
return save_data(key, value)
if operation == ‘delete_data’:
key=args[0]
return delete_data(key)
return False
def get_sc():
return GetContext() # 獲取智能合約句柄
def get_read_only_sc():
return GetReadOnlyContext() # 獲取智能合約只讀句柄
def get_data(key):
sc=GetContext()
data=Get(sc,key) #查詢數(shù)據(jù)
return data
def save_data(key, value):
sc=GetContext()
Put(sc,key,value) # 新增,修改數(shù)據(jù)
def delete_data(key):
sc=GetContext()
Delete(sc,key) # 刪除數(shù)據(jù)
4. 后記
區(qū)塊鏈存儲是區(qū)塊鏈整個體系的核心,本體 Storage API 的使用方法非常簡潔,對開發(fā)者非常友好。另一方面,存儲是黑客攻擊的重點,例如在之前的一期中我們提及的一種安全威脅:存儲注入攻擊 ,開發(fā)者在寫存儲相關代碼時務必注意代碼安全。
來源: 本體研究院?