Fabric鏈碼Python開發包

1、開發包概述

Fabric-chaincode-python 開發包適用於Hyperledger Fabric區塊鏈 Python鏈碼的開發,支持Fabric 1.4和2.0。

Fabric-chaincode-ptyon開發包主要包含以下特性:

  • 完整覆蓋Fabric官方開發包(go/java/node)提供的API接口
  • 基於asyncio異步模型實現,併發性能更出色
  • 內置wiz工具箱,可快速搭建Hyperledger Fabric開發環境

Fabric-chaincode-python開發包運行在Python 3.7+環境下,當前 版本1.0.0,主要類/接口及關係如下圖所示:

Fabric鏈碼Python開發包

Fabric-chaincode-python開發包的主要代碼文件清單參見官網說明:http://sc.hubwiz.com/codebag/fabric-chaincode-python/

2、用Wiz工具箱快速啟動Fabric網絡

Wiz工具箱可以快速搭建一個簡單的Fabric網絡作為鏈碼和應用開發環境, 該網絡中僅包含單一的peer節點和orderer節點,主要特徵如下:

  • 機構及MSPID:Org1/Org1MSP
  • 通道名稱:ch1
  • 鏈碼名稱:wizcc
  • 排序節點:127.0.0.1:7050
  • 對等節點:127.0.0.1:7051/7052

啟動Fabric網絡需要使用三個終端,並分別為這三個終端設置wiz工具箱的環境變量:

<code>~/fabric-chaincode-python$ 

source

wiz_env.sh /<code>

STEP 1:在1#終端創建一個新目錄devnet用來初始化一個fabric項目:

<code>~/fabric-chaincode-python$ mkdir devnet && 

cd

devnet ~/fabric-chaincode-python/devnet$ wiz init /<code>

結果如下:

Fabric鏈碼Python開發包

STEP 2:在1#終端使用wiz net reset初始化Fabric網絡的密碼學資料和通道 初始化交易資料:

<code>~

/fabric-chaincode-python/devnet

$ wiz net reset /<code>

結果如下:

Fabric鏈碼Python開發包

STEP 3:在1#終端使用wiz net start啟動Fabric網絡的peer節點和orderer節點:

<code>~ 

/fabric-chaincode-python/devnet

$ wiz net start /<code>

結果如下:

Fabric鏈碼Python開發包

STEP 4:在2#終端使用wiz cc start啟動wiz工具箱預置的Python鏈碼:

<code>~

/fabric-chaincode-python/devnet

$ wiz cc start /<code>

結果如下:

Fabric鏈碼Python開發包

STEP 5:在3#終端使用wiz ch start命令創建通道ch1並將peer節點加入通道:

<code>~

/fabric-chaincode-python/devnet

$ wiz ch start /<code>

結果如下:

Fabric鏈碼Python開發包

測試鏈碼:在3#終端使用wiz admin命令進入管理控制檯:

<code>~ 

/fabric-chaincode-python/devnet

$ wiz admin /<code>

結果如下:

Fabric鏈碼Python開發包

使用peer chaincode query命令測試預置鏈碼的查詢:

<code>admin@org1> peer chaincode query -n wizcc -c 

'{"args":[]}'

-C ch1 /<code>

結果如下:

Fabric鏈碼Python開發包

使用peer chaincode invoke命令測試預置鏈碼的交易:

<code>admin@org1> peer chaincode invoke -n wizcc -c 

'{"args":[]}'

-C ch1 /<code>

結果如下:

Fabric鏈碼Python開發包

3、運行開發包中的演示Python鏈碼

在Hyperledger Fabric網絡啟動之後,我們就可以使用預置的演示鏈碼直接替換 devnet中的鏈碼。

例如,要運行token_demo.py示例,首先在2#終端按ctrl+c停止wiz預置鏈碼 的運行,然後進入fabric-chaincode-python根目錄執行演示鏈碼即可:

<code>~/fabric-chaincode-python$ python3 token_demo.py
/<code>

在3#終端的管理控制檯測試餘額查詢和轉賬:

<code>admin@org1> peer chaincode query -n wizcc -

c

'{

"args"

:[

"balance"

,

"tommy"

]}' -

C

ch1 admin@org1> peer chaincode invoke -n wizcc -

c

'{

"args"

