HyperLeger Fabric SDK开发(四)——channel

HyperLeger Fabric SDK开发(四)——channel

一、channel简介

1、channel?简介

pkg/client/channel支持访问Fabric网络上的通道。channel客户端实例提供与指定通道上的Peer节点进行交互的处理函数。channel客户端可以在指定通道上查询链码,执行链码以及注册或注销链码事件。如果应用程序需要与Fabric网络的多条通道进行交互,需要为每条通道创建一个单独的通道客户端实例。
官方文档:
https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/channel

2、channel使用流程

channel使用流程如下:
A、准备通道客户端上下文
B、创建通道客户端
C、执行链码
D、查询链码
channel使用示例如下:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

response, err := c.Query(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("data")}})
if err != nil {
    fmt.Printf("failed to query chaincode: %s\n", err)
}

fmt.Println(string(response.Payload))
// output:
// abc

二、channel常用接口

1、类型定义

// Request 包含查询和执行一个调用交易的参数
type Request struct {
    ChaincodeID  string
    Fcn          string
    Args         [][]byte
    TransientMap map[string][]byte

    // InvocationChai包含元数据,某些选择服务实现使用元数据来选择满足调用链中所有链码的背书
     // 策略的背书节点
    // Each chaincode may also be associated with a set of private data collection names
    // which are used by some Selection Services (e.g. Fabric Selection) to exclude endorsers
    // that do NOT have read access to the collections.
    // The invoked chaincode (specified by ChaincodeID) may optionally be added to the invocation
    // chain along with any collections, otherwise it may be omitted.
    InvocationChain []*fab.ChaincodeCall
}

//Response包含执行和查询一个调用交易的响应参数
type Response struct {
    Proposal         *fab.TransactionProposal
    Responses        []*fab.TransactionProposalResponse
    TransactionID    fab.TransactionID
    TxValidationCode pb.TxValidationCode
    ChaincodeStatus  int32
    Payload          []byte
}

2、获取客户端实例

type Client struct {
    context      context.Channel
    membership   fab.ChannelMembership
    eventService fab.EventService
    greylist     *greylist.Filter
    clientTally  // nolint
}

通道客户端支持访问Fabric网络上的通道。为了与特定通道的Peer节点进行交互,通道客户端实例提供了一个处理程序。 如果应用程序需要与多个通道进行交互,应该为每个通道创建一个单独的通道客户端实例。 通道客户端只支持非管理功能。

type ClientOption func(*Client) error
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error)

返回通道Client实例。通道客户端可以在特定通道上查询链码,执行链码以及注册/注销链码事件。
使用示例:

ctx := mockChannelProvider("mychannel")

c, err := New(ctx)
if err != nil {
    fmt.Println(err)
}

if c != nil {
    fmt.Println("channel client created")
} else {
    fmt.Println("channel client is nil")
}
// output:
// channel client created   

3、执行交易

func (cc *Client) Execute(request Request, options ...RequestOption) (Response, error)
使用请求和可选的请求选项进行准备并执行事务。
参数:?
request包含必备链码ID和函数的相关信息
options包含可选的请求选项
返回Peer的提案回复
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

_, err = c.Execute(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("move"), []byte("a"), []byte("b"), []byte("1")}})
if err != nil {
    fmt.Println(err.Error())
}

fmt.Println("Chaincode transaction completed")
// output:
// Chaincode transaction completed   

4、调用交易处理

func (cc *Client) InvokeHandler(handler invoke.Handler, request Request, options ...RequestOption) (Response, error)
InvokeHandler使用提供的请求和可选请求选项来调用处理程序
参数:
handler为要调用的处理程序
request包含必备的链码ID和函数的相关信息
options包含可选的请求选项
返回Peer的提案回复
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

response, err := c.InvokeHandler(&exampleHandler{}, Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("data")}})
if err != nil {
    fmt.Printf("failed to query chaincode: %s\n", err)
}

fmt.Println(string(response.Payload))
// output:
// custom

5、查询

func (cc *Client) Query(request Request, options ...RequestOption) (Response, error)
使用request 和可选请求选项options查询链码。
参数:
request包含必备链码ID和函数的相关信息
options包含可选的请求选项
返回值:Peer的提案回复
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

