成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

fabricgosdk是什么

小編給大家分享一下fabric go sdk是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了江陽免費(fèi)建站歡迎大家使用!

fabric go sdk是Hyperledger Fabric官方提供的Go語言開發(fā)包,應(yīng)用程序可以利用fabric go sdk與fabric網(wǎng)絡(luò)進(jìn)行交互并訪問鏈碼。本教程介紹如何使用fabric go sdk實(shí)現(xiàn)鏈碼的安裝、實(shí)例化、交易提交 和狀態(tài)查詢等操作。

本文把與Hyperledger fabric網(wǎng)絡(luò)交互的baas、應(yīng)用程序、客戶端統(tǒng)稱成為客戶端,它們可以使用fabric go sdk和fabric區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行交互,fabric go sdk調(diào)用grpc可以與指定的peer和orderer進(jìn)行通信,本文的目的是在BYFN搭建的fabric網(wǎng)絡(luò)的基礎(chǔ)之上,展示如何使用fabric go sdk操作鏈碼:

fabric go sdk是什么

1、fabric go sdk簡(jiǎn)介

fabric go sdk是Fabric官方的Go語言SDK,它的目錄結(jié)構(gòu)如下:

fabric go sdk是什么

有2個(gè)目錄需要注意一下,internal和third_party,它們兩個(gè)包含了fabric go sdk依賴的一些代碼,來自于fabric、fabric-ca,當(dāng)使用到fabric的一些類型時(shí),應(yīng)當(dāng)使用以下的方式,而不是直接導(dǎo)入fabric或者fabric-ca:

import "github.com/hyperledger/fabric go sdk/third_party/github.com/hyperledger/fabric/xxx"

pkg目錄是fabric go sdk的主要實(shí)現(xiàn),doc文檔介紹了不同目錄所提供的功能,以及給出了接口調(diào)用樣例:

  • pkg/fabsdk:主package,主要用來生成fabsdk以及fabric go sdk中其他pkg使用的option context。

  • pkg/client/channel:主要用來調(diào)用、查詢Fabric鏈碼,或者注冊(cè)鏈碼事件。

  • pkg/client/resmgmt:主要用來Hyperledger fabric網(wǎng)絡(luò)的管理,比如創(chuàng)建通道、加入通道,安裝、實(shí)例化和升級(jí)鏈碼。

  • pkg/client/event:配合channel模塊來進(jìn)行Fabric鏈碼事件的注冊(cè)和過濾。

  • pkg/client/ledger:主要用來實(shí)現(xiàn)Fabric賬本的查詢,查詢區(qū)塊、交易、配置等。

  • pkg/client/msp:主要用來管理fabric網(wǎng)絡(luò)中的成員關(guān)系。

3、使用fabric go sdk的一般步驟

  • 為client編寫配置文件config.yaml

  • 為client創(chuàng)建fabric sdk實(shí)例fabsdk

  • 為client創(chuàng)建resource manage client,簡(jiǎn)稱RC,RC用來進(jìn)行管理操作的client, 比如通道的創(chuàng)建,鏈碼的安裝、實(shí)例化和升級(jí)等

  • 為client創(chuàng)建channel client,簡(jiǎn)稱CC,CC用來鏈碼的調(diào)用、查詢以及鏈碼事件 的注冊(cè)和取消注冊(cè)

4、fabric go sdk配置文件config.yaml概述

client使用sdk與fabric網(wǎng)絡(luò)交互,需要告訴sdk兩類信息:

  • 我是誰:即當(dāng)前client的信息,包含所屬組織、密鑰和證書文件的路徑等, 這是每個(gè)client專用的信息。

  • 對(duì)方是誰:即fabric網(wǎng)絡(luò)結(jié)構(gòu)的信息,channel、org、orderer和peer等 的怎么組合起當(dāng)前fabric網(wǎng)絡(luò)的,這些結(jié)構(gòu)信息應(yīng)當(dāng)與configytx.yaml中是一致的。這是通用配置,每個(gè)客戶端都可以拿來使用。另外,這部分信息并不需要是完整fabric網(wǎng)絡(luò)信息,如果當(dāng)前client只和部分節(jié)點(diǎn)交互,那配置文件中只需要包含所使用到的網(wǎng)絡(luò)信息。

fabric go sdk是什么

5、使用go mod管理fabric go sdk項(xiàng)目的依賴

fabric go sdk目前本身使用go modules管理依賴,從go.mod可知,依賴的一些包指定了具體的版本, 如果你的項(xiàng)目依賴的版本和fabric go sdk依賴的版本不同,會(huì)產(chǎn)生編譯問題。

