Fabric2.x中Raft共识算法核心数据结构
一、共识算法可插拔的代码体现Chain接口
Hyperledger Fabric的共识算法是可插拔的,在代码上体现为Chain接口,所有不同的共识算法均可根据Chain接口进行具体实现,目前fabric支持solo、kafka、raft、sbft等共识算法。Chain接口的代码在fabric/orderer/consensus/consensus.go中
// Chain定义了为ordering注入messages的方式,这种设计允许如下两种流程:
// 1.消息被排序为流,流被切割成块,块被提交(solo,kafka)
// 2.消息被切成块,块被排序,然后块被提交(sbft)
type Chain interface {
// 排序函数,env是交易信息,configSeq是自增序号,每次有配置更新时都会+1,以确保交易是在最新的config下进行
Order(env *cb.Envelope, configSeq uint64) error
// 处理配置交易,提交后更新configSeq
Configure(config *cb.Envelope, configSeq uint64) error
// 超过max in-flight限制的消息会被阻塞,等待in-flight先执行完
WaitReady() error
// 当发生error时,会返回一个空channel
Errored() <-chan struct{}
// 分配与Chain保持最新数据的资源
Start()
// 刷新分配给Chain的资源
Halt()
}
二、Fabric的raft共识算法Chain结构体
Hyperledger Fabric对Raft算法的核心实现代码都是放在fabric/orderer/consensus/etcdraft包下的,这里主要包含几个核心的数据结构,即Chain结构体和node结构体。
Chain结构体实现了Chain接口,代码位于orderer/consensus/etcdraft/chain.go,它里面主要定义了一些通道(channel)用于节点间的通信,以便根据通信消息做相应的操作。
// Chain implements consensus.Chain interface.
type Chain struct {
configurator Configurator
rpc RPC // 节点与外部节点进行通信的对象,RPC 是一个接口,包含两个方法SendConsensus 和 SendSubmit。前面这种用于节点间 raft 信息的通讯,后者用于转发交易请求给 leader 节点。
raftID uint64
channelID string
lastKnownLeader uint64
ActiveNodes atomic.Value
submitC chan *submit // 接收 Orderer 客户端提交的共识请求消息的通道
applyC chan apply // 接收 raft 节点间应用消息的通道
observeC chan<- raft.SoftState
haltC chan struct{}
doneC chan struct{}
startC chan struct{}
snapC chan *raftpb.Snapshot //接收 raft 节点快照数据的通道
gcC chan *gc
…
Node *node // fabric封装了底层 etcdraft 库的节点实例
…
}
三、Fabric的raft共识算法node结构体
node结构体封装了底层ercdraft库的节点实例,代码位于orderer/consensus/etcdraft/node.go,主要用于将Fabric自己实现的Raft上层应用和etcd的底层Raft实现连接起来,可以说node结构体是它们之间通信的桥梁,正是它的存在屏蔽了Raft实现的细节。
type node struct {
chainID string
logger *flogging.FabricLogger
metrics *Metrics
unreachableLock sync.RWMutex
unreachable map[uint64]struct{}
tracker *Tracker
storage *RaftStorage
config *raft.Config
rpc RPC
chain *Chain // fabric自己定义的Chain结构体,具体在orderer/consensus/etcdraft/chain.go中
tickInterval time.Duration
clock clock.Clock
metadata *etcdraft.BlockMetadata
subscriberC chan chan uint64
raft.Node // raft底层的Node接口
}
四、小结
Fabric的raft共识算法通过Chain结构体实现可插拔的共识算法Chain接口;又通过node结构体,实现对etcdraft底层算法实现细节的封装。Chain结构体和node结构体是承上启下的一层,fabirc的raft共识算法启动、交易处理流程均围绕上述两个结构体进行。下一篇博客将围绕fabric的raft共识算法启动流程进行分析。
Fabric2.x中Raft共识算法核心数据结构的更多相关文章
- raft共识算法
raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...
- Raft共识算法详解
Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...
- 【翻译】Raft 共识算法:集群成员变更
转载请注明出处:https://www.cnblogs.com/morningli/p/16770129.html 之前都在集群配置是固定的(参与共识算法的server集合)假设下讨论raft.在实践 ...
- Raft 共识算法
转载请注明出处:https://www.cnblogs.com/morningli/p/16745294.html raft是一种管理复制日志的算法,raft可以分解成三个相对独立的子问题: 选主(L ...
- Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务
前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- 共识算法:PBFT、RAFT
转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...
- docker swarm英文文档学习-12-在集群模式中的Raft共识
Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...
- [转]Fabric2.3中使用test-network搭建测试网络
这个测试网络一方面可以用来学习Fabric,另一方面也可以让一些更有经验的开发者来测试他们的智能合约和应用,但是不建议用于生产环境,在2.0版本后,这个测试网络也取代了原来的"first-n ...
- 共识算法 pos,Dpos
在之前讲解了比特币中的共识算法pow(proot of work),我们先来简单的回顾一下. 新的交易将会广播给所有节点. 每个节点将都会讲新的交易收集到一个区块中. 每个节点都在为其区块收集困难的工 ...
随机推荐
- 陪你去看 Lodash.js 起步
lodash 起步(数组) Lodash 是一个较为流行的 JavaScript 的实用工具库. 在开发过程中如果能熟练使用一些工具库提供的方法,有利于提高开发效率. 笔者从 API 上入手,不分析其 ...
- 2022春每日一题:Day 34
题目:lowbit求和 (没有找到哪个公开题库有这个题) 题意:求数组中任意一对数的异或和的lowbit的总和. 对于异或,二进制位中两个数相等则为0,反之为1,而且此题是要求lowbit,那我们利用 ...
- i春秋xss平台
点开是个普普通通的登录窗口,没有注册,只有登录,抓住包也没获取什么有用的信息,看了看dalao的wp才知道怎么做,首先抓包然后修改参数的定义来让其报错,pass原本的应该为整数,pass[]=就可以让 ...
- python-opencv实现抖动算法
抖动算法简单介绍 简单说就是牺牲分辨率来提高颜色数量. 通过黑点的疏密程度来进行灰度的显示. 例如墨水屏幕只能显示黑白,那么我们可以取样一部分区域矩,例如2x2的一个矩阵,来显示5个级别的灰度,用4个 ...
- 关于仿照js写python算法
前言 我们学校的统一认证的登录系统,用了一套不知道哪弄来的 js加密算法 (我已经查到了,应该是出自这里 地址),有一个参数是通过 js 计算得到的,无奈我先想模拟登录就必须解决这个算法,这个说明是d ...
- 【SQL】SQL常见窗口函数整理汇总大全(用到over的场景)
〇.概述 1.常用网站 SQL窗口函数:https://blog.csdn.net/liangmengbk/article/details/124253806 2.介绍 像聚合函数一样对一组数据进行分 ...
- 【大数据课程】高途课程实践-Day03:Scala实现商品实时销售统计
〇.概述 1.实现内容 使用Scala编写代码,通过Flink的Source.Sink以及时间语义实现实时销量展示 2.过程 (1)导包并下载依赖 (2)创建数据源数据表并写⼊数据 (3)在Mysql ...
- 【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型
重点版 详细版 基础知识常量和变量尽量使用常量val别使用变量var变量的命名数字字母下划线_特殊的用法数据类型java基本数据类型引用数据类型scalaAny-对象的根类AnyVal-数值类型Lon ...
- 【机器学习】李宏毅——Unsupervised Learning
读这篇文章之间欢迎各位先阅读我之前写过的线性降维的文章.这篇文章应该也是属于Unsupervised Learning的内容的. Neighbor Embedding Manifold Learnin ...
- uniapp 打包app 引入高德地图
一.高德地图注册key值 二.项目中添加配置 三.项目中引用 <view class="home-btom-box" > <view class="ho ...