response, err := c.Query(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("b")}})
if err != nil {
    fmt.Printf("failed to query chaincode: %s\n", err)
}

if len(response.Payload) > 0 {
    fmt.Println("chaincode query success")
}
// output:
// chaincode query success

6、注册链码事件

func (cc *Client) RegisterChaincodeEvent(chainCodeID string, eventFilter string) (fab.Registration, <-chan *fab.CCEvent, error)
注册链码事件。当不再需要注册时,必须调用取消注册。
参数:
chaincodeID接收事件的链码的链码ID
eventFilter用于接收事件的链码事件过滤器(正则表达式)
返回注册和用于接收事件的通道。调用注销事件时,通道将关闭。
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

registration, _, err := c.RegisterChaincodeEvent("examplecc", "event123")
if err != nil {
    fmt.Println("failed to register chaincode event")
}
defer c.UnregisterChaincodeEvent(registration)

fmt.Println("chaincode event registered successfully")
// output:
// chaincode event registered successfully

7、注销链码事件

func (cc *Client) UnregisterChaincodeEvent(registration fab.Registration)
删除给定的链码事件注册并关闭事件通道。
参数:
registration是从RegisterChaincodeEvent方法返回的注册句柄

8、RequestOption选项构建

type requestOptions struct {
   Targets       []fab.Peer // targets
   TargetFilter  fab.TargetFilter
   TargetSorter  fab.TargetSorter
   Retry         retry.Opts
   BeforeRetry   retry.BeforeRetryHandler
   Timeouts      map[fab.TimeoutType]time.Duration //timeout options for channel client operations
   ParentContext reqContext.Context                //parent grpc context for channel client operations (query, execute, invokehandler)
   CCFilter      invoke.CCFilter
}

// RequestOption func for each Opts argument
type RequestOption func(ctx context.Client, opts *requestOptions) error

func WithBeforeRetry(beforeRetry retry.BeforeRetryHandler) RequestOption
指定在重试前调用的函数
func WithChaincodeFilter(ccFilter invoke.CCFilter) RequestOption
添加一个链码过滤器,用于计算额外的背书节点
func WithParentContext(parentContext reqContext.Context) RequestOption
WithParentContext封装了grpc父上下文
func WithRetry(retryOpt retry.Opts) RequestOption
WithRetry生成用于配置重试的选项
func WithTargetEndpoints(keys ...string) RequestOption
WithTargetEndpoints允许为请求的覆盖目标Peer节点。目标Peer节点由名称或URL指定,SDK将创建底层的Peer节点对象。
func WithTargetFilter(filter fab.TargetFilter) RequestOption
WithTargetFilter指定每个请求的目标Peer节点的过滤器
func WithTargets(targets ...fab.Peer) RequestOption
WithTargets允许为请求覆盖目标Peer节点
func WithTimeout(timeoutType fab.TimeoutType, timeout time.Duration) RequestOption
WithTimeout封装了超时类型的键值对
func WithTargetSorter(sorter fab.TargetSorter) RequestOption
指定每个请求的排序节点

三、chennel示例

ctx := sdk.ChannelContext(channelName, fabsdk.WithOrg(org), fabsdk.WithUser(user))

cli, err := channel.New(ctx)
if err != nil {
   return channel.Response{}, err
}

// 状态的查询
resp,err := cli.Query(channel.Request{
   ChaincodeID: chaincodeName,
   Fcn:         fcn,
   Args:        args,
}, channel.WithTargetEndpoints("peer0.org1.example.com"))

原文地址:http://blog.51cto.com/9291927/2324049

时间: 2024-10-29 08:02:57

HyperLeger Fabric SDK开发(四)——channel的相关文章

HyperLeger Fabric SDK开发(二)——Fabric SDK配置

HyperLeger Fabric SDK开发(二)--Fabric SDK配置 一.Fabric SDK配置 Fabric区块链网络应用程序需要大量的参数,用于连接Fabric区块链网络.通常将Fabric区块链网络应用程序所需的参数放到一个配置文件进行管理,配置文件定义Fabric SDK Go的配置和用户自定义参数,指定了连接Fabric区块链网络所需的全部信息,例如Fabric区块链网络组件的主机名和端口等.Fabric SDK GO为应用程序提供的配置文件通常使用yaml文件格式编写,

