前面描述过PBFT的仿真方式,见区块链实验室(3) – 用Go语言仿真PBFT算法,本文以上述仿真程序说明PBFT的共识过程。
为叙述方便,首先给出1个简化的网络,共4个节点,构成如下图所示的网络。这样的网络可以避免冗余的网络报文。从0节点开始,利用PBFT算法对1条消息完成共识。
完成该消息的共识后,各节点的报文如下所示。首先是节点0的网络报文。
1:表示节点0的报文
2:这是发出消息的共识请求,本文从0节点开始进行共识
3:从0节点开始的共识请求,马上向它的邻居节点1节点发送preprepare报文
4:0节点向其邻居1节点发送commit报文。这条消息在时序上靠后,结合其他节点的报文来阅读。
节点1的网络报文
1:表示节点1的报文
2:来自0节点的preprepare报文,由1节点转发给2节点
3:节点1验证preprepare报文后,创建自己的prepare报文,发给节点0和节点2
4:同上
5:向节点0转发prepare报文,该报文由节点2或者节点3创建,由节点2转发而来
6:向节点0转发prepare报文,该报文由节点3或者节点2创建,由节点2转发而来
7:节点1创建commit报文,发送到邻居节点0和节点2
8:同上
9:向节点0转发commit报文,该报文来自节点2。此时节点1已经收到足够多的commit报文,不必等节点3的commit报文。
10:节点1创建reply报文,该报文不再广播,而是直接发给目标节点0
11:节点1转发其他节点的reply报文
12:同上
节点2的网络报文
1:节点2的报文
2:来自节点1的preprepare报文,由节点2转发给节点3
3:创建prepare报文,转发给邻居节点1和3
4:同上
5:转发prepare报文,该报文来自节点3
6:转发prepare报文,该报文来自节点1
7:创建commit报文,发给节点1
8:同时发给节点3
9:转发节点3的commit报文给节点1
10:创建reply报文,发给节点1
11:向节点1转发节点3的reply报文
节点3的网络报文
1:节点3的报文
2:创建prepare报文并发送
3:创建commit报文并发送
4:创建reply报文并发送