江西省工程建设信息官方网站,登录到wordpress后台,网站建设项目立项登记 表,找网站建设都需要注意哪些Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互#xff0c;主要包括如下几种情况#xff1a;客户端访问 Peer 节点#xff0c;客户端和 Peer 节点访问排序节点#xff0c;链码容器与 Peer 节点交互#xff0c;以及多个 Peer 节点之间的 Gossip 交互。
消息结构…Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互主要包括如下几种情况客户端访问 Peer 节点客户端和 Peer 节点访问排序节点链码容器与 Peer 节点交互以及多个 Peer 节点之间的 Gossip 交互。
消息结构
除了 Peer 节点之间的 Gossip 通信外大多都采用了信封Envelope结构来对消息进行封装. 普通信封结构并不复杂包括一个载荷Payload域存放数据以及对载荷域中内容进行签名的签名Signature域。载荷域中又包括头部Header域记录类型、版本、签名者信息等元数据以及数据Data域记录消息内容。
头部域是一个通用的结构。包括两种头部通道头ChannelHeader和签名头Signature-Header。通道头中记录了如下与通道和交易相关的很多信息。
●Typeint32 类型代表了结构体如 Envelope的类型。结构体消息根据类型不同其 Payload 可以解码为不同的结构。类型可以为 MESSAGE、CONFIG、CONFIG_UPDATE、ENDORSER_TRANSACTION、ORDERER_TRANSACTION、DELIVER_SEEK_INFO、CHAINCODE_PACKAGE、PEER_ADMIN_OPERATION 等。
●Versionint32 类型版本号记录了消息协议的版本一般为 0。
●Timestamp*google_protobuf.Timestamp 类型消息创建的时间。
●ChannelIDstring 类型消息所关联的通道 ID。
●TxIDstring 类型交易的 ID由交易发起者创建。
●Epochuint64 类型所属的世代目前指定为所属区块的高度。
●Extension[] byte 类型扩展域。
●TlsCertHash[] byte 类型。如果启用了双向 TLS 认证则此处为客户端 TLS 证书的 Hash 值。
签名头中主要记录签名者的身份信息。 客户端访问 Peer 节点
客户端通过 SDK 和 Endorser Peer 进行交互执行链码相关操作安装、实例化、升级链码以及调用加入、列出应用通道和监听事件操作等。
除监听事件外大部分消息都采用了 SignedProposal 结构定义在 fabric-protos-go 项目的 peer/chaincode.pb.go 文件消息中 ChannelHeader.Type 为 ENDORSER_TRANSACTION 或 CONFIG发往的 gRPC 服务地址为 /protos.Endorser/ProcessProposal。监听事件则通过 DeliverClient 接口类型来实现包括 Deliver、DeliverFiltered、DeliverWithPrivateData 三种方法。 SignedProposal 消息结构中包括 Proposal 和对其的签名。Proposal 消息结构中同样包括 Header 域、Payload 域以及扩展域。其中Payload 域和扩展域如何解码都取决于 Channel-Header 中的 Type 指定的类型。 客户端、Peer 节点访问 Orderer
客户端通过 SDK 和 Orderer 进行交互执行链码实例化、调用和升级应用通道创建和更新以及区块结构获取等操作。Peer 节点可以直接向 Orderer 请求获取区块结构。两者采用了同样的获取接口。
请求消息都采用了 Envelope 结构并且都发往 /orderer.AtomicBroadcast/Broadcast gRPC 服务地址。从 Orderer 获取信息时则发往 /orderer.AtomicBroadcast/Deliver gRPC 服务地址。 链码和 Peer 节点交互
对于原生链码在链码容器启动后会向 Peer 节点进行注册gRPC 地址为 /protos.ChaincodeSupport/Register。对于外部链码在其启动后Peer 节点会主动发起连接请求gRPC 地址为 /protos.Chaincode/Connect。
链码和 Peer 之间的交互消息为 ChaincodeMessage 结构其中Payload 域中可以包括各种 Chaincode 操作消息如 GetHistoryForKey、GetQueryResult、PutStateInfo、GetStateByRange 等。 注册完成后双方建立起双工通道通过更多消息类型实现多种交互. Peer 节点之间 Gossip 交互
Peer 之间可以通过 Gossip 协议来完成邻居探测、Leader 选举、区块分发、私密数据同步等过程主要原理为通过 GossipClient 客户端的 GossipStream 双向流进行通信发送 Signed-GossipMessage 消息结构gRPC 服务地址主要为 /gossip.Gossip/GossipStream。
此外Peer 可通过单独的 Ping 服务对远端节点在线状态进行探测gRPC 服务地址为 /gossip.Gossip/Ping。
Gossip 交互过程
总结 Gossip 交互过程如图 14-16 所示。利用不同的消息体完成 Peer 之间的信息同步。 Gossip 消息结构
Gossip 采用签名信封结构SignedGossipMessage用来封装 Gossip 消息GossipMessage和对应的信封结构Envelope。 Gossip 消息标签
GossipMessage 为核心的数据结构。其可能的标签值GossipMessage_Tag如下所示这些标签默认带有 GossipMessage 前缀。
●UNDEFINED标签未定义当标签为空时返回该值。
●EMPTY空标签用于建立连接、心跳、请求和响应成员消息。
●ORG_ONLY仅限组织内消息如私密数据。
●CHAN_ONLY仅限通道内消息。
●CHAN_AND_ORG限通道内同一组织内如获取区块数据。
●CHAN_OR_ORG限通道内或限组织内如状态信息。 Gossip 消息内容结构
GossipMessage 通过消息内容类型来应用到不同场景。合法的消息内容结构isGossipMessage_Content下面详细介绍这些结构默认带有 GossipMessage 前缀。
1成员消息适用于邻居发现场景定期维护存活的邻居信息不局限在通道内主要由 gossip/discovery 模块实现。 2拉取消息
适用于从远程节点拉取身份或区块数据主要数据结构为gossip/gossip/pull/pullstore.go#Mediator 和 gossip/gossip/algo/pull.go#PullEngine。包括如下两种消息类型
●PullMsgType_IDENTITY_MSG获取对方的身份信息消息标签为 EMPTY不局限在通道内。
●PullMsgType_BLOCK_MSG获取区块数据。消息标签为 CHAN_AND_ORG局限在通道内的同一组织内。 3数据消息
适用于从远程节点同步区块或私密数据。 4状态消息
适用于与远程节点同步账本状态。 5其他消息
其他消息包括连接消息、选举 Leader 消息和空消息。 grpcgo