:[

"transfer"

,

"tommy"

,

"jerry"

,

"10"

]}' -

C

ch1 /<code>

4、Python鏈碼開發示例

下面的Python代碼使用Fabric-chaincode-python實現了一個簡單代幣的 發行、轉賬與餘額查詢,說明詳見註釋部分:

<code>

from

fabric_shim

import

Shim

class

TokenChaincode

:

async

def

init

(self,stub)

:

await

stub.put_state(

'tommy'

,

b'1000'

)

await

stub.put_state(

'jerry'

,

b'1000'

)

return

Shim.success(

b'init ok'

)

async

def

invoke

(self,stub)

:

fcn, args = stub.get_function_and_parameters()

if

fcn ==

'reset'

:

return

await

self.init(stub)

if

fcn ==

'balance'

:

return

await

self.balance(stub,args[

0

])

if

fcn ==

'transfer'

:

return

await

self.transfer(stub,args[

0

],args[

1

],args[

2

])

return

Shim.error(

b'method not supported'

)

async

def

balance

(self,stub,account)

:

value =

await

stub.get_state(account)

return

Shim.success(

b'balance => '

+ value)

async

def

transfer

(self,stub,owner,to,value)

:

value = int(value) owner_balance =

await

stub.get_state(owner) owner_balance = int(owner_balance) - value to_balance =

await

stub.get_state(to) to_balance = int(to_balance) + value

await

stub.put_state(owner, bytes(str(owner_balance),

'utf-8'

))

await

stub.put_state(to,bytes(str(to_balance),

'utf-8'

))

return

Shim.success(

b'transfer ok'

) Shim.start( TokenChaincode() ) /<code>

5、Python鏈碼開發包API清單

Shim的主要API清單如下:

  • start():啟動鏈碼
  • success():創建成功響應對象
  • error():創建失敗響應對象

ChaincodeSupportClient的主要API清單如下:

  • chat():啟動與peer節點的雙向通信流

ChaincodeStub的主要API清單如下:

  • get_function_and_parameters():獲取鏈碼調用方法名和參數列表
  • get_txid():獲取鏈碼調用交易的ID
  • get_channel_id():獲取鏈碼調用交易的通道ID
  • get_creator():獲取鏈碼調用交易的用戶ID
  • get_transient():獲取鏈碼調用交易的暫態數據集
  • get_tx_timestamp():獲取鏈碼調用交易的時間戳
  • get_state():獲取賬本上指定鍵的狀態
  • put_state():更新賬本上指定鍵的狀態
  • delete_state():刪除賬本上指定鍵的狀態
  • set_state_validation_parameter():設置狀態驗證參數
  • get_state_validation_parameter():獲取狀態驗證參數
  • get_state_by_range():獲取賬本上指定範圍內的鍵的狀態
  • get_state_by_range_with_pagination():分頁獲取賬本上指定範圍內的鍵的狀態
  • get_query_result():獲取節點富查詢結果,僅在採用couchdb作為peer節點存儲庫是有效
  • get_query_result_with_pagination():分頁獲取節點富查詢結果
  • get_history_for_key():獲取賬本上指定鍵的更新歷史
  • invoke_chaincode():調用其他鏈碼
  • set_event():觸發鏈碼事件
  • create_composite_key():創建複合鍵
  • split_composite_key():拆分複合鍵,返回複合鍵類型和組成屬性值
  • get_state_by_partial_composite_key():使用部分複合鍵查詢賬本狀態
  • get_state_by_partial_composite_key_with_pagination():使用部分複合鍵分頁查詢賬本狀態
  • get_private_data():獲取指定私有數據集中的指定鍵的狀態
  • get_private_data_hash():獲取指定私有數據集中的指定鍵的狀態哈希
  • put_private_data():更新指定私有數據集中的指定鍵的狀態
  • delete_private_data():刪除指定私有數據集中的指定鍵
  • set_private_data_validation_parameter():設置私有數據的驗證參數
  • get_private_data_validation_parameter():獲取私有數據的驗證參數
  • get_private_data_by_range():獲取指定私有數據集中指定範圍的鍵的狀態
  • get_private_data_by_partial_composite_key():使用部分複合鍵查詢私有數據集
  • get_private_data_query_result():獲取私有數據集的富查詢結果,僅在啟用couchdb時有效


分享到:


相關文章: