基于通道的 Peer 节点事件服务

概述

在 Fabric 的早期版本中,Peer 事件服务被称为事件中心。每当添加新区块到 Peer 节点的帐本中时,该服务都会发送事件,而不管该通道是不是涉及该区块,并且只有运行事件 Peer 的组织成员才能访问该事件(即,与该事件相关联的成员) )。

从v1.1开始,有了提供事件的新服务。这些服务使用完全不同的设计来按通道提供事件。这意味着事件的注册发生在通道级别而不是 Peer 节点端,从而可以对 Peer 节点的数据访问进行精细控制。接收事件的请求是从 Peer 节点组织外部的身份接受的(由通道配置进行定义)。这还提供了更高的可靠性,以及一种接收可能错过的事件的方式(无论是由于连接问题还是由于 Peer 节点正在加入已经运行的网络而导致的事件遗漏)。

可用的服务

  • Deliver

该服务将已提交到帐本的整个区块发送出去。如果链码有事件设置,则可以在区块的 ChaincodeActionPayload 中找到。

  • DeliverWithPrivateData

该服务发送与 Deliver 服务相同的数据,以及来自客户组织的的任何授权访问的私有数据。

  • DeliverFiltered

该服务发送“已过滤”的区块,这是有关已提交到账本的区块的最小信息集。它主要针对 Peer 节点拥有者希望外部客户端接收关于他们的交易和交易状态的主要数据的情况。用于在 Peer 所有者希望外部客户主要接收有关其交易和交易状态信息的网络中。如果链码中有事件设置,则可以在过滤后的区块的 FilteredChaincodeAction 中找到。

注解

链码事件的有效负载将不包含在已过滤的区块中。

如何注册事件

事件的注册是通过将包含消息的信封发送到 Peer 节点来完成的,该信封包含所需的开始和停止位置,寻找行为定义(一直阻塞到准备就绪,还是直接失败)。辅助变量 SeekOldestSeekNewest 可以用于指示最老的(即第一个)区块或账本的最新的(即最后一个)区块。要使服务无限期发送事件,SeekInfo 消息应包含停止位置 MAXINT64

注解

如果在 Peer 节点上启用了双向 TLS ,则必须在信封的通道头中设置 TLS 证书哈希。

默认情况下,事件服务使用“Channel Readers”策略来确定是否授权客户端的事件请求。

传递响应消息概述

事件服务发送 DeliverResponse 消息作为回应。

每条消息应该包含如下内容之一:

  • 状态 – HTTP 状态代码。如果发生任何故障,每个服务将返回相应的故障代码;否则,一旦服务完成 SeekInfo 请求的所有信息,它将返回 200 - SUCCESS
  • 区块 – 仅由 Deliver 服务返回。
  • 区块和私有数据 – 仅由 DeliverWithPrivateData 服务返回。
  • 已过滤的区块 – 仅由 DeliverFiltered 服务返回。

过滤后的区块包含:

  • 通道ID
  • 编号(如区块高度)
  • 过滤交易的数组。
  • 交易ID。
    • 类型 (e.g. ENDORSER_TRANSACTION, CONFIG。)
    • 交易验证代码。
  • 过滤的交易行为。
    • 过滤后的链码行为数组。
      • 交易的链码事件(除去负载)

SDK事件文档

有关使用事件服务的更多详细信息,请参阅 SDK documentation。