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

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

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

相关文章

Android 架构 - 模块化

参考文章 谷歌官方指南 一、概念 将大型、复杂问题拆解成一个个小的、简单问题,从而可以做到各个击破。模块化简单讲就是把多功能高耦合的代码逻辑拆散成多个功能单一职责明确的模块。模块指 Android 项目中的 module,通常会包含 Gradle 构建脚本、源代…

【Android Studio】创建第一个APP工程及生成APK安装包

🌟博主领域:嵌入式领域&人工智能&软件开发 前言:本文详细介绍创建Android Studio第一个APP工程及打包生成APK安装包。 如下两个博客我记录了第一次创建项目时出现的问题,若你也遇见了同样的问题,可参考&#…

QT上位机开发(会员充值软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所有的控件当中,除了label、edit、radio、combobox和button之外,另外一个用的比较多的控件就是grid,也可称之为…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式,却讲透了数学的本质! 《数学的雨伞下:理解世界的乐趣》。一本足以刷新观念的好书,从超市到对数再到相对论,娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者:米卡埃尔•洛奈…

WindowsServer安装mysql最新版

安装 下载相应mysql安装包: MySQL :: Download MySQL Installer 选择不登陆下载 双击运行下载好的mysql-installer-community-*.*.*.msi 进入类型选择页面,本人需要mysql云服务就选择了server only server only(服务器)&#x…

day11 有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值

题目1:20 有效的括号 题目链接:20 有效的括号 题意 判断字符串是否有效,若有效: 1)左括号必须用相应的右括号 2)左括号的闭合顺序正确 ({)}顺序不正确,应该是({}) …

如何使用GaussDB创建脱敏策略(MASKING POLICY)

目录 一、前言 二、GaussDB中的脱敏策略 1、数据脱敏的定义 2、创建脱敏策略的语法说明 三、在GaussDB中如何创建数据脱敏策略(示例) 1、创建脱敏策略的一般步骤 2、GaussDB数据库中创建脱敏策略的完整示例 1)开启安全策略开关,以初识用户omm登录…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下,打开音乐播放器,然后打开一个.mp3文件,就可以实现播放了,那么在Qt/QML中如何实现呢?首先所有的设计都是基于音乐播放器的,嵌入式linux下同样也有音乐播放器,比如mplayer。其调用方法…

Python语法进阶学习--模块和包

在学习python进阶知识中的面向对象之前,还要了解一下当中几个概念:包、模块、类和函数。 一.模块和包 模块和包:用来组织Python代码的。 包 > 含有 __init__.py文件的文件夹模块 > py文件类 > class 【面向对象学习】函数(方法)> def 以上均…

Unity3D时间类Time和DateTime的用法

系列文章目录 Unity知识点 文章目录 系列文章目录前言一、Time和DataTime的区别1-1、命名空间不同 二、Time和DataTime的使用2-1、Time类2-2、代码解释如下:2-3、DataTime类2-4、代码解释如下: 三、实际应用3-1、Time类测试性能代码如下3-2、运行结果如…

小H靶场笔记:DC-7

DC-7 January 8, 2024 4:11 PM Tags:Drupal 8;Drush Owner:只惠摸鱼 信息收集 使用arp-scan和nmap扫描C段存活主机,探测到靶机ip:192.168.199.137,且开放80、22端口 探测22、80开放端口的服务、版本、操…

Mac电脑系统提速软件CleanmyMac X2024

Mac是现代人日常工作时必不可少的工具,尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要,所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。 CleanMyMac X全新版下载如…

Shiro框架:ShiroFilterFactoryBean过滤器源码解析

目录 1.Shiro自定义拦截器SpringShiroFilter 1.1 ShiroFilterFactoryBean解析 1.1.1 实现FactoryBean接口 1.1.2 实现BeanPostProcessor接口 1.2 SpringShiroFilter解析 1.2.1 OncePerRequestFilter过滤逻辑实现 1.2.2 AbstractShiroFilter过滤逻辑实现 1.2.2.1 创建Sub…

Alphalens 因子分析 - 以低换手率因子为例(1)

因子分析是量化研究的基本技能之一。通过因子分析,找出有效的因子,通过相关性去重后,就可以通过机器学习、线性回归等方法把因子组合起来,构成交易策略。 这一篇笔记我们就介绍如何使用 Alphalens 来进行单因子分析。我们使用的因子是低换手率因子。 股谚有一种说法,天量…

风速预测 | 基于深度学习的风速预测模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 风速预测 | 基于深度学习的风速预测模型(Matlab) 程序设计 完整程序和数据获取方式:私信博主回复基于深度学习的风速预测模型(Matlab)。 参考资料 [1] htt…

【Flutter 开发实战】Dart 基础篇:常用运算符

在Dart中,运算符是编写任何程序的基本构建块之一。本文将详细介绍Dart中常用的运算符,以帮助初学者更好地理解和运用这些概念。 1. 算术运算符 算术运算符用于执行基本的数学运算。Dart支持常见的加、减、乘、除、整除以及取余运算。常见的算数运算符如…

智慧灯杆sip广播可视对讲解决方案

智慧灯杆sip广播可视对讲解决方案 智能路灯以城市公共设施的全面高效利用为出发点,根据路况加载智能照明、新能源汽车充电桩、城市广播、视频监控、WIFI热点、LED/LCD信息发布、环境监测、微型基站、停车场管理、井盖等。监控和USB手机充电灯功能,不仅能…

2024 年 API 安全:预测和趋势

随着技术以前所未有的速度不断进步,API(应用程序编程接口)安全性的复杂性也随之增加。随着 API 在现代应用程序和服务中的激增,组织将需要更好地了解其 API 环境以及 API 给运营带来的风险。 到 2024 年,预计几个关键…

海外代理IP在游戏中有什么作用?

随着科技的飞速发展,手机和电脑等电子产品已成为互联网连接万物的重要工具,深度融入我们的日常生活,我们借助互联网完成工作、休闲和购物等任务,以求提升生活质量。 不仅如此,网络游戏也是人们心中最爱,它…

前端开发的新纪元:全方位工具栈探索 | 开源专题 No.57

vuejs/vue Stars: 205.6k License: MIT Vue 是一个用于构建用户界面的渐进式框架。它从头开始设计,可以根据不同的使用情况轻松地在库和框架之间进行扩展。Vue 由一个专注于视图层的核心库组成,并且还有一系列支持性库来帮助您处理大型单页应用程序中的…