网络上流传的很多关于PBFT的一些解释其实并不严谨,有些甚至是错误的,本人按照自己的理解指出一些常见的误区。
概念说明:
作恶节点:修改数据的节点
故障节点:因各种原因导致信息丢失无法对其他节点做出反馈的节点(失联节点)
误区一:PBFT解决的是拜占庭将军问题
严格来说,PBFT不但解决了拜占庭将军问题,还解决了两军问题。
国内很多人在解释拜占庭将军问题的时候,其实是把拜占庭将军问题和两军问题糅合在一起来说的,他们自己根本没有理清楚“PBFT”、“两军问题”、“拜占庭将军问题”之间的关系。
其实PBFT的逻辑性非常强,但是如果读者不细究细节的话,很容易就会把网络上错误的解读当成正确的解释。
国内大量解释拜占庭将军问题的文章将两者混为一谈,其实是混淆了两个问题的实质,由此造成了许多误解。这两个问题看起来的确有点相似,但是问题的前提和研究方向都截然不同。
拜占庭将军问题:不考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问(通信兵一定会送达消息,但消息不一定正确)。
两军问题:通信兵在经过敌人沟渠的过程中可能被捕,也就是说,两军问题中信道是不可靠的,并且其中没有叛徒之说。(通信兵不一定会把消息送达,但一旦送达消息就是真的)
这就是两军问题和拜占庭将军问题的根本性不同,大量混淆了拜占庭将军问题和两军问题的文章并没有充分理解两者。
误区二:PBFT中3f+1的解释
国内流行很多版本的解释,例如:
- 正常节点f个、作恶节点f个、故障节点f个,所以是3f+1.(极其错误的解释)
- N个节点,有f个非正常节点,(1)这f个节点全是作恶节点,这时候N个节点全都返回消息,需要从接收到的N个节点中做出正确判断,所以N-f>=f,所以N>2f。(2)这f个节点全是不返回消息的故障节点,这时需要从接收到的N-f个消息中做出判断,所以N-f-f>f,所以N>3f。(跟第一种解释类似,证明过程极其不严谨)
- N个节点,假设有F个拜占庭节点,则消息需要从N-f个节点中判断,如果由于网络延迟等原因,诚实节点的消息还未到达,极端情况下N-f中有F个拜占庭节点,如果要保证消息的正确性,至少需要诚实消息大于f则有N-2f>f,则至少需要保证N=3f+1。(已经比较接近正确的解释了,但部分用词不严谨、逻辑上存在跳跃)
误区三:PBFT的3f+1中 f 的含义
f并不是单指作恶节点或故障节点,而是两者的混合体。误区2中的第二种解释,先假设f是故障节点,在假设f是故障节点的基础上再假设f是作恶节点,那到底f是什么节点?这样解释虽然也得出了N>3f,但这种解释经不住细节的拷问。(在假设1的基础上做假设2是可以的,但是你的假设2不能既在假设1的基础上同时还修改假设1的条件)
关于f正确的理解应该是:f既有可能是作恶节点、又有可能是故障节点。对3f+1的解释也应该是在这个理解的基础上找边界值,而不是假设来假设去地设置一堆前后矛盾的假设。
对PBFT的3f+1的解释,我会在后面的文章中解释。