• pkg/client/event event包


    一. pkg/client/event 通过event包可以访问Fabric网络上的通道事件。 事件客户端接收诸如块,过滤块,链代码和事务状态事件之类的事件。

    1. 基本流程

      1)准备频道客户端上下文
      2)创建事件客户端
      3)注册事件
      4)处理事件(或超时)
      5)取消注册

       1 ec, err := New(mockChannelProvider("mychannel"))
       2 if err != nil {
       3     fmt.Println("failed to create client")
       4 }
       5 
       6 registration, notifier, err := ec.RegisterChaincodeEvent("examplecc", "event123")
       7 if err != nil {
       8     fmt.Println("failed to register chaincode event")
       9 }
      10 defer ec.Unregister(registration)
      11 
      12 select {
      13 case ccEvent := <-notifier:
      14     fmt.Printf("received chaincode event %v
      ", ccEvent)
      15 case <-time.After(time.Second * 5):
      16     fmt.Println("timeout while waiting for chaincode event")
      17 }
      18 
      19 // Timeout is expected since there is no event producer
      View Code

      输出:timeout while waiting for chaincode event

    2. 类型Client
      1. type Client struct { // contains filtered or unexported fields }: 客户端可以访问Fabric网络上的通道事件。
      2. func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error): New返回Client实例。 客户端接收诸如块,过滤块,链代码和事务状态事件之类的事件。
        1. 例:
           1 ctx := mockChannelProvider("mychannel")
           2 
           3 ec, err := New(ctx, WithBlockEvents())
           4 if err != nil {
           5     fmt.Println(err)
           6 }
           7 
           8 if ec != nil {
           9     fmt.Println("event client created")
          10 } else {
          11     fmt.Println("event client is nil")
          12 }
          View Code

          输出:event client created

      3. func (c *Client) RegisterBlockEvent(filter ...fab.BlockFilter) (fab.Registration, <-chan *fab.BlockEvent, error): RegisterBlockEvent注册块事件。 如果调用者没有注册块事件的权限,则返回错误。 不再需要注册时,必须调用取消注册。
        1. 参数

          filter是一个可选的过滤器,可过滤掉不需要的事件。 (注意:只能指定一个过滤器。)

          返回:
          注册和用于接收事件的频道。 调用取消注册时,通道将关闭。

        2. 例:
           1 ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents())
           2 if err != nil {
           3     fmt.Println("failed to create client")
           4 }
           5 
           6 registration, _, err := ec.RegisterBlockEvent()
           7 if err != nil {
           8     fmt.Println("failed to register block event")
           9 }
          10 defer ec.Unregister(registration)
          11 
          12 fmt.Println("block event registered successfully")
          View Code

          输出:block event registered successfully

      4. func (c *Client) RegisterChaincodeEvent(ccID, eventFilter string) (fab.Registration, <-chan *fab.CCEvent, error): RegisterChaincodeEvent注册链代码事件。 不再需要注册时,必须调用取消注册。
        1. 参数:

          ccID是要为其接收事件的链代码ID
          eventFilter是要为其接收事件的chaincode事件过滤器(正则表达式)

          返回:
          注册和用于接收事件的频道。 调用取消注册时,通道将关闭。

        2. 例:
           1 ec, err := New(mockChannelProvider("mychannel"))
           2 if err != nil {
           3     fmt.Println("failed to create client")
           4 }
           5 
           6 registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123")
           7 if err != nil {
           8     fmt.Println("failed to register chaincode event")
           9 }
          10 defer ec.Unregister(registration)
          11 
          12 fmt.Println("chaincode event registered successfully")
          View Code

          输出:chaincode event registered successfully

           1 // If you require payload for chaincode events you have to use WithBlockEvents() option
           2 ec, err := New(mockChannelProvider("mychannel"), WithBlockEvents())
           3 if err != nil {
           4     fmt.Println("failed to create client")
           5 }
           6 
           7 registration, _, err := ec.RegisterChaincodeEvent("examplecc", "event123")
           8 if err != nil {
           9     fmt.Println("failed to register chaincode event")
          10 }
          11 defer ec.Unregister(registration)
          12 
          13 fmt.Println("chaincode event registered successfully")
          View Code

          输出:chaincode event registered successfully

      5. func (c *Client) RegisterFilteredBlockEvent() (fab.Registration, <-chan *fab.FilteredBlockEvent, error): egisterFilteredBlockEvent注册过滤的块事件。当不再需要注册时,必须调用取消注册。
        1. 参数:

          返回:
          注册和用于接收事件的频道。 调用取消注册时,通道将关闭。

        2. 例:
           1 ec, err := New(mockChannelProvider("mychannel"))
           2 if err != nil {
           3     fmt.Println("failed to create client")
           4 }
           5 
           6 registration, _, err := ec.RegisterFilteredBlockEvent()
           7 if err != nil {
           8     fmt.Println("failed to register filtered block event")
           9 }
          10 defer ec.Unregister(registration)
          11 
          12 fmt.Println("filtered block event registered successfully")
          View Code

          输出:filtered block event registered successfully

      6. func (c *Client) RegisterTxStatusEvent(txID string) (fab.Registration, <-chan *fab.TxStatusEvent, error): RegisterTxStatusEvent注册事务状态事件。 不再需要注册时,必须调用取消注册。
        1. 参数:

          txID是要为其接收事件的事务ID

          返回:
          注册和用于接收事件的频道。 调用取消注册时,通道将关闭。

        2. 例:
           1 ec, err := New(mockChannelProvider("mychannel"))
           2 if err != nil {
           3     fmt.Println("failed to create client")
           4 }
           5 
           6 registration, _, err := ec.RegisterTxStatusEvent("tx123")
           7 if err != nil {
           8     fmt.Println("failed to register tx status event")
           9 }
          10 defer ec.Unregister(registration)
          11 
          12 fmt.Println("tx status event registered successfully")
          View Code

          输出:tx status event registered successfully

      7. func (c *Client) Unregister(reg fab.Registration): 取消注册将删除给定的注册并关闭事件通道。
        1. 参数:

          reg是从其中一个注册函数返回的注册句柄

    3. 类型ClientOption
      1. type ClientOption func(*Client) error: ClientOption描述了New构造函数的功能参数
    4. func WithBlockEvents() ClientOption: WithBlockEvents指示要接收块事件。 请注意,调用者必须具有此选项的足够权限。
    5. func WithBlockNum(from uint64) ClientOption: WithBlockNum表示要从中接收事件的块编号。 只有deliverclient支持这一点
    6. func WithSeekType(seek seek.Type) ClientOption: WithSeekType表示所需的搜索类型 - 最新,最旧或来自给定块只有deliverclient支持此项
  • 相关阅读:
    Sass
    将100以内同时能被3和5整除的数输出
    Html小插件
    微信小程序一些demo链接地址
    .net MVC4一个登陆界面加验证
    Zeu.js
    Google 开发的、最好用、功能最强大的网页测速与网站性能分析工具
    .net基本面试题
    C#简单的九九乘法表
    请编程实现一个冒泡排序算法
  • 原文地址:https://www.cnblogs.com/apolov-fabric/p/9719296.html
Copyright © 2020-2023  润新知