溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

fabric鏈碼Python開發(fā)包怎么用

發(fā)布時(shí)間:2021-12-29 09:00:46 來源:億速云 閱讀:202 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹fabric鏈碼Python開發(fā)包怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

Fabric-chaincode-python 開發(fā)包適用于Hyperledger Fabric區(qū)塊鏈Python鏈碼的開發(fā),支持Fabric 1.4和2.0,官方下載地址:http://sc.hubwiz.com/codebag/fabric-chaincode-python/。

1、開發(fā)包概述

Fabric-chaincode-ptyon開發(fā)包主要包含以下特性:

  • 完整覆蓋Fabric官方開發(fā)包(go/java/node)提供的API接口

  • 基于asyncio異步模型實(shí)現(xiàn),并發(fā)性能更出色

  • 內(nèi)置wiz工具箱,可快速搭建Hyperledger Fabric開發(fā)環(huán)境

Fabric-chaincode-python開發(fā)包運(yùn)行在**Python 3.7+**環(huán)境下,當(dāng)前版本1.0.0,主要類/接口及關(guān)系如下圖所示:

fabric鏈碼Python開發(fā)包怎么用

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

2、用Wiz工具箱快速啟動(dòng)Fabric網(wǎng)絡(luò)

Wiz工具箱可以快速搭建一個(gè)簡(jiǎn)單的Fabric網(wǎng)絡(luò)作為鏈碼和應(yīng)用開發(fā)環(huán)境,該網(wǎng)絡(luò)中僅包含單一的peer節(jié)點(diǎn)和orderer節(jié)點(diǎn),主要特征如下:

  • 機(jī)構(gòu)及MSPID:Org1/Org1MSP

  • 通道名稱:ch2

  • 鏈碼名稱:wizcc

  • 排序節(jié)點(diǎn):127.0.0.1:7050

  • 對(duì)等節(jié)點(diǎn):127.0.0.1:7051/7052

啟動(dòng)Fabric網(wǎng)絡(luò)需要使用三個(gè)終端,并分別為這三個(gè)終端設(shè)置wiz工具箱的環(huán)境變量:

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

STEP 1:在1#終端創(chuàng)建一個(gè)新目錄devnet用來初始化一個(gè)fabric項(xiàng)目:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

STEP 2:在1#終端使用wiz net reset初始化Fabric網(wǎng)絡(luò)的密碼學(xué)資料和通道初始化交易資料:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

STEP 3:在1#終端使用wiz net start啟動(dòng)Fabric網(wǎng)絡(luò)的peer節(jié)點(diǎn)和orderer節(jié)點(diǎn):

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

STEP 4:在2#終端使用wiz cc start啟動(dòng)wiz工具箱預(yù)置的Python鏈碼:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

STEP 5:在3#終端使用wiz ch start命令創(chuàng)建通道ch2并將peer節(jié)點(diǎn)加入通道:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

測(cè)試鏈碼:在3#終端使用wiz admin命令進(jìn)入管理控制臺(tái):

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

使用peer chaincode query命令測(cè)試預(yù)置鏈碼的查詢:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

使用peer chaincode invoke命令測(cè)試預(yù)置鏈碼的交易:

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

結(jié)果如下:

fabric鏈碼Python開發(fā)包怎么用

3、運(yùn)行開發(fā)包中的演示Python鏈碼

在Hyperledger Fabric網(wǎng)絡(luò)啟動(dòng)之后,我們就可以使用預(yù)置的演示鏈碼直接替換devnet中的鏈碼。

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

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

在3#終端的管理控制臺(tái)測(cè)試余額查詢和轉(zhuǎn)賬:

admin@org1> peer chaincode query -n wizcc -c '{"args":["balance","tommy"]}' -C ch2
admin@org1> peer chaincode invoke -n wizcc  -c '{"args":["transfer","tommy","jerry","10"]}' -C ch2

4、Python鏈碼開發(fā)示例

下面的Python代碼使用Fabric-chaincode-python實(shí)現(xiàn)了一個(gè)簡(jiǎn)單代幣的發(fā)行、轉(zhuǎn)賬與余額查詢,說明詳見注釋部分:

from fabric_shim import Shim                                  #引入fabric_shim 

