如果关注区块链,有一个问题可能或多或少都听说——拜占庭将军问题(Byzantine failures)。那么到底什么是拜占庭将军问题呢?拜占庭将军问题其实是一个假想出来的问题,是用来理解多个节点的通信网络中能否保持消息传递的一致。
拜占庭将军拜占庭是东罗马帝国的首都。在古代,帝国的各个城池之间距离很远,通信不便,只能通过信使在城池间传递消息。假定发生战争时,如果想取得胜利,必须制定一个统一的作战计划,并且让计划内容传递到各个城池,以便让全部的军队按照统一的计划行动。
但考虑到驻守城池的将军中可能存在叛徒,叛徒可能会破坏这个统一的计划,他们不会按照计划行动或向其他城池传递虚假的信息。因此在最开始就要考虑的这种情况,采取什么方案,才能使得一小部分叛徒不会影响大部分忠诚将军能够达成一致。
建立共识达成胜利那么,整个问题和区块链有什么关系呢?我们知道,区块链所使用的就是对等网络,各个节点间是对等的,且网络环境复杂,可能会出现某些节点断网或无法抵达,也可能出现一些恶意节点向外传递错误或虚假信息。这个情况和拜占庭将军问题十分类似,核心都是要解决在对等的节点间建立起一种统一的共识,只要大部分成员是正常的,那么就能保证整个系统不会被破坏。
回到拜占庭将军问题,如果有兴趣可以去查看其最初提出这个问题的作者Leslie Lamport的论文The Byzantine Generals Problem。当消息通过口头传播,且传递不会被干扰,消息接收者可以区分消息发送者且知道缺少的消息,则对于m个叛徒,当总人数达到3m+1及以上时,问题可解决。但这只是一种理想的状态,Fischer等人也在其论文Impossibility of distributed consensus with one faulty process中表示,在一个多进程异步通信的过程中,只要有一个进程不可靠,就不能保证在有限时间内使所有进程达成一致。因此,在分布式的异步通信过程中,找到一种实用算法进行通信一直是个难题。
实际应用过程中,往往会根据场景和目的,会在传递效率和容错性之间做不同的取舍。在比特币区块链的这种分布式通信系统中,采用了工作量证明(PoW)共识机制和最终一致性的共识的方案。首先,发送信息时会使用非对称加密的方式进行签名,所有人都可以对签名的真实性进行验证。进行记录的节点必须通过PoW以证明自己的权限,这大大提高了造假的成本。在建立共识的过程中,允许节点在短时间内存在不一致,最终根据PoW建立起的共识来确保最终一致性。
也因为其通过工作量证明建立共识,所以理论上,假设如果有一个计算能力非常庞大的节点,大到可以凭借其计算能力推翻之前建立的共识,那么这个记录也会被其推翻。比特币中使用的PoW机制能否解决拜占庭将军问题一直存在争议。Juan Garay在The Bitcoin Backbone Protocol: Analysis and Applications中对比特币的PoW算法进行了分析,其结论是PoW是一种概率性的拜占庭协议。当不诚实节点接近50%,不能保系统的安全性,超过50%则系统是不安全的。
这里面会有另外一个问题,如果能够集中超过全网一般以上的算力,那需要极大的代价,当网络拥有一定规模以后便很难做到。即便能够集中如此多的几点,选择作为一个诚实节点的收益会远大于其对于网络的攻击,因为一旦发生欺诈的行为,会被其他诚实节点发现,因而这个系统便失去了信用,而选择遵守规范带来的收益是明确的。当欺诈行为代价巨大且可衡量,而收益也明确可衡量时,理性人不会选择这种方式。
但PoW机制也带来了其他问题,这个机制开始设想的是通过CPU的计算能力建立共识,CPU可以看做是均匀分布的。但由于这其中存在收益,“挖矿”的方式从最开始的CPU变为GPU、FPGA以及专用于哈希计算ASIC矿机。计算能力迅速集中到一些拥有大量矿机的矿主,同时大量用于哈希计算的机器要消耗大量的电能。因此比特币的争议也一直没有停息,也催生了一些其他替代的共识机制的研究。
注:图片来源于网络
网友评论