hyperledger fabric PBFT算法简要解析
来源:互联网 发布:淘宝库房分拣员累吗 编辑:程序博客网 时间:2024/06/06 16:27
fabric的 hyperledger共识算法代码全部都在consensus文件夹里,consensus文件夹里主要分为controller,executor,helper,noops,pbft,util文件模块。
其中consensus.Go 主要包含了算法插件内部对外部暴露的接口和hyperledger外部对算法内部暴露的接口。
- controller:共识算法模块是可插拔的,在controller里面可以选择具体使用哪种共识算法。目前hyperledger它提供了一个pbft算法和一个比较简单的noops算法。
- executor:executor和helper是两个相互依赖的模块,主要提供了共识算法和外部衔接的一块代码。主要负责事件处理的转接。
- helper:这里面主要包含了对外部接口的一个调用,比如执行处理transaction,stateupdate,持久化一些对象等。
- noops: noops也是一种比较简单共识算法
- pbft: pbft算法,下面会简单的介绍一下pbft算法的调用流程。
- util: 一些交互需要的工具包,最主要的一个实现的功能就是它的消息机制。
下面简要介绍两点,一点pbft算法代码内部从头到尾的一个调用流程,一点是pbft算法内部的事件机制和timeout代码的一个简要解析。
内部调用流程
在engine.go里面有获取一个共识算法plugin
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
它初始化一个consenter和一个helper,并互相把一个句柄赋值给了对方。这样做的目的,就是为了可以让外部调用内部,内部可以调用外部。
首先看一下它是如何初始化一个共识模块的:
1. 调用controller获取一个plugin,当选择是pbft算法时,它会调用pbft.go 里的 GetPlugin(c consensus.Stack)方法,在pbft.go里面把所有的外部参数读进算法内部。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2. 用方法newObcBatch(id uint64, config *viper.Viper, stack consensus.Stack)初始化一个obcbatch对象。这个batch对象的作用就是用来做request缓存,提高transaction的执行效率,如果每来一个请求就去做一次共识,那代价会很高。缓存存储在batchStore里。 3. 在newobcbatch时,会初始化得到一个pbftcore的一个实例,这个是算法的核心模块。并此时会启动一个batchTimer(这个batchTimer是一个计时器,当batchTimer timeout后会触发一个sendbatch操作,这个只有primary节点才会去做)。当然此时会创建一个事件处理机制,这个事件处理机制是各个模块沟通的一个bridge。 4. 在初始化pbftcore时,在把所用配置读进的同时,创建了三个timer
- 1
- 2
- 3
- 1
- 2
- 3
- newViewTimer对应于viewChangeTimerEvent{},当这个timer在一定时间没有close时,就会触发一个viewchange事件。
- vcResendTimer对应viewChangeResendTimerEvent,发出viewchange过时时会触发一个将viewchange从新发送。
- nullRequestTimer对应nullRequestEvent,如果主节点长期没有发送preprepare消息,也就是分配了seq的reqBatch。它timeout就认为主节点挂掉了然后发送viewchange消息。
当然理解以上东西需要了解pbft算法的各个具体流程。以上是pbft算法插件的初始化流程, 并讲解了部分初始化我认为比较重要的信息。具体初始化需要看代码了。
算法内部的事件机制
为什么要把事件机制单独提出来,因为要想完全看懂它的调用流程,就必须理解它的事件流。说起来它的事件流真是复杂,我觉得可以不必要这么复杂。
它有两个事件流,一个是在helper里,一个是在batch里。
首先分析一下它的事件流工具,它整个代码都在util包里的events.go,我认为这个设计还是棒棒哒,在我自己的共识算法测试环境里,对它改装了一下,感觉还是不错的。
首先看一下它提供的接口
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
SetReceiver(Receiver)是一个很重要的接口,决定了这个事件机制的灵活性。考验我表达能力的时候到了~~,一个事件机制必定有一个输入和一个输出,这个SetReceiver(Receiver) interface 方法就决定了事件流的去向。下面是receiver的interface,凡是事件的接受者都必须实现ProcessEvent(e Event) Event方法。batch里面实现了此方法。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
那对应的输出,Queue() chan<- Event ,它返回一个event channel,你所有的消息尽管往里面发。接收者取决于receiver。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
这段代码是把事件传给receiver处理。举个batch事件流机制的例子。
在external.go里面实现了接收外边request请求的接口。在obcbatch初始化会对其创建并且把event manager复制给externalEventReceiver。因此所有接收到这个manager的消息都会进入到batch里面。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
当接收到一个request时,将batchMessageEvent放到事件流,之后
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这个死循环接收到的event 进行了em.Inject(next),并执行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
之后在obcbatch ProcessEvent里执行了这个操作
- 1
- 2
- 3
- 1
- 2
- 3
这是消息往里抛的过程,同理,消息往外抛,就是算法内部把event抛给外部executor的event manager。
Timer机制
timer机制和event机制有很大关联,time out后,会把事先创建的event塞到eventmanager里的事件流里。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
设置time out主要是SoftReset和reset方法。因此在初始化,会把Manager传给Timer。
但这样的事件机制在大数据处理时,可能会出现问题。
- hyperledger fabric PBFT算法简要解析
- hyperledger fabric PBFT算法简要解析
- hyperledger fabric PBFT算法简要解析
- Hyperledger Fabric 架构解析
- Hyperledger Fabric的PBFT源码分析(一)
- Hyperledger Fabric创世纪块源码解析
- Hyperledger fabric V1.0 架构解析
- Hyperledger Fabric
- PBFT算法
- Hyperledger Fabric继peer启动之后的源码解析一
- Hyperledger Fabric继peer启动之后的源码解析二
- Hyperledger Fabric继peer启动之后的源码解析三
- hyperledger fabric 简析start
- HyperLedger Fabric协议规范
- IBM HyperLedger fabric
- hyperledger fabric 简析start
- IBM HyperLedger fabric 详解
- IBM HyperLedger fabric基础
- CODEFORCES 735D Taxes
- 在twitter上看到的一个有趣的算法
- thinkphp命名空间
- MySQL索引原理及慢查询优化MySQL索引原理及慢查询优化
- SDN资料整理
- hyperledger fabric PBFT算法简要解析
- Mysql 多表查询基本操作 第五更
- iOS开发 在cell中找到它在tableView中的indexPath
- Shell 全局替换
- 硬盘划分原理与存取机制
- laravel excel 导入
- 【淘淘】拦截器原理、实现
- 截屏应注意的细节和尝试(导出的图片一片黑色)
- OpenStack 镜像服务Glance [三]