拜占庭的问题是:在一个集群中,某些节点可能是恶意的。而恶意的节点的目标是阻止集群获得协商一致。

而目标是:有足够多的正常节点,最终能够获得一致。

Assumption:

  1. f个坏人,至少3f+1个总节点,即至少2f+1个好人。也就是说坏人少于三分之一
  2. 因为有数字签名的存在,所以消息不可被篡改。

Step:

  1. client 发送请求去所有的server
  2. PrePrepare leader把信息分发给所有的server 该信息称之为PrePare
  3. Prepare server互相之间传信息,该信息称为Prepare
  4. Reply 所有server回传给client

每个server prepare收到的时候至少是2f+1,包括自己。
如果拿不到2f+1个匹配的,stack住

if leader是好人,肯定能工作,所有的好人就能按照同一个顺序执行副本状态机。

else if leader 是坏人。
if leader装好人,肯定能匹配 2f+1个人 拿到了2f+1个匹配的prepare信息。
else leader给乱序, f+1 ~ 2f个好人,拿到了 2f+1个匹配的prepare信息。
剩下的f个人,不会执行副本状态机
但此时,至少f+1个好人,会执行相同的副本状态机,可以认为这些依然是正确的。

        0~f个好人,拿到2f+1个Prepare的信息。

结论:1. $\all n \belong [0, 2f+1]$可以执行副本状态机。
    2. 如果两个好人,发了reply,那么执行的状态机一定是一样的。
    3. 最多只有一组f+1发了相同的reply。

    保证了不会出现分叉。

但是缺点是 会 stack住,所以须发发起view change的请求,来fix这个缺点。

next leader: (n+1)% N, n为 term, 即 view 的编号,是一个单调递增的int值。