Hyperledger Fabric學習筆記——Transaction context

transaction context主要有兩個功能:首先,它允許開發人員在一個智能合約中跨transaction調用時定義和保存用戶變量,其次,它提供了範圍很廣的Fabric APIs訪問權限,範圍包括從查詢或者更新賬本(包括不可變的blockchain和可修改的world state)到檢索交易提交應用程序的數字身份。

1、示例

如下圖,CommericalPaperContext中就定義了一個用戶變量paperList,這個用戶變量可以跨transaction使用。

2、結構

transaction context除了可以包括任意數量的用戶變量(自己定義)外,還包含兩個內建的元素,這兩個元素提供了廣泛的Fabric功能,從提交transaction的客戶端到賬本訪問權限。

  • ctx.stub:用於訪問提供了廣泛transaction處理操作的APIs。這些API包括控制訪問賬本的putState()和getState(),以及用於獲得當前transaction id的getTxID()等
  • ctx.clientIdentity:用於獲得提交transaction的用戶的身份信息

下圖展示了智能合約可以通過stub和clientIdentity做什麼:

3、Stub

stub中的APIs分爲以下幾類:

(1)world state數據APIs。在圖中1處,這些APIs可以使智能合約能夠從賬本中get,put和delete對象對應的state,通過它們的key:getState()、putState()、deleteState()。

上面基本的APIs可以由查詢APIs補充,使得能夠檢索一組狀態而不是單個狀態。可以通過使用完整或者部分key或者根據數據庫中的value進行查詢,對於大型查詢,可對結果集進行分頁以減少存儲需求:getStateByRange()、getStateByRangeWithPagination()、getStateByPartialCompositeKey()等。

(2)私有數據APIs。在圖中3處,這些APIs使智能合約能與私有數據集進行交互,類似上面的world state交互API:getPrivateData()、putPrivateData()、deletePrivateData()。

同樣的,也可以由查詢API進行補充,以查詢私有數據(key或者value),不同的是,當前沒有用於私有數據集的分頁API:getPrivateDataByRange()等。

(3)transaction APIs。在圖中5處,智能合約使用這些API來檢索有關智能合約正在處理的當前transaction提議的詳細信息,包括transaction表示符,創建的時間等:getTxID()、getTxTimestamp()、getCreator()(如果是X.509證書則通常更適合使用ctx.ClientIdentity)、getSignedProposal()、getBinding()、getTransient()(允許智能合約訪問應用程序傳遞給智能合約的臨時數據,是交互的私有數據,通常與私有數據集結合使用)。

(4)Key APIs。在圖中2和4處,key api被智能合約用來操縱私有數據集或world state中的狀態key。這些api中最簡單的允許智能合約從其各個組件中形成和拆分組合key。ValidationParameter()api可以獲取和設置針對world state和私有數據的基於state的認可策略。getHistoryForKey()返回存儲值的集合來檢索state的歷史記錄,該存儲值包括執行state更新的transaction標識符,從而允許區塊鏈讀取交易。

(5)Event APIs。用於管理智能合約中的事件處理。

(6)實用APIs。有用的API的集合,不太好放入某一與定義的API類型中,因此單獨形成一個集合。包括檢索當前通道名稱,將控制權傳遞給同一對等節點上的不同鏈碼等。其中一些實用API僅在使用低級鏈碼而不是智能合約的情況下使用,這些API主要用於鏈碼輸入的詳細操作。

4、ClientIdentity

ClientIdentity接受getCreator()返回的信息並將一系列的X.509實用APIs放在頂部使得更容易使用。如getX509Certificate()、getAttributeValue()、assertAttributeValue()等。

總的來說,transaction context提供了一個自定義跨transaction的變量空間,還有兩個默認的元素,這兩個默認的元素提供了對於world state和blockchain以及應用程序等的許多APIs。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章