概述
1、两军问题
两军问题中信道是不可靠的,并且其中没有叛徒之说。
解决方式:Tcp的三次握手可以提供相对可靠地信道通信。
2、拜占庭将军问题
概述
-
拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问。
-
拜占庭将军问题是一个协议问题。拜占庭帝国的将军们在地理位置上是隔开的,战争发生时,他们无法聚在一起来商讨进攻与否,只能彼此之间通过信使来传递彼此的决定。
-
困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻决定。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而就进攻问题达成一致?这就是著名的拜占庭将军问题。
3、区块链共识机制
概述
目前,区块链采用的共识机制主要基于工作量证明(PoW)、权益证明(PoS)、拜占庭协议(BA)等。各类共识机制在效率、安全性等方面有利有弊,目前区块链协议的效率,特别是高速处理海量数据的能力是阻碍区块链落地应用的主要障碍。
4、PBFT算法
概述
Practical Byzantine Fault Tolerance: PBFT,是联盟币的共识算法的基础。实现了在有限个节点的情况下的拜占庭问题,有3f+1的容错性,并同时保证一定的性能。
基本流程
1)从全网节点中选举出一个主节点(Leader),新区块由主节点负责生成。
2)每个节点把客户端发来的交易向全网广播,主节点将从网络收集到需放在新区块内的多笔交易,排序后打包存入列表,并将该列表向全网广播。
3)每个节点接收到交易列表后,根据排序模拟这些交易。所有交易执行完后,基于交易结果计算新区块的hash摘要,并向全网广播。
4)如果一个节点收到了2f(f为可容忍的拜占庭节点数)个其他节点发来的hash摘要都和自己相等,就向全网广播一条commit消息。
5)如果一个节点收到2f + 1条commit消息,即可提交新区块及其交易到本地的区块链和状态数据库。
算法核心三阶段流程
- pre-prepare阶段(预准备阶段)
- prepare阶段(准备阶段)
- commit阶段(提交阶段)
- 图中c代表客户端;0、1、2、3代表节点编号,打叉的3代表可能是一个故障节点或问题节点,0代表主节点(Leader)