拜占庭将军问题----与海沟通后的整理
非常感谢海的关于拜占庭将军的分享以及对我提出的所有问题的耐心讲解。下面我想分享一下与海沟通后的整理结果,希望对大家有一点点帮助。
拜占庭将军有两个容错方式,一个用在私链中,一个用在公链中,PBFT和DBFT。那我们今天讲一下在私链中。
IC1:即所有的忠诚的副官要遵守同一个命令,即达成一致。
或IC2:假如将军是忠诚的,那么每一个忠诚的副官都应该按照将军的意思行事。
上面这两个是拜占庭将军的容错条件,先讲第二个吧,IC2,因为比较简单,就是如果将军是可信任节点,发出的数据就是可信任的,那么其他所有节点按照命令执行就可以了。
再讲第一个,IC1:即所有的忠诚的副官要遵守同一个命令,即达成一致。就是说不可信任的节点发出的,其他节点按照投票来执行,即达成一致。我先插入海的图片。
拜占庭将军这个问题是叛徒必须少于1/3,假设这里一共有7个人,包括将军吴老师,总数n=7, 叛徒少于1/3,就是要少于7/3, 所以最大叛徒数m=2。
假设吴老师是叛徒,娜娜也是叛徒。然后上面的S是唱歌,D跳舞。咱们为了达成最后唱歌S的这个协议。吴老师先发出的命令,给妖发出的是S,给蓝发出的是D,给M发出的是S,给津津发出的是D,给娜娜发出的是S,给达因发出的也是S。
第一轮:所有人收到吴老师的请求后,生成区块,并进行广播。每个人会将自己收到的数据挨个点对点的发送给其他的人。
第二轮:所有人在收到区块广播后,进行区块验证,同时等待2/3区块的结果。也就是说所有人收到区块后,将其他人提供的数据一一核对(第二轮进行的是第一次比对),以其中的2/3的共同结果为最终结果,并公布自己得出的结果。紫色划线的S代表容错后每个人得出的结论是S,也就是经过第二轮确认后,最终发出的。到这里,其实大家已经达成一致了,但是必须还要经过第三轮验证,海说这是程序设定的。
第三轮:把自己的原始数据,和其他所有人从不同的人那里收到的数据做对比(这里是第二次比对)。先上图。
比如第一行是所有人从蓝那里收到的第二轮(第一次比对)确认的数据。第一个是M从蓝那里收到的第二轮数据,第二个是津从 蓝那里收到的,第三个是娜娜从蓝那里收到的,第四个是达因从蓝那里收到的,最后一个是妖从蓝那里收到的,得出的结论全部都是D。第二行就是所有人从M那里收到的第二轮数据,最后一个数据是妖从M那里收到的,得出的结论全部都是S。以下同理。这一整页都是妖在做对比,底下括号里的第一个S就是妖自己的数据,后面的DSDS就是从第一行到最后一行得出的数据,娜娜的数据没有被采用,因为不同的人从她那里得到的数据不一样,证明她是叛徒。结果是SDSDS,S占多数,所以第三轮,妖确认的结果是S,并将这个结果发送出去。
其他人也用同样的方式进行第二次比对。请看下图,海没有将它填完整。这张图说明的是,蓝也在进行和妖一样的第二次比对。第一行是所有人从妖那里收到的第二轮(第一次比对)确认的数据。第二行是所有人从M那里收到的数据,以此类推。蓝第三轮确认的结果也是S,并将这个结果发送出去。
同样的方法,其他的几个人也都会得出S的结论,除了叛徒娜娜不一定,但是她的结果并不会影响整体结果,甚至她的结果在每个人做第二次比对的时候就已经不予采纳。