Hyperledger Fabric 消息协议

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业企业-专利引用、被引用数据(1985-2019年)

工业企业的专利引用和被引用数据提供了关于这些企业创新活动和技术影响力的信息。专利引用数据指的是工业企业在申请专利时引用的既有专利数量,这反映了企业在研发过程中对现有技术的依赖和融合。被引用数据则指其他后续专利对这些企业专利的引用次数,这…

控制el-table的列显示隐藏

控制el-table的列显示隐藏,一般的话可以通过循环来实现,但是假如业务及页面比较复杂的话,list数组循环并不好用。 在我们的页面中el-table-column是固定的,因为现在是对现有的进行维护和迭代更新。 对需要控制列显示隐藏的页面进…

SpringBoot 集成WebSocket详解

一、WebSocket概述 1、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 2、为什么需要WebSocket HTTP 是基于请求响应式的,即通信只能由客户端发起,服…

mybatis(动态sql及分页)

mybatis-动态sql及分页 1. 动态sql简述2. 动态sql示例2.1 if2.2 choose2.3 foreach2.4 sql 及 include2.5 sql中的特殊字符 3. 后台分页实现4. 数据版本号处理并发问题 1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来m…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

Android BUG 之 Error: Activity class {} does not exist

项目场景: 更换包名,运行报错 问题描述 原因分析: 在替换包名的时候要确认,配置文件跟build中的保持一致,在更换后还要将旧包的缓存数据清理掉 解决方案: 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

Leetcode2976. 转换字符串的最小成本 I

Every day a Leetcode 题目来源:2976. 转换字符串的最小成本 I 解法1:最短路 建图,从 original[i] 向 changed[i] 连边,边权为 cost[i]。没边的边权设为 INF。 然后用 Floyd 算法求图中任意两点最短路,得到 g 矩阵…

MT6785安卓核心板_联发科MTK6785/Helio G95/曦力G95核心板定制

MT6785安卓核心板是基于MT6785(Helio G95)处理器,具备八核处理器结构,包括2颗主频为2.05GHz的Cortex A76处理器和6颗主频为2.0GHz的Cortex A55处理器,以及六颗Cortex-A55处理器。而在GPU方面,采用了Arm Mali-G76 MC4,频…

zabbix监控windows主机

下载安装zabbix agent安装包 Zabbix官网下载地址: https://www.zabbix.com/cn/download_agents?version5.0LTS&release5.0.40&osWindows&os_versionAny&hardwareamd64&encryptionOpenSSL&packagingMSI&show_legacy0 这里使用zabbix agent2 安装 …

22、Kubernetes核心技术 - 整合Rancher通过界面管理k8s集群

目录 一、概述 二、Rancher API Server 的功能 2.1、授权和角色权限控制 2.2、使用 Kubernetes 的功能 2.3、配置云端基础信息 2.4、查看集群信息 三、Rancher 安装 3.1、前置环境 3.2、通过 Docker 来进行安装Rancher 3.3、在 Rancher 的界面上绑定k8s集群 3.4、在 …

C语言入门教程,C语言学习教程(第二部分:C语言初探)二

十、C语言的三套标准:C89、C99和C11 我们今天使用的 Windows、Linux、Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来。Unix 作为80年代主流的操作系统,是整个软件工业的基础,是现代操作系统的开山鼻祖,C语言就是为 Unix …

html的全选反选

一、实验题目 html实现选择框的全选和反选 二、实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>全选和反选</title></head><body><ul>兴趣爱好</ul><input id"all"…

国芯科技荣膺高工智能汽车“年度车规MCU高成长供应商”,加速产品精准化系列化布局

2023年12月13—15日&#xff0c;2023&#xff08;第七届&#xff09;高工智能汽车年会在上海召开&#xff0c;大会以“寻找拐点”为主题&#xff0c;通过超80场主题演讲及多场圆桌对话&#xff0c;为智能汽车赛道参与者「备战2024」提供全方位的决策支持。 作为汽车电子芯片领…

网络安全漏洞的常见类型

网络犯罪分子可以利用的常见网络安全漏洞包括凭证薄弱、缺乏数据加密、配置错误、软件过时和零日漏洞。这些漏洞通常会导致网络攻击&#xff0c;绕过组织的安全措施并窃取机密数据。组织需要识别并缓解这些漏洞&#xff0c;以防止安全漏洞。 继续阅读以了解有关网络安全漏洞的…

Apache ECharts | 一个数据可视化图表库

文章目录 1、简介1.1、主要特点1.2、使用场景 2、安装方式一&#xff1a;从下载的源代码或编译产物安装方法二&#xff1a;从 npm 安装方法三&#xff1a;⭐定制安装echarts.js 3、使用 官网&#xff1a; 英语&#xff1a;https://echarts.apache.org/en/index.html 中文&a…

ChatGLM2-6B 大语言模型本地搭建

ChatGLM模型介绍&#xff1a; ChatGLM2-6B 是清华 NLP 团队于不久前发布的中英双语对话模型&#xff0c;它具备了强大的问答和对话功能。拥有最大32K上下文&#xff0c;并且在授权后可免费商用&#xff01; ChatGLM2-6B的6B代表了训练参数量为60亿&#xff0c;同时运用了模型…

[VSCode] VSCode 常用快捷键

文章目录 VSCode 源代码编辑器VSCode 常用快捷键分类汇总01 编辑02 导航03 调试04 其他05 重构06 测试07 扩展08 选择09 搜索10 书签11 多光标12 代码片段13 其他 VSCode 源代码编辑器 官网&#xff1a;https://code.visualstudio.com/ 下载地址&#xff1a;https://code.visua…

在学习爬虫前的准备

1. 写一个爬虫程序需要分几步 获取网页内容。 我们会通过代码给一个网站服务器发送请求&#xff0c;它会返回给我们网页上的内容。 在我们平时使用浏览器访问服务器内容是&#xff0c;本质上也是向服务器发送一个请求&#xff0c;然后服务器返回网页上的内容。只不过浏览器还会…

Oracle VM VirtualBox xx needs the Micrsoft Visual C++ 2019错误

错误展示 解决方法 重修安装 Visual C 文件 1、前往官网 C 中 Windows 编程概述 | Microsoft Learn 2、找到对应的包 左边导航栏依次选择&#xff1a; 部署本机桌面应用程序-----重新分发Visual C 文件-----最新受支持的Visual C可再发型程序包下载 根据自己电脑系统进行选…

数据结构期末复习笔记

文章目录 数据结构期末复习第一章&#xff1a;数据结构绪论第二章&#xff1a;顺序表与单链表第三章&#xff1a;其它链表第四章&#xff1a;栈如何中缀转后缀后缀如何计算 第五章&#xff1a;队列第六章&#xff1a;串第七章&#xff1a;树的概念和遍历第八章&#xff1a;赫夫…