天天看點

Fabric鍊碼開發包【Python】

Fabric-chaincode-python 開發包适用于Hyperledger Fabric區塊鍊Python鍊碼的開發,支援Fabric 1.4和2.0,官方下載下傳位址: http://sc.hubwiz.com/codebag/fabric-chaincode-python/

1、開發包概述

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

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

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

Fabric-chaincode-python開發包的主要代碼檔案清單如下:

代碼檔案 說明
fabric_shim/ fabric-chaincode-python開發包源碼目錄
fabric_shim/chaincode.py 開發包入口Shim類
fabric_shim/support_client.py ChaincodeSupportClient類
fabric_shim/stub.py ChaincodeStub類
fabric_shim/iterators.py 狀态及曆史查詢結果疊代器實作類
fabric_shim/logger.py 日志記錄器實作類
fabric_shim/utils.py 輔助工具類
fabric_shim/protos/ Hyperledger Fabric協定實作目錄
wiz/ Hyperledger Fabric快速開發工具箱目錄
wiz_env.sh WIZ工具箱環境變量設定腳本
basic_demo.py 最簡版本的Python鍊碼示範
counter_demo.py 計數器Python鍊碼示範
history_query_demo.py 曆史狀态查詢Python鍊碼示範
composite_key_demo.py 複合鍵的使用與查詢Python鍊碼示範
token_demo.py 數字代币Python鍊碼示範
couchdb_demo.py peer節點采用couchdb作為狀态庫的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工具箱的環境變量:

~/fabric-chaincode-python$ source wiz_env.sh           

__STEP 1__:在1#終端建立一個新目錄

devnet

用來初始化一個fabric項目:

~/fabric-chaincode-python$ mkdir devnet && cd devnet
~/fabric-chaincode-python/devnet$ wiz init           

結果如下:

__STEP 2__:在1#終端使用

wiz net reset

初始化Fabric網絡的密碼學資料和通道初始化交易資料:

~/fabric-chaincode-python/devnet$ wiz net reset           

__STEP 3__:在1#終端使用

wiz net start

啟動Fabric網絡的peer節點和orderer節點:

~/fabric-chaincode-python/devnet$ wiz net start           

__STEP 4__:在2#終端使用

wiz cc start

啟動wiz工具箱預置的Python鍊碼:

~/fabric-chaincode-python/devnet$ wiz cc start           

__STEP 5__:在3#終端使用

wiz ch start

指令建立通道

ch1

并将peer節點加入通道:

~/fabric-chaincode-python/devnet$ wiz ch start           

__測試鍊碼__:在3#終端使用

wiz admin

指令進入管理控制台:

~/fabric-chaincode-python/devnet$ wiz admin           

使用

peer chaincode query

指令測試預置鍊碼的查詢:

admin@org1> peer chaincode query -n wizcc -c '{"args":[]}' -C ch1           

peer chaincode invoke

指令測試預置鍊碼的交易:

admin@org1> peer chaincode invoke -n wizcc -c '{"args":[]}' -C ch1           

3、運作開發包中的示範Python鍊碼

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

例如,要運作token_demo.py示例,首先在2#終端按

ctrl+c

停止wiz預置鍊碼的運作,然後進入fabric-chaincode-python根目錄執行示範鍊碼即可:

~/fabric-chaincode-python$ python3 token_demo.py           

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

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           

4、Python鍊碼開發示例

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

from fabric_shim import Shim                                  #引入fabric_shim 

class TokenChaincode:                                         #定義鍊碼
  async def init(self,stub):                                  #鍊碼初始化處理
    await stub.put_state('tommy',b'1000')                     #向tommy發行1000代币
    await stub.put_state('jerry',b'1000')                     #向jerry發行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() )                                #啟動鍊碼           

5、Python鍊碼開發包API清單

Shim

的主要API清單如下:

  • __start()__:啟動鍊碼
  • __success()__:建立成功響應對象
  • __error()__:建立失敗響應對象

ChaincodeSupportClient

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

ChaincodeStub

  • __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時有效

Fabric鍊碼Python開發包官方下載下傳位址: