原始的拜占庭容错系统因为须要展现理论上的可行性而缺少实用性。另外,算法的复杂度也是随节点的增长而呈指数级增长。实用拜占庭容错系统(Practical Byzantine Fault Tolerance, PBFT
)下降了拜占庭协议的运行复杂度,从指数级别下降到多项式级别
,使拜占庭协议在分布式系统中应用成为可能。git
实用拜占庭容错系统是一类“状态机”拜占庭系统(这里的状态机能够理解为“系统状态”,以区块链记帐为例,系统每新增一个区块,帐本就更新到一个新的状态。前面讲过,拜占庭容错系统是一个强一致性协议,每次记帐后系统都会达成新的状态。),要求系统全部节点共同维护一个状态,全部节点采起的行动一致。github
实用拜占庭容错系统须要运行三类基本协议:算法
咱们主要关注支持系统平常运行的一致性协议。json
一致性协议至少包含请求(request)、序号分配(pre-prepare)、响应(reply)三个阶段。根据协议设计的不一样,可能包含相互交互(prepare) 、序号确认(commit)等阶段。服务器
PBFT系统一般假设故障节点个数为m个,而整个服务节点数为3m+1个。app
上图显示了一个简化的 PBFT 的协议通讯模式,其中C为客户端,N0~N3为服务节点,N0为主节点,N3为故障节点。协议的节本过程以下:curl
当主节点接收请求后,启动三阶段的协议以向各从节点广播请求分布式
在 n ≥ 3m + 1 的情況下一致性是可能解決的,其中,n为总节点数,m为恶意节点总数。咱们模拟一下PBFT:
n = 4, m = 0区块链
节点 | 获得数据 | 最终结果 |
---|---|---|
A | 1111 | 1 |
B | 1111 | 1 |
C | 1111 | 1 |
D | 1111 | 1 |
n = 4, m = 1测试
节点 | 获得数据 | 最终结果 |
---|---|---|
A | 1110 | 1 |
B | 1101 | 1 |
C | 1011 | 1 |
D | 0111 | 1 |
n = 4,m = 2
节点 | 获得数据 | 最终结果 |
---|---|---|
A | 1100 | 1 |
B | 1001 | 1 |
C | 0011 | 1 |
D | 0110 | 1 |
git clone https://github.com/bigpicturelabs/consensusPBFT.git
go build main.go
新打开 5 个终端
./main Apple ./main MS ./main Google ./main IBM curl -H "Content-Type: applicaton/json" -X POST -d '{"clientID":"ahnhwi","operation":"GetMyName","timestamp":859381532}' http://localhost:1111/req