因此建議項(xiàng)目也使用go moudles管理依賴,然后相同的軟件包可以使用相同的版本,可以這樣操作:

  • go mod init初始化好項(xiàng)目的go.mod文件。

  • 編寫代碼,完成后運(yùn)行g(shù)o mod run,會(huì)自動(dòng)下載依賴的項(xiàng)目,但版本可能與 fabric go sdk中的依賴版本不同,編譯存在問題。

  • 把go.mod中的內(nèi)容復(fù)制到項(xiàng)目的go.mod中,然后保存,go mod會(huì)自動(dòng)合并相同的依賴, 運(yùn)行g(shù)o mod tidy,會(huì)自動(dòng)添加新的依賴或刪除不需要的依賴。

6、創(chuàng)建fabric go sdk的入口實(shí)例

通過config.FromFile解析配置文件,然后通過fabsdk.New創(chuàng)建fabric go sdk的入口實(shí)例。

import "github.com/hyperledger/fabric go sdk/pkg/core/config"
import "github.com/hyperledger/fabric go sdk/pkg/fabsdk"

sdk, err := fabsdk.New(config.FromFile(c.ConfigPath))
if err != nil {
  log.Panicf("failed to create fabric sdk: %s", err)
}

7、創(chuàng)建fabric go sdk的資源管理客戶端

管理員賬號(hào)才能進(jìn)行Hyperledger fabric網(wǎng)絡(luò)的管理操作,所以創(chuàng)建資源管理客戶端一定要使用管理員賬號(hào)。

通過fabsdk.WithOrg("Org1")和fabsdk.WithUser("Admin")指定Org1的Admin賬戶,使用sdk.Context創(chuàng)建clientProvider,然后通過resmgmt.New創(chuàng)建fabric go sdk資源管理客戶端。

import 	"github.com/hyperledger/fabric go sdk/pkg/client/resmgmt"

rcp := sdk.Context(fabsdk.WithUser("Admin"), fabsdk.WithOrg("Org1"))
rc, err := resmgmt.New(rcp)
if err != nil {
  log.Panicf("failed to create resource client: %s", err)
}

8、創(chuàng)建fabric go sdk的通道客戶端

使用用戶賬號(hào)創(chuàng)建fabric go sdk的通道客戶端,以便進(jìn)行fabric鏈碼的調(diào)用和查詢。使用sdk.ChannelContext創(chuàng)建channelProvider,需要指定channelID和用戶User1,然后通過channel.New創(chuàng)建通道客戶端,這個(gè)通道客戶端就是調(diào)用channelID對(duì)應(yīng)channel上鏈碼的channel client。

import 	"github.com/hyperledger/fabric go sdk/pkg/client/channel"

ccp := sdk.ChannelContext(ChannelID, fabsdk.WithUser("User1"))
cc, err := channel.New(ccp)
if err != nil {
  log.Panicf("failed to create channel client: %s", err)
}

9、使用fabric go sdk的資源管理客戶端安裝鏈碼

安裝Fabric鏈碼使用資源管理客戶端的InstallCC接口,需要指定resmgmt.InstallCCRequest以及在哪些peers上面安裝。resmgmt.InstallCCRequest指明了鏈碼ID、鏈碼路徑、鏈碼版本以及打包后的鏈碼。

打包鏈碼需要使用到鏈碼路徑CCPath和GoPath,GoPath即本機(jī)的$GOPATH,CCPath是相對(duì)于GoPath的相對(duì)路徑,如果路徑設(shè)置不對(duì),會(huì)造成sdk找不到鏈碼。

// pack the chaincode
ccPkg, err := gopackager.NewCCPackage("github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/", "/Users/shitaibin/go")
if err != nil {
  return errors.WithMessage(err, "pack chaincode error")
}

// new request of installing chaincode
req := resmgmt.InstallCCRequest{
  Name:    c.CCID,
  Path:    c.CCPath,
  Version: v,
  Package: ccPkg,
}

reqPeers := resmgmt.WithTargetEndpoints("peer0.org1.example.com")
resps, err := rc.InstallCC(req, reqPeers)
if err != nil {
  return errors.WithMessage(err, "installCC error")
}

10、使用fabric go sdk的資源管理客戶端實(shí)例化鏈碼

實(shí)例化鏈碼需要使用fabric go sdk的資源管理客戶端的InstantiateCC接口,需要通過ChannelID、 resmgmt.InstantiateCCRequest和peers,指明在哪個(gè)channel上實(shí)例化鏈碼,請(qǐng)求包含了鏈碼的ID、路徑、版本,以及初始化參數(shù)和背書策略,背書策略可以通過cauthdsl.FromString生成。