class TokenChaincode:                                         #定義鏈碼
  async def init(self,stub):                                  #鏈碼初始化處理
    await stub.put_state('tommy',b'1000')                     #向tommy發(fā)行1000代幣
    await stub.put_state('jerry',b'1000')                     #向jerry發(fā)行1000代幣
    return Shim.success(b'init ok')                           #返回成功信息

  async def invoke(self,stub):                                #鏈碼交易處理
    fcn, args = stub.get_function_and_parameters()            #獲取鏈碼調(diào)用方法名和參數(shù)列表  
    
    if fcn == 'reset':                                        #根據(jù)方法名進(jìn)行路由
      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')                #未知的方法名返回錯(cuò)誤信息

  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):               #代幣轉(zhuǎn)賬方法
    value = int(value)
    owner_balance = await stub.get_state(owner)
    owner_balance = int(owner_balance) - value                #扣除轉(zhuǎn)出方余額
    to_balance = await stub.get_state(to)
    to_balance = int(to_balance) + value                      #增加轉(zhuǎn)入放余額
    await stub.put_state(owner,                               #更新轉(zhuǎn)出方狀態(tài)
        bytes(str(owner_balance),'utf-8')) 
    await stub.put_state(to,bytes(str(to_balance),'utf-8'))   #更新轉(zhuǎn)入方狀態(tài)
    return Shim.success(b'transfer ok')                       #返回成功信息  

Shim.start( TokenChaincode() )                                #啟動(dòng)鏈碼

5、Python鏈碼開發(fā)包API清單

Shim的主要API清單如下:

  • start():?jiǎn)?dòng)鏈碼

  • success():創(chuàng)建成功響應(yīng)對(duì)象

  • error():創(chuàng)建失敗響應(yīng)對(duì)象

ChaincodeSupportClient的主要API清單如下:

  • chat():?jiǎn)?dòng)與peer節(jié)點(diǎn)的雙向通信流

ChaincodeStub的主要API清單如下:

  • get_function_and_parameters():獲取鏈碼調(diào)用方法名和參數(shù)列表

  • get_txid():獲取鏈碼調(diào)用交易的ID

  • get_channel_id():獲取鏈碼調(diào)用交易的通道ID

  • get_creator():獲取鏈碼調(diào)用交易的用戶ID

  • get_transient():獲取鏈碼調(diào)用交易的暫態(tài)數(shù)據(jù)集

  • get_tx_timestamp():獲取鏈碼調(diào)用交易的時(shí)間戳

  • get_state():獲取賬本上指定鍵的狀態(tài)

  • put_state():更新賬本上指定鍵的狀態(tài)

  • delete_state():刪除賬本上指定鍵的狀態(tài)

  • set_state_validation_parameter():設(shè)置狀態(tài)驗(yàn)證參數(shù)

  • get_state_validation_parameter():獲取狀態(tài)驗(yàn)證參數(shù)

  • get_state_by_range():獲取賬本上指定范圍內(nèi)的鍵的狀態(tài)

  • get_state_by_range_with_pagination():分頁(yè)獲取賬本上指定范圍內(nèi)的鍵的狀態(tài)

  • get_query_result():獲取節(jié)點(diǎn)富查詢結(jié)果,僅在采用couchdb作為peer節(jié)點(diǎn)存儲(chǔ)庫(kù)是有效

  • get_query_result_with_pagination():分頁(yè)獲取節(jié)點(diǎn)富查詢結(jié)果

  • get_history_for_key():獲取賬本上指定鍵的更新歷史

  • invoke_chaincode():調(diào)用其他鏈碼

  • set_event():觸發(fā)鏈碼事件

  • create_composite_key():創(chuàng)建復(fù)合鍵

  • split_composite_key():拆分復(fù)合鍵,返回復(fù)合鍵類型和組成屬性值

  • get_state_by_partial_composite_key():使用部分復(fù)合鍵查詢賬本狀態(tài)

  • get_state_by_partial_composite_key_with_pagination():使用部分復(fù)合鍵分頁(yè)查詢賬本狀態(tài)

  • get_private_data():獲取指定私有數(shù)據(jù)集中的指定鍵的狀態(tài)

  • get_private_data_hash():獲取指定私有數(shù)據(jù)集中的指定鍵的狀態(tài)哈希

  • put_private_data():更新指定私有數(shù)據(jù)集中的指定鍵的狀態(tài)

  • delete_private_data():刪除指定私有數(shù)據(jù)集中的指定鍵

  • set_private_data_validation_parameter():設(shè)置私有數(shù)據(jù)的驗(yàn)證參數(shù)

  • get_private_data_validation_parameter():獲取私有數(shù)據(jù)的驗(yàn)證參數(shù)

  • get_private_data_by_range():獲取指定私有數(shù)據(jù)集中指定范圍的鍵的狀態(tài)

  • get_private_data_by_partial_composite_key():使用部分復(fù)合鍵查詢私有數(shù)據(jù)集

  • get_private_data_query_result():獲取私有數(shù)據(jù)集的富查詢結(jié)果,僅在啟用couchdb時(shí)有效

以上是“fabric鏈碼Python開發(fā)包怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI