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-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>
結果如下:
STEP 2:在1#終端使用wiz net reset初始化Fabric網絡的密碼學資料和通道 初始化交易資料:
<code>~/fabric-chaincode-python/devnet
$ wiz net reset /<code>
結果如下:
STEP 3:在1#終端使用wiz net start啟動Fabric網絡的peer節點和orderer節點:
<code>~/fabric-chaincode-python/devnet
$ wiz net start /<code>
結果如下:
STEP 4:在2#終端使用wiz cc start啟動wiz工具箱預置的Python鏈碼:
<code>~/fabric-chaincode-python/devnet
$ wiz cc start /<code>
結果如下:
STEP 5:在3#終端使用wiz ch start命令創建通道ch1並將peer節點加入通道:
<code>~/fabric-chaincode-python/devnet
$ wiz ch start /<code>
結果如下:
測試鏈碼:在3#終端使用wiz admin命令進入管理控制檯:
<code>~/fabric-chaincode-python/devnet
$ wiz admin /<code>
結果如下:
使用peer chaincode query命令測試預置鏈碼的查詢:
<code>admin@org1> peer chaincode query -n wizcc -c'{"args":[]}'
-C ch1 /<code>
結果如下:
使用peer chaincode invoke命令測試預置鏈碼的交易:
<code>admin@org1> peer chaincode invoke -n wizcc -c'{"args":[]}'
-C ch1 /<code>
結果如下:
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_shimimport
Shimclass
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) + valueawait
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時有效