Hyperledger Fabric 消息协议

news2024/9/22 5:29:44

Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互,主要包括如下几种情况:客户端访问 Peer 节点,客户端和 Peer 节点访问排序节点,链码容器与 Peer 节点交互,以及多个 Peer 节点之间的 Gossip 交互。

消息结构

除了 Peer 节点之间的 Gossip 通信外,大多都采用了信封(Envelope)结构来对消息进行封装.

普通信封结构并不复杂,包括一个载荷(Payload)域存放数据,以及对载荷域中内容进行签名的签名(Signature)域。载荷域中又包括头部(Header)域记录类型、版本、签名者信息等元数据,以及数据(Data)域,记录消息内容。

头部域是一个通用的结构。包括两种头部:通道头(ChannelHeader)和签名头(Signature-Header)。通道头中记录了如下与通道和交易相关的很多信息。

●Type:int32 类型,代表了结构体(如 Envelope)的类型。结构体消息根据类型不同,其 Payload 可以解码为不同的结构。类型可以为 MESSAGE、CONFIG、CONFIG_UPDATE、ENDORSER_TRANSACTION、ORDERER_TRANSACTION、DELIVER_SEEK_INFO、CHAINCODE_PACKAGE、PEER_ADMIN_OPERATION 等。

●Version:int32 类型,版本号记录了消息协议的版本,一般为 0。

●Timestamp:*google_protobuf.Timestamp 类型,消息创建的时间。

●ChannelID:string 类型,消息所关联的通道 ID。

●TxID:string 类型,交易的 ID,由交易发起者创建。

●Epoch:uint64 类型,所属的世代,目前指定为所属区块的高度。

●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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索雷盛537威士忌的魅力:从观色、闻香到品鉴

威士忌,这一源于苏格兰的特别烈酒,以其丰富的味蕾和特别的魅力征服了全球的品鉴者。品鉴威士忌不仅仅是一种感官体验,更是一种探索和发现的旅程。在本文中,我们将以雷盛537威士忌为例,与您深入了解品鉴威士忌的全过程&…

【Matplotlib】基础设置之图形组合07

figures, subplots, axes 和 ticks 对象 figures, axes 和 ticks 的关系 这些对象的关系可以用下面的图来表示: 示例图像: 具体结构: figure 对象 figure 对象是最外层的绘图单位,默认是以 1 开始编号(MATLAB 风格…

LeetCode(202)快乐数⭐

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1&#xff…

软件测试|Python对JSON的解析和创建详解

简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据,使得在Python中处理JSON变得非常简单。本文将详细介绍Python…

通过Docker搭建4节点的Tendermint集群

Tendermint:0.34.24 Docker:20.10.21 Docker-Compose:2.20.2 OS:Ubuntu 20.04 Go:1.19.2 Linux/amd64 1 修改Tendermint源码 1.1 修改监听IP 为什么要将127.0.1修改成0.0.0.0呢?因为容器内的服务如果是以…

springboot学习笔记(杂)

springboot学习笔记 1.注解框架学习 2.各个类之间的继承和实现关系3.理解面向对象的思想(其实这个想写在2中的)4.开发常用工具Lombok4.0说在前面(如何快速使用Lombok)4.1了解Lombok4.2Lombok的作用一:减少代码冗余4.3Lombok的作用二:方便打日志4.4Lombok使用方法(各个注解作用)…

Linux shell jq工具操作文档(jq --help使用示例)

文章目录 jq工具介绍jq --help解读英文中文 使用示例1. 使用最简单的过滤器。将输入复制到输出,不做任何修改(除了格式化)2. 使用 -c 选项进行紧凑输出而非美化输出3. 使用 -n 选项以 null 作为单一输入值(用于创建新json&#xf…

JS逆向之无限debugger对抗

文章目录 JS中实现debugger的方法无限Debugger示例Demo1Demo2Demo3Demo4总结 无限Debugger实战 JS中实现debugger的方法 首先,我们要知道,在浏览器实现debugger的方法有哪些 debugger关键词 ,相当于C内联汇编的int3,在代码中嵌入…

进阶学习——Linux网络

目录 一、网络配置命令 1.ifconfig——IP地址 1.1ifconfig的基础用法 1.1.1ifconfig命令详解 1.2常用格式 1.3修改网卡名称 1.3.1临时修改 1.3.2永久修改 1.4临时修改网卡 1.4.1设置虚拟网卡 1.4.2延伸——ethtool 1.5永久修改网卡 1.6实验 —— 双网卡配置 1.…

C++ Primer 第五版 中文版 阅读笔记 + 个人思考

C Primer 第五版 中文版 阅读笔记 个人思考 第 10 章 泛型算法10.1 概述练习10.1练习10.2 第 10 章 泛型算法 泛型的体现:容器类型(包括内置数组),元素类型,元素操作方法。 顺序容器定义的操作:insert&a…

计算机丢失mfc140.dll怎么办?解决mfc140.dll缺失的3种方法分享

计算机丢失mfc140.dll怎么办?在使用微软办公软件的时候,可能会弹出一个错误提示框说“找不到mfc140.dll,无法继续执行代码”。为了不影响工作效率,我们可能需要亲自动手尝试修复这一问题。以下是一些mfc140.dll缺失的3种方法相关介…

鸿蒙开发DevEco Studio搭建

DevEco Studio 安装 DevEco Studio 编辑器 下载:https://developer.harmonyos.com/cn/develop/deveco-studio#download Windows(64-bit)Mac(X86)Mac(ARM) 安装:DevEco Studio → 一路 Next运行: 基础安装:Node.js > 16.9.1…

powerdesigner导出sql将name放到comment注释上

1. 批量设置 2. 脚本 Option Explicit ValidationMode True InteractiveMode im_Batch Dim mdl the current modelget the current active model Set mdl ActiveModel If (mdl Is Nothing) ThenMsgBox"There is no current Model " ElseIf Not mdl.IsKindOf(PdPD…

数据结构-函数题

6-2.求二叉树的高度 本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定二叉树BT的高度值…

Tomcat源码解析(一): Tomcat整体架构

Tomcat源码系列文章 Tomcat源码解析(一): Tomcat整体架构 目录 一、Tomcat整体架构1、Tomcat两个核心组件功能2、Tomcat支持的多种I/O模型和应用层协议 二、Connector连接器1、连接器功能汇总2、ProtocolHandler组件2.1、Endpoint2.2、Processor 3、Adapter组件 三…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

MySQL之导入、导出

文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法: mysqldump -u用…

sentinel入门,转载的,不记得在哪复制的了

sentinel 基本概念 开发的原因,需要对吞吐量(TPS)、QPS、并发数、响应时间(RT)几个概念做下了解,查自百度百科,记录如下: 响应时间(RT)   响应时间是指系统对请求作出响应的时间。…

网工内推 | 运维工程师,国企、上市公司,RHCE认证优先

01 广东机场白云信息科技股份有限公司 招聘岗位:基础架构运维工程师(中级) 职责描述: 1、参与公司业务系统的监控、巡检、维护、故障定位、原因分析; 2、负责业务系统的上线、升级割接工作; 3、负责服务器…

kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?

背景 在最近学习k8s的过程中,发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用,他们究竟是什么关系?他们分别应该在什么情况下使用呢?这里我进行了简单的总结,做个区分。 各工具说…