【Libra 技术解读】详解Libra共识源码

筅森魡賤 提交于 2020-04-07 10:31:33

本文作者:nonoren1985

 

Libra技术系列解读

往期回顾:

move语言简介

move语法、解释器和验证器

LibraBFT共识机制

 

本期由百度超级链颜值与才华并存的“小X姐姐”带来

“Libra共识源码”详解

快来围观吧!

 

一、LibraBFT算法简介

 

上一篇对于LibraBFT进行了相关的介绍,本文在正式开始前,先再介绍一下相关的概念和流程:

 

基本概念:

 

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

 

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

 

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

 

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

 

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

     b. 每个epoch有一个唯一的epochid所标识;

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

 

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

 

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

 

7. Records,LibraBFT的状态是由一系列records组成的。

主要包括四种,blocks、votes、quorum certificates(QCs)和 timeouts。

 

基本流程:

 

 

 

 

 

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

 

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

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

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

 

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

 

二、Libra共识源码结构和子模块功能

 

Libra共识模块代码主要在 consensus 包中,它定义了Libra共识的抽象接口及其具体实现。目前Libra团队只实现了LibraBFT。consensus包是一个独立的可编译的单元,编译后生成一个库。其代码目录结构和各层级的模块的主要功能如下所示:

 

  • consensus包目录结构如下:

 

 

  • consensus包中各层级中定义的模块如下,如下所示: 

 

 

三、Libra共识源码走读

1. Libra程序入口

 

Libra代码的入口在 ./libra_node/src/main.rs中,启动服务主流程的代码在 ./libra_node/src/main_node.rs,

 

 

 

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

 

 

2. 共识模块初始化

 

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

 

 

 

 

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

 

 

 

 

ChainedBftProvider 的new方法定义了其实例初始化的过程,

 

 

 

 

至此,共识实例初始化完毕~ 

 

 

3. 共识模块启动&运行流程

 

前面已经介绍完了共识模块初始化的过程,接下来我们看一下共识服务具体是如何运作的。LibraBFT服务启动函数是 ChainedBftProvider.start()。它实现了Libra共识的通用接口 ConsensusProvider,该接口定义在 ./consensus/src/consensus_provider.rs 中。ChainedBftProvider.start()的主要是启动smr,代码如下:

 

 

 

 

上述提到的 smr 是一个ChainedBftSMR的实例,ChainedBftSMR是libra  StateMachineReplication接口的具体实现,ChainedBftSMR.start()是启动smr的完整流程。

 

 

主要包括3个阶段:

 

第一步:首先会同步到网络中的最新状态;

第二步:初始化 block_store、proposal_generator、safety_rules、pacemaker、event_processor等;

第三步:启动事件处理handler。

 

 

 

 

四、共识模块整体流程图

 

 

通过前面的介绍和代码走读,相信大家应该对libra共识的整体流程有一个比较清晰的认识了,接下来用一个流程图,帮助大家更加直观过整个流程。

 

 

 

 

 

 

如果你对百度超级链(Xuper)技术及应用感兴趣

欢迎添加“百度超级链·小助手“微信(微信号:baidu-image)

验证口令:百度开发者

进入微信群交流

 

 

 

 

 

原文链接地址:https://developer.baidu.com/topic/show/290251

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!