Hyperledger Fabric -- gossip 协议
Hyperledger gossip
本文记述了Hyperledger Fabric 中 一种网络数据同步协议--gossip,它的主要作用是致力于账本数据的安全传输,保证不同节点之间状态的同步和完整。
在fabric的网络中gossip的message是持续存在的,一个peer节点会不断、实时的接收到来自同一channel其他peers的账本数据。每一个gossip message都携带发送方的签名信息,这可以使得接受方轻易的辨别对方的身份和校验消息的完整性和合法性。当一个peer由于延迟、网络故障等原因而错过block数据的情况发生时,可以通过从其他拥有该block的peer处去同步,从而保证了账本的完整性和一致性。
gossip 协议的三个主要功能:
peer发现和channel membership管理: 通过持续的去辨别同channel内其他peer的身份是否合法 和 校验peer是否宕机,来维持和管理channel内其他peers的信息
账本数据的传播: 同channel内任何一个peer在发现block数据缺失时,可以从其他peer拷贝正确的block数据
传输加速: 通过点对点的传输方式去更新账本,可以使得新上线的peer快速同步数据
在gossip协议中 一个peer同时从多个peer接收数据,然后会从同channel中其他的peers选择出来一定数量N的peer,去将数据发送到这些被选中的peer中,N是一个可配置的常量。peer 也可以去主动拉去数据而不是被动的等待,整个过程不断的重复,直到ledger状态和channel的membership达到同步的状态。当一个channel的新块产生后每一个组织的leader会去从orderer节点去拉取该块,然后通过gossip协议去广播。
Leader eletcion
在一个channel中每一个Application organization的peers都需要leader节点,leader节点的作用就是与orderer servers保持通讯,不断的去拉取新生成的块信息,然后广播给组织内的其他peer。
Static leader election
静态选举方案,需要peer的管理员去定义一个或者几个peer为leader,当被配置为leader后则会与orderer servers通讯,但如果太多的peer被设置为leader则会导致orderer servers的带宽压力过大,所以在配置的过程中需要在稳定性和带宽性能上权衡一下。
可以通过配置文件的方式和环境变量的方式去配置peer的选举模式:
- core.yaml 配置文件
peer:
# Gossip related configuration
gossip:
useLeaderElection: false
orgLeader: true
- 环境变量:
export CORE_PEER_GOSSIP_USELEADERELECTION=false
export CORE_PEER_GOSSIP_ORGLEADER=true
以上两种配置方式都可以将peer设置为static的leader节点, 如果CORE_PEER_GOSSIP_USELEADERELECTION 和CORE_PEER_GOSSIP_ORGLEADER 同时被配置为false,则该节点会放弃成为leader。但不能同时设置为true,会导致配置不明确。
Dynamic leader election
在动态选举的过程中,同channel内每一个组织会各自选择出一个peer成为leader与orderer servers通讯。 leader 节点要通过心跳消息来向其他节点证明自己依然活跃,当leader 节点的心跳消息超时后 peer节点会自动的发起下一轮的leader选举,选出一个新的leader。当因为网络环境问题导致网络分片时,会同时存在多个leader,当网络恢复的时候会保留一个leader其他的leader放弃自己的地位。 这种设计可以保证网络的弹性,同时也减轻了orderer servers的压力。
以下配置控制leader的心跳频率:
peer:
# Gossip related configuration
gossip:
election:
leaderAliveThreshold: 10s
同上面的静态选举配置一样,也需要通过配置文件或者环境变量来开启,这里就不重复描述了。
以上两种方案的优点和弊端都很明显: static方案可以省去leader选举的过程,提高ledger同步的速度,减少网络带宽的压力,但是如果leader发生宕机的话整个组织都无法从orderer servers 获取block。dynamic 可以避免上面崩溃问题,但是leader选举过程延缓了同步速度和增加网络带宽压力。
Anchor Peer
Anchor Peer是通过更新channel的config block来设置,同一个channel内每一个组织都有自己的Anchor Peer,它的主要用途是在跨组织通讯上。在gossip跨组织通讯过程中,A组织的节点Nx 至少要知道 B 组织的一个peer地址(可以通过该节点获取 B组织内其他peer的地址),才能进行跨组织的通讯。
请不要将Anchor Peer 与 leader 的概念混淆,Anchor Peer 不一定是leader, leader也不一定是Anchor Peer。
Gossip Message
一个在线的peer需要持续的去广播"alive"消息来证明自己存活。这个alive message 中包含证明自己身份的PKI Id 和对应私钥的签名,在秘钥不被泄漏的情况下该消息无法被假冒(目前来讲),同channel的其他peer会收集有效的alive message 来维持channel membership。 如果一个peer的alive message没有被其他peer接收到则会判定为dead,从而被其他peer从channel membership 中移除。
虽然任何peer都可以属于多个channel,但由于channel之间是隔离的,因此peer不应该传递和分享不相关的channel的消息(即没有加入的channel)。 基于peer中channel记录的消息路由策略 则保证分发的block信息 不会被传递给不在该channel 内的peer。
除了自动的分发消息之外,也会在每一个channel中的peer之间进行world state的协调。peer会不断的从同channel的其他peer处去拉取block来修补自身存在差异的world state。因为gossip 消息传播是不依赖于节点之间固定的链接,所以及时在发生某个节点宕机的情况仍然能保证ledger的完整性和持久性。
peer之间的 使用Tls协议 进行peer-to-peer链接, 链接过程中会通过peer的Tls 证书去做协议层的认证,但并不能作为peer身份的认证。每一个peer都拥有由组织CA 颁发的身份证书,这个身份证书才是真正标明peer身份的。 每一个Block数据都会被 orderer service 签名后分发给对应channel的 leader peers。
身份认证是由peer msp 实现的,当 peer 首次接入channel的时候, tls会话会与 msp identity绑定,可以基于此来验证peer是否有加入通道的资格。
Question
同组织的 peer 初次加入的时候, 在Anchor peer未设置的时候如何发现其他节点?
leader的选举过程?如果同组织内的有static election peer 和 dynamic election peer 会怎么样?
world state 和 block 数据同步的详细流程?
Hyperledger Fabric -- gossip 协议的更多相关文章
- Hyperledger Fabric源码分析之Gossip
Gossip算法正如它的名字,小道消息只需要有人传播一次,那么过一段时间,所有人都会知道,就像新冠病毒一样,所以Gossip算法也有其它的别名"传染病扩散算法"."谣言传 ...
- [Hyperledger] Fabric系统中 peer模块的 gossip服务详解
最近一直在看fabric系统中的核心模块之一——peer模块.在看peer的配置文件core.yaml的信息时,对其中的gossip配置选项很感兴趣.看了一上午,还是不能明白这个选项到底什么意思呢?表 ...
- Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务
前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.多组织共同运行维护Orderer服务中,我们已经完成了让普通组织运行维护 Orderer 服务,但是 ...
- Hyperledger Fabric Membership Service Providers (MSP)——成员服务
Membership Service Providers (MSP) 本文将介绍有关MSPs的设置和最佳实践的详细方案. Membership Service Providers (MSP)是一个旨在 ...
- hyperledger fabric各类节点及其故障分析 摘自https://www.cnblogs.com/preminem/p/8729781.html
hyperledger fabric各类节点及其故障分析 1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端 ...
- hyperledger fabric各类节点及其故障分析
1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端向endorser提交交易提案,当收集到足够背书后,向排序服务 ...
- HyperLedger Fabric部署与链码解读
1.Fabric简介 Fabric是超级账本中的一个项目,用以推进区块链技术.和其他区块链类似,它也有一个账本,使用智能合约,且是一个参与者可以分别管理自身交易的系统.它是一个联盟链.Fabric与其 ...
- [转帖]Hyperledger Fabric 学习一:简介
Hyperledger Fabric 学习一:简介 https://www.jianshu.com/p/f971858b70f3?utm_campaign=maleskine&utm_cont ...
- Hyperledger fabric MSP成员管理
Hyperledger fabric 1.0 基于 PKI(Public Key Infrastructure)体系,引入了MSP模块(Membership Service Provider): 成员 ...
随机推荐
- Golang context包解读
Context 通常被译作 上下文 ,一般理解为程序单元的一个运行状态.现场.快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递, 上 会把内容传递给 下 . 在Go语言中,程序 ...
- 20165318 2017-2018-2 《Java程序设计》第七周学习总结
20165318 2017-2018-2 <Java程序设计>第七周学习总结 目录 学习过程遇到的问题及总结 教材学习内容总结 第11章 JDBC与MySQL数据库 错题总结 第五周错题总 ...
- [BJOI2019] 排兵布阵
题目 这个\(dp\)出在普及都算水题吧 直接背包,\(O(nms)\)跑不满,非常稳 #include<cstdio> #include<vector> #include&l ...
- luogu P3369 【模板】普通平衡树(splay)
嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...
- 搭建高可用mysql系列(1)-- Percona XtraDB Cluster介绍
Percona XtraDB Cluster (下文简称PXC)是一个开源的mysql 高可用解决方案.它将Percona Server和Percona XtraBackup与Galera库集成在一起 ...
- Jython的应用
今天本文围绕主要内容是jython是什么.安装.简单实用. 另外说说我为什么研究jython,研究它是有一个目的的,目的是将python代码转化为jar包以供安卓方面那边人脸识别,虽说目前人脸识别像阿 ...
- Python的 GUI 框架
Python的 GUI 框架 Tkinter Python内嵌的gui环境,使用TCL实现,python IDLE由Tkinter实现 历史悠久,perl中有对应的perlTk.Python标准安装包 ...
- 聊聊iOS Keychain
某天,小熊碰见这样一个错误 Couldn't update the Keychain Item问题处理 ,网上搜索了下网上很多解决方案,依然百撕不得骑姐.后来参考下面两篇文章.才发现是用法不正确,网上 ...
- C++学习第一天(helloword)
C++编译过程 #include <iostream> //iostream 提供了一个叫命名空间的东西,标准的命名空间是std 包含了有关输入输出语句的函数 // input&^ ...
- 轻松构建 基于docker的 redis 集群
下面跟着我来 一步一步构建redis 集群吧. 集群的目录结构见GitHub源码(文章末尾) 1,安装docker环境,根据自身的操作系统,google下即可. 2,我们在服务器上,搭建所需目录结构. ...