实用拜占庭容错(PBFT)算法是什么? | 金色百科
要了解拜占庭容错算法,我们可以先了解“拜占庭将军问题”。拜占庭(Byzantine)位于今天土耳其的伊斯坦布尔,是千年前东罗马帝国的首都。由于东罗马帝国疆域极为辽阔,有多位将军率领各自的部队驻扎在帝国各处,无论是出于防御还是攻击的目的,都需要多名将军的合作,这些军队从各地同时向目标位置发起进攻,那么必须要达成一致的行动指令才能获得胜利。
如何在可能心怀叛逆的将军之间达成统一的指令呢?这就类似区块链分布式网络中存在出错的节点或者恶意节点时的状况。这些节点可能因为种种原因伪造签名、恶意破坏系统的一致性、网络波动造成超时或者重复发送信息等,这要求区块链网络的共识机制有容错设计,在部分节点作恶或者失效之时仍然能达成整体的一致性。
实用拜占庭容错算法(Practical Byzantine Fault Tolerance)刚开始是在MIT的Miguel 和 Barbara Liskov在1999年的学术论文中提出的,他们的本意是为设计一个低延迟存储系统设计系统,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行,主要是为了应用于不需要大交易量但需要处理许多事件的数字资产平台,每个节点都可以发布公钥,这是被允许的。节点将签名所有通过节点的消息,以验证其准确性。当得到一定数量的签名想用,此交易就被认定为有效。
PBFT算法的运作步骤为:
(1)取一个副本作为主节点,其他的副本作为备份;
(2)用户端向主节点发送使用服务操作的请求;
(3)主节点通过广播将请求发送给其他副本;
(4)所有副本执行请求并将结果发回用户端;
(5)用户端需要等待F+1个不同副本节点发回相同的结果,作为整个操作的最终结果。
PBFT对每个副本节点提出了两个限定条件:
(1)所有节点必须是确定性的。也就是说,在给定状态和参数相同的情况下,操作执行的结果必须相同;
(2)所有节点必须从相同的状态开始执行。
PBFT算法包含三个重要阶段,分别是预准备(pre-prepare)、准备(prepare)和确认(commit),pre-prepare阶段和prepare阶段用来把在同一个view里发送的请求给确定下序列,就是排好序,让各个replicas节点都认可这个序列,照序执行。prepare阶段和commit阶段用来确保那些已经达到commit状态的请求即使在发生view change后在新的view里依然保持原有的序列不变
PBFT算法存在的问题:
-
计算效率依赖于参与协议的节点数量,不适用于节点数量过大的区块链系统,扩展性差。
-
系统节点是固定的,无法应对公有链的开放环境,只适用于联盟链或私有链环境。
-
PBFT算法要求总节点数n>=3f+1(其中,f代表作恶节点数)。系统的失效节点数量不得超过全网节点的1/3,容错率相对较低。
另外PBFT算法有一个弱点,其不能很好的存贮记录其交易信息,黑客能够截取一些失效的副本,这会让信息外漏。
本质上来说,拜占庭容错方案就是少数服从多数。目前有一些机构正在关注实用拜占庭容错算法,比如中国ChinaLedger 联盟和HyperLedger联盟就在研究探讨其的实际应用。迅雷发布的迅雷链也是使用的这一共识算法。
来源:金色财经