正文
非拜占庭错误。没有进行响应产生的错误。
这个问题的核心在于:
如何解决某个变更在分布式网络中得到一致的执行结果,是被参与多方都承认的,同时这个信息是被确定的,不可推翻的。
好比如何让所有的小明 X 号收到的都是《按摩指法白皮书Ⅱ》,而不是其它的,并且把原来的那本销毁掉。这个问题衍生出了很多“共识”算法,解决「
拜占庭错误
」的称作 Byzantine Fault Tolerance(BFT)类算法,解决「
非拜占庭错误
」的称作 Crash Fault Tolerance(CFT)类算法。从这个 2 个名字中也可以看出,本质的工作就是「
容错
」。有的小伙伴在平时的工作中可能对「容错」的重要性感知没那么强烈,不就产生一个 BUG 或者异常数据么,但是在航天领域,一个小错误可能导致整个发射的失败,代价非常巨大。
对「拜占庭将军问题」想深入的了解的,可以自行查阅相关资料,这里就不展开了,文末附上提出时的论文。
我们常见的软件开发中一般不会考虑「拜占庭错误」,但它是区块链项目的必需品。不过在主流的分布式数据库中,皆能看到「非拜占庭错误」的身影,诸如 Tidb 的 Paxos 算法,CockroachDB 的 Raft 算法。虽然我们大家在日常的 coding 中,对数据库底层原理的了解并不是必须项。但是只要当我们涉及到应用程序级别的高可用时,那么至少「非拜占庭错误」是必须要面临的一道坎。
BFT 类型算法又有 2 个分支。「
基于确定性的
」和「
基于概率的
」。
先聊聊「基于确定性的」,此类算法表示一旦对某个结果达成共识就不可逆转,即共识是最终结果。它的代表作是 PBFT(Practical Byzantine Fault Tolerance)算法
[2]
,自从有了央行背书(区块链数字票据交易平台),名声更大了。算法的原理,如下图。
▲图片来源于网络,版权归原作者所有
拿军队来比喻,这里的直线 C 可以认为是“总司令”,直线 0 是“军长”,直线 1、直线 2、直线 3 都是“师长”,值得注意的是 3 号师长叛变了。整个过程这样解释。
-
「request」:总司令给军长下了一个命令,“干!”。