首页 > 应用 > 通信

LibraBFT算法的原理和基本工作流程解析

2019-07-11

一、LibraBFT算法简介POD电子头条

 POD电子头条

基本概念:POD电子头条

 POD电子头条

1. SMR(State Machine Replication):在计算机领域,SMR是在网络中不同副本间进行状态复制的一种协议。POD电子头条

 POD电子头条

2. Safety: 简单地理解就是共识的一致性保证,即诚实的节点能够达到状态一致;POD电子头条

 POD电子头条

3. Liveness: 简单地理解为区块链网络的可用性,类似于分布式系统中的分区可用性;POD电子头条

 POD电子头条

4. Epochs,实际的应用中,参与协议的节点的状态是随着时间而发展的,LibraBFT中通过epoch来支持这种状态更迭。POD电子头条

 POD电子头条

a. 每个epoch都是基于他的前一个epoch发展的。或者基于一个系统定义的初始epoch;POD电子头条

 POD电子头条

b. 每个epoch有一个唯一的epochid所标识;POD电子头条

 POD电子头条

c. 每当一个新的epochid被提交,当前这个epoch会结束,下一个epoch会开始;POD电子头条

 POD电子头条

5. LibraBFT假设网络是一个有全局稳定时间(GST),并且最大延时(ΔT)可控的 ParTIal Synchrony的网络;POD电子头条

 POD电子头条

6. LibraBFT假设非拜占庭节点一定会按照协议履行职责并且能保证可用。POD电子头条

 POD电子头条

7. Records,LibraBFT的状态是由一系列records组成的。主要包括四种,blocks、votes、quorum certificates(QCs)和 TImeouts。POD电子头条

 POD电子头条

基本流程:POD电子头条

 QQ截图20190711092741.jpgPOD电子头条

当一个节点被选择成主时,它会执行下面3个步骤:POD电子头条

 POD电子头条

第一,打包第n+1个区块Bn+1,并追加在最新的QC之上;POD电子头条

 POD电子头条

第二,将这个区块广播Bn+1给所有验证节点,诚实的验证节点会验证区块并返回投票信息给主节点。POD电子头条

 POD电子头条

第三,在没有bug的前提下,诚实节点会执行Bn+1。并且主节点在收集到足够的投票后会为这个区块发起一个QCn+1,并且广播。POD电子头条

 POD电子头条

经过上述一个周期的过程,链的长度会增长,变成h(init)← B1←C1.。. Bn+1←Cn+1。并且旧的leader会结束任期,新的leader会被选举出来并进行新一轮的区块打包。POD电子头条

 POD电子头条

二、Libra共识源码结构和子模块功能POD电子头条

 POD电子头条

Libra共识模块代码主要在 consensus 包中,它定义了Libra共识的抽象接口及其具体实现。目前Libra团队只实现了LibraBFT。consensus包是一个独立的可编译的单元,编译后生成一个库POD电子头条

 POD电子头条

三、Libra共识源码走读POD电子头条

 POD电子头条

1. Libra程序入口POD电子头条

 POD电子头条

Libra代码的入口在 。/libra_node/src/main.rs中,启动服务主流程的代码在 。/libra_node/src/main_node.rs,POD电子头条

 POD电子头条

上述NodeConfig是节点的配置,共识相关的配置在其之中,在 。/config/src/config.rs 中 ConsensusConfig结构中定义。POD电子头条

 POD电子头条

2. 共识模块初始化POD电子头条

 POD电子头条

初始化的代码在 。/consensus/src/consensus_provider.rs 中,该函数返回了一个 ChainedBftProvider 实例,该实例就是LibraBFT实例:POD电子头条

 POD电子头条

ChainedBftProvider 定义在 。/consensus/src/chained_bft/chained_bft_consensus_provider.rs 中,他有四个成员变量,分别是状态副本实例以及其余各个其他模块交互的客户端。POD电子头条

 POD电子头条

ChainedBftProvider 的new方法定义了其实例初始化的过程,POD电子头条

 POD电子头条

至此,共识实例初始化完毕~POD电子头条