HyperLeger Fabric SDK开发(一)——Fabric SDK开发简介

HyperLeger Fabric SDK开发(一)--Fabric SDK开发简介 一.Fabric SDK简介 1.Fabric SDK简介 Farbric的Peer节点和Orderer节点都提供了基于gRPC协议的接口,用于和Peer节点与Orderer节点进行命令/数据交互.为了简化开发,为开发人员开发应用程序提供操作Fabric区块链网络的API,Fabric官方提供了多种语言版本的SDK.Fabric提供了三种语言版本的SDK,分别如下:A.Fabric Nodejs SDKB.Fa

HyperLeger Fabric SDK开发(六)——resmgmt

HyperLeger Fabric SDK开发(六)--resmgmt 一.resmgmt简介 1.resmgmt简介 resmgmt支持在Fabric网络上创建和更新资源.resmgmt允许管理员创建.更新通道,并允许Peer节点加入通道.管理员还可以在Peer节点上执行与链码相关的操作,例如安装,实例化和升级链码.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/resmgmt 2.resmgmt使用

HyperLeger Fabric SDK开发(七)——ledger

HyperLeger Fabric SDK开发(七)--ledger 一.ledger简介 1.ledger简介 ledger包支持在Fabric网络上的指定通道上启用账本查询.如果应用程序需要对多个通道进行账本查询,需要为每个通道的账本客户端创建一个单独实例.账本客户端支持以下查询:QueryInfo,QueryBlock,QueryBlockByHash,QueryBlockByTxID,QueryTransaction和QueryConfig.官方文档:https://godoc.org/

HyperLeger Fabric SDK开发(三)——fabsdk

HyperLeger Fabric SDK开发(三)--fabsdk 一.fabsdk简介 1.fabsdk简介 fabsdk是Fabric SDK的主要包,fabsdk支持客户端使用Hyperledger Fabric区块链网络.fabsdk基于配置创建上下文环境,上下文环境会在client包使用.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/fabsdk 2.fabsdk使用基本流程 Fabsdk使用基本流程如

HyperLeger Fabric SDK开发(八)——msp

HyperLeger Fabric SDK开发(八)--msp 一.msp简介 1.msp简介 msp支持在Fabric网络上创建和更新用户.MSP客户端支持以下操作:Enroll,Reenroll,Register,Revoke和GetSigningIdentity.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/msp 2.msp使用流程 msp使用的基本流程如下:A.准备客户端上下文B.创建msp

HyperLeger Fabric开发(七)——HyperLeger Fabric链码开发

HyperLeger Fabric开发(七)--HyperLeger Fabric链码开发 一.链码开发模式 1.链码开发模式简介 Fabric的链码开发调试比较繁琐.在不使用链码开发模式的情况下,链码不能在本地测试,必须部署到docker,install和instantiate后,Peer节点会在新的容器中启动链码.但只能通过docker logs查看链码日志,通过打印日志的方式进行链码调试.如果对链码进行了修改,需要重新开始上述流程.为了简化Fabric链码开发的调试过程,Fabric引入了

HyperLeger Fabric开发(八)——HyperLeger Fabric链码开发测试

HyperLeger Fabric开发(八)--HyperLeger Fabric链码开发测试 一.链码实例 SACC项目链码实例如下: package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) // SimpleAsset implements a si

HyperLeger Fabric开发(三)——HyperLeger Fabric架构

HyperLeger Fabric开发(三)--HyperLeger Fabric架构 一.HyperLeger Fabric架构简介 1.通道简介 商业应用的一个重要的需求是私密×××易,为此Fabric设计了通道(Channel)来提供成员之间的隐私保护.通道是部分网络成员之间拥有独立的通信渠道,在通道中发送的交易只有属于通道的成员才可见,因此通道可以看作是Fabric的网络中部分成员的私有通信子网.通道由排序服务管理.在创建通道的时候,需要定义通道的成员和组织.锚节点(anchor pee