// endorser policy
org1OrOrg2 := "OR('Org1MSP.member','Org2MSP.member')"
ccPolicy, err := cauthdsl.FromString(org1OrOrg2)
if err != nil {
  return errors.WithMessage(err, "gen policy from string error")
}

// new request
args := packArgs([]string{"init", "a", "100", "b", "200"})
req := resmgmt.InstantiateCCRequest{
  Name:    c.CCID,
  Path:    c.CCPath,
  Version: v,
  Args:    args,
  Policy:  ccPolicy,
}

// send request and handle response
reqPeers := resmgmt.WithTargetEndpoints("peer0.org1.example.com")
resp, err := rc.InstantiateCC(ChannelID, req, reqPeers)
if err != nil {
  return errors.WithMessage(err, "instantiate chaincode error")
}

11、使用fabric go sdk的資源管理客戶端升級(jí)鏈碼

再fabric go sdk中,升級(jí)鏈碼和實(shí)例化鏈碼是非常相似的,不同點(diǎn)只在請(qǐng)求是resmgmt.UpgradeCCRequest,調(diào)用的接口是rc.UpgradeCC:

// endorser policy
org1AndOrg2 := "AND('Org1MSP.member','Org2MSP.member')"
ccPolicy, err := c.genPolicy(org1AndOrg2)
if err != nil {
  return errors.WithMessage(err, "gen policy from string error")
}

// new request
args := packArgs([]string{"init", "a", "100", "b", "200"})
req := resmgmt.UpgradeCCRequest{
  Name:    c.CCID,
  Path:    c.CCPath,
  Version: v,
  Args:    args,
  Policy:  ccPolicy,
}

// send request and handle response
reqPeers := resmgmt.WithTargetEndpoints("peer0.org1.example.com")
resp, err := rc.UpgradeCC(ChannelID, req, reqPeers)
if err != nil {
  return errors.WithMessage(err, "instantiate chaincode error")
}

12、使用fabric go sdk的通道客戶端調(diào)用鏈碼

在fabric go sdk中,使用通道客戶端的Execute接口調(diào)用鏈碼,使用入?yún)hannel.Request和peers指明要讓哪些peer上執(zhí)行鏈碼,進(jìn)行背書。channel.Request指明了要調(diào)用的鏈碼,以及鏈碼內(nèi)要Invoke的函數(shù)args,args是序列化的結(jié)果,序列化是自定義的,只要鏈碼能夠按相同的規(guī)則進(jìn)行反序列化即可。

// new channel request for invoke
args := packArgs([]string{"a", "b", "10"})
req := channel.Request{
  ChaincodeID: c.CCID,
  Fcn:         "invoke",
  Args:        args,
}

// send request and handle response
// peers is needed
reqPeers := channel.WithTargetEndpoints("peer0.org1.example.com")
resp, err := cc.Execute(req, reqPeers)
if err != nil {
  return errors.WithMessage(err, "invoke chaincode error")
}
log.Printf("invoke chaincode tx: %s", resp.TransactionID)

13、使用fabric go sdk的通道客戶端查詢鏈碼

在fabric go sdk中,查詢和調(diào)用鏈碼是非常相似的,使用相同的channel.Request,指明了Invoke鏈碼中的query函數(shù),然后調(diào)用cc.Query進(jìn)行查詢操作,這樣節(jié)點(diǎn)不會(huì)對(duì)請(qǐng)求進(jìn)行背書:

// new channel request for query
req := channel.Request{
  ChaincodeID: c.CCID,
  Fcn:         "query",
  Args:        packArgs([]string{keys}),
}

// send request and handle response
reqPeers := channel.WithTargetEndpoints(peer)
resp, err := cc.Query(req, reqPeers)
if err != nil {
  return errors.WithMessage(err, "query chaincode error")
}

log.Printf("query chaincode tx: %s", resp.TransactionID)
log.Printf("result: %v", string(resp.Payload))

以上是“fabric go sdk是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:fabricgosdk是什么
標(biāo)題網(wǎng)址:http://jinyejixie.com/article14/ipjdge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站品牌網(wǎng)站建設(shè)、ChatGPT小程序開發(fā)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
得荣县| 碌曲县| 威远县| 东山县| 于田县| 金山区| 通许县| 贵阳市| 玛曲县| 汉寿县| 祁阳县| 金坛市| 牡丹江市| 长沙县| 长沙县| 厦门市| 科技| 仲巴县| 卢湾区| 西盟| 吉首市| 民县| 吕梁市| 资阳市| 海兴县| 平邑县| 通渭县| 若羌县| 东阳市| 江安县| 开化县| 义马市| 上思县| 宜阳县| 四川省| 沾益县| 大竹县| 雷波县| 永福县| 夹江县| 利津县|