拜占庭容错共识(PBFT)
⽂章⽬录
⼀、拜占庭容错共识
1. 什么是PBFT
共识机制堪称区块链的核⼼。我们知道,EOS、Hyperledger(之前0.x是,现在2.x已经不是。现在是Raft共识: Raft共识可以处理集中部分节点的崩溃故障,但不能处理恶意节点⾏为,因此通常⽤于节点⾝份已知的环境中,例如许可制区块链 Hyperledger Fabric 就使⽤了基于Raft共识的排序服务。)等著名的项⽬,都采⽤了BFT(拜占庭容错)共识机制,那么,BFT到底是什么?
什么是 pBFT?
Practical Byzantine Fault Tolerance ,实⽤拜占庭容错。
什么是 BFT?
Byzantine Fault Tolerance ,拜占庭容错。
区块链中最重要的便是共识算法,⽐特币使⽤的是POS(Proof of Work,⼯作量证明),以太币使⽤的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,⽽今POS的变体DPOS(Delegated Proof of Stake,股份授权证明)进⼀步削减算⼒的浪费,同时也加强了区块链的安全性。
不过,对于不需要货币体系的许可链或者私有链⽽⾔,绝对信任的节点,以及⾼效的需求上述共识算法并不能够提供,因此对于这样的区块链,传统的⼀致性算法成为⾸选,RAFT。
拜占庭将军的问题是什么?
简单地说,是⼀种少数服从多数的问题。拜占庭罗马帝国的每块封地都驻扎⼀⽀由将军统领的军队,将军与将军之间只能靠信差传递消息。在战争时期,拜占庭军队只有占据⼈数优势情况下,才能夺取⽬标的胜利。但在军队内有可能存有叛徒,当敌军与之联合起来⼤于忠诚将军数量时,进攻就会失败。
pBFT 算法的提出主要是为了解决拜占庭将军问题。
pBFT 原理
POS、PBFT共识算法的介绍母亲节对母亲说的话
参考URL: mathpretty/9602.html
pBFT 原理
参考URL: zhuanlan.zhihu/p/71075569
基于拜占庭将军问题,PBFT算法⼀致性的确保主要分为这三个阶段:预准备(pre-prepare)、准备(prepare)和确认(commit)。流程如下图所⽰:
我们⾸先解释⼀下上⾯各个符号表达的意思:
C表⽰客户端;
0,1,2,3表⽰4个节点;
0在这⾥为主节点,1,2,3为从节点;(注意,这⾥其他节点也可以作为主节点,若0发⽣错误只能由服务器监测。如果服务器在⼀段时间内不能完成客户端的请求,则会触发视图更换协议,将其他节点换为主节点)
3为故障节点;
五一祝福信息下⾯我们结合上图,详细说⼀下PBFT的步骤:
1. Request:请求端C发送请求到主节点,这⾥是0节点;
2. Pre-Prepare:节点0收到C的请求后进⾏⼴播,扩散⾄123;
3. Prepare:123节点收到后记录并再次⼴播,1->023,2->013,3因为宕机⽆法⼴播;(这⼀步是为了防⽌主节点给不同从节点发
送不同的请求)
4. Commit:0123节点在Prepare阶段,若收到超过⼀定数量(2F,实际使⽤中,F为可以容忍的拜占庭节点个数)的相同请求,则进
⼊Commit阶段,⼴播Commit请求;
5. Reply:0123节点在Commit阶段,若其中有⼀个收到超过⼀定数量(2F+1)的相同请求,则对C进⾏反馈;
根据上述流程,在 N ≥ 3F + 1 的情況下⼀致性是可能解決,N为总计算机数,F为有问题的计算机总数。
⼀个例⼦:
下⾯我们来举⼀个PBFT(实⽤拜占庭容错算法)的例⼦来进⾏说明。
我们假设N=4,F=1,即有四个节点,其中有⼀个节点是坏的,我们还使⽤上⾯的图,即节点3为故障节点。
1. 请求端C发送请求到0节点,假设这⾥请求内容为“1”;
2. 节点0收到C的请求后进⾏⼴播,将请求内容“1”扩散⾄节点123;
3. 节点1、2、3收到后内容“1”后,再次⼴播,节点1->023,节点2->013,节点3因为宕机⽆法 ⼴播;
4. 节点0,1,2会在上⼀阶段分别收到三个请求内容“1”,均超过了2个,于是节点0、1、2会分别⼴播请求内容“1”;
5. 此时如果⼀个节点(0,1,2中任意⼀个)收到3即(2+1)条commit消息,即对C进⾏反馈。
⼀个问题说明 — 为什么⾄少需要N=3F+1个节点
我们在上⾯讲到,当⽹络中有F台有问题的计算机时,⾄少需要3F+1台计算机才能保证⼀致性问题的
解决,我们在这⾥讨论⼀下原因。
我们可以考虑:由于有F个节点为故障或被攻击的节点,故我们只能从N-F个节点中进⾏判断。但是由于异步传输,故当收到N-F个消息后,并不能确定后⾯是否有新的消息。(有可能是⽬前收到的N-F个节点的消息中存在被攻击的节点发来的消息,⽽好的节点的消息由于异步传输还没有被收到。)
我们考虑最坏的情况,即剩下F个都是好的节点,收到的中有F个被攻击的节点,故我们需要使得收到的中好节点的数量N-2F⼤于被攻击节点的数量F,于是有N-2F>F,即N>3F,所以N的最⼩整数为N=3F+1。
2. 与最传统的PoW共识机制相⽐,PBFT优势和劣势
1、效率⾼
PBFT要求所有节点之间的两两通信,因此这种通信机制要求节点数量不能太多,通常是⼏⼗个,在这种模式下,节点达成⼀致的速度更快,延时更低。
2、吞吐量⾼
节点数量的控制,使PBFT⽹络不⽤像⼤型PoW⽹络那样,受限于处理能⼒最低的节点;因此带来全⽹吞吐量的⼤幅提升。
3、节能
⽆须使⽤⼯作量证明的耗电模式,因此更加节能环保。
所谓有得必有失,相对⽽⾔,PBFT⼜有以下劣势:
1、可扩展性及去中⼼化程度较弱
由于节点数量的限制,因此可扩展性较弱;同时节点需要选举、或者许可,不像PoW节点那样可以⾃由加⼊,去中⼼化程度较弱。
2、容错性较低
PoW⽹络的容错性是50%,也就是须防范51%攻击;⽽PBFT容错性只有三分之⼀,也就是34%的恶意节点即可发起攻击。
表 共识算法对⽐ 来源:中国信息通信研究院,2018 年8 ⽉
总结:
pBFT 的优点
⾼效,由于各个节点达成共识是在同⼀时刻决定的⾸先,所以pBFT ⽆需等待确认。
节能,因为pBFT 是⽆需挖矿的,所以pBFT 不⽤耗能。
pBFT 的缺点:
中⼼化,由于要保证各个节点间的频繁的通信,所以节点数不能太多。
门槛⾼,由于pBFT 不能防⽌⼥巫攻击,也就⽆法防御⼀个恶意⽤户⽤多个账户来进⾏共识的⾏为,所以需要审核加⼊节点。
所以pBFT ⽐较适合需审批的联盟链,不太适合做⽆条件加⼊的公链。
3. BFT共识开发库
区块链主流共识算法的15个开源实现
参考URL: zhuanlan.zhihu/p/99403520
Tendermint
BFT共识算法可以应对分布式系统中的拜占庭故障(Byzantine failures),也就是可以在集中部分节点存在恶意⾏为时依然保证整个系统的正常⼯作。
Tendermint Core 是⼀个拜占庭容错的中间件,可以安全的将任何语⾔开发的状态机复制到集中的其他机器上。Tendermint Core已经被⽤于Cosmos、币安链等多种公链环境中。
Tendermint Core的协议详情可以参考这⾥,开发教程访问这⾥:tendermint开发详解
(xc.hubwiz/course/5bdec63ac02e6b6a59171df3?affid=csdn7878)。
开发语⾔:Go
下载地址:github/tendermint/tendermint
大陆人口突破14亿Tendermint Core是⼀种拜占庭容错(BFT)共识引擎,可以抵御双重攻击,并且能够容忍⽹络中⼀组⾼达1/3的拜占庭⾓⾊。Tendermint应⽤程序区块链接⼝(ABCI)平台是⼀个适⽤于区块链应⽤程序开发⼈员的⼯具包。该⼯具包与任何编程语⾔兼容,允许对仅运⾏业务逻辑的去中⼼化应⽤程序进⾏更⾼级别的开发,⽽⽆需在共识层上进⾏更低级别的修补。Ethermint等平台建⽴在Tendermint ABCI平台之上。
另⼀个建⽴在Tendermint ABCI之上的项⽬是Cosmos Network,它被设计为“区块链互联⽹”。Cosmos设想了⼀个可互操作的多链⽹络,它提供了在独⽴区块链(称为区域)之间⽆信任地交换加密资产的⽅法,通过称为Cosmos Hub的主集线器链。为了使区块链开发⼈员尽可能轻松,Cosmos还附带了⼀个名为Cosmos-SDK的⼯具包,使开发⼈员可以使⽤即插即⽤模块轻松创建⾃定义区块链。
BFT-SMaRt
BFT-SMaRt是⼀个拜占庭容错的状态机复制实现,采⽤Java开发,⽬前由⾥斯本⼤学的LsSIGE研究组负责维护。BFT-SMaRt要求JRE 1.8+。
BFT-SMaRt是最知名的Java版BFT实现,京东的区块链就是采⽤这个库解决共识问题。
开发语⾔:Java
下载地址:github/bft-smart/library
BABBLE
Babble是⽤于分布式应⽤的拜占庭共识平台,它可以让⼀组计算机表现的如同单⼀计算机。Babble它使⽤P2P⽹络和BFT共识算法来保证⼀组彼此互联的计算机可以同样的顺序处理同样的命令,也就是通常说的状态机复制。Babble可以让整个系统安全的应对部分节点的故障或恶意⾏为。
Babble主要采⽤Go语⾔开发,但是其设计⽬标是可以集成进任何语⾔开发的应⽤,如上图所⽰。
至少有十年我不曾流泪这首歌叫什开发语⾔:Go
下载地址:github/mosaicnetworks/babble
Concord-BFT
笔记本电脑哪个牌子concord-bft是vmware开源的⼀个通⽤的状态机复制库,可以应对集中的恶意⾏为(拜占庭故障)。 concord-bft被设计⽤于分部署数据仓库复制的核⼼构建模块,特别适合作为许可制区块链系统的基础。
concord-bft的实现基于这⽚论⽂中的算法:SBFT: a Scalable Decentralized Trust Infrastructure for Blockchains。
开发语⾔:Python
下载地址:github/vmware/concord-bft
HBBFT
HBBFT是论⽂Honey Badger of BFT Protocols提出的蜜獾BFT共识算法的Rust实现。HBBFT要求Rust 1.36+以及cargo
蜜獾(Honey Badger)共识算法可以让分布式异步环境中的节点交易达成⼀致,该算法不需要主导节点,可以应对恶意节点的攻击,适合于去中⼼化数据库和区块链应⽤。
开发语⾔:Rust
下载地址:github/poanetwork/hbbft
libbft
libbft是⼀个轻量级的拜占庭容错库,⽤于neo区块链,采⽤C++开发,由neo研究院维护,计划移植到Python、go等多种语⾔。
开发语⾔:C++
下载地址:github/NeoResearch/libbft
⼆、参考
什么是 pBFT
参考URL: zhuanlan.zhihu/p/71075569
从0到1搞懂拜占庭容错共识机制
参考URL: www.jianshu/p/6420eb1661a0?from=groupmessage
我想喝秋天的第一杯奶茶区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
参考URL: wwwblogs/yuluoxingkong/p/13542788.html
对PBFT算法的理解
参考URL: wwwblogs/gexin/p/10242161.html
实⽤拜占庭容错系统(PBFT)共识算法
参考URL: blog.csdn/JonasErosonAtsea/article/details/109236413
[⽐较全⾯,推荐]参考URL: github/xipfs/IPFS-Internals/blob/master/ebook/13.0.md
区块链主流共识算法的15个开源实现
参考URL: zhuanlan.zhihu/p/99403520
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论