人们信任这样的分布式系统,是因为该系统有很强的安全性,能够保护用户的资产不被黑客攻击,不因为某些用户的恶意行为,或者故障的出现导致网络瘫痪。在这样的自由网络中,节点们绝大多数会按照比特币协议的规定去执行指令,然而也很可能会有一些节点,并不按照协议规定的行为去执行。公众号关注:博森科技小蝶。
例如,有部分节点可能因为掉线而突然中止工作,还有的节点可能为了一些其他目的发送非法交易或进行黑客行为,以试图阻碍比特币网络的正常运转。这些非正常的节点,又被称之为故障节点。在这样的自由的公共网路中,我们没有办法去阻止这部分用户的非正常行为,那么如何设置协议使得网络可以防止这部分行为对网络运转带来的影响,使得网络的安全性与一致性不会受到阻碍呢?这个问题有一个很有趣的故事作为原型,即拜占庭将军问题。
拜占庭将军问题其实不像传说中那样,源于公元5世纪的东罗马战场,而是产生于1982年一个美国科学家写论文时的头脑风暴。
拜占庭国土辽阔,为了防御敌人,每个军队都分隔很远,互相之间只能通过通讯员进行两两通讯。而战争时,拜占庭军队内所有将军意见必须一致,同时进退才能赢。此时假设有5个平级的将军,要一起决定进攻还是撤退,以及进退的时间,他们必须达成一致。每个将军都派出信差,将自己的决定传达给其他四位将军,这样一来,每个将军看到信息后,加上自己的决定,如果有不少于3个将军的决定相同,那便作为最终的决定。
那么问题来了,困扰这些将军的是:不确定他们中是否有叛徒?叛徒会不会擅自变更进攻意向或者进攻时间?另外,即使没有叛徒,五位将军一致进攻,但通讯消息不及时,设想的进攻时间不一致,秩序混乱,又怎么办?
后来人们把拜占庭将军问题引申到通信领域,描述一个分布式系统中进行信息交互时面临的难题。假设区块链分布式网络中存在出错的节点或者恶意节点,这些节点可能因为种种原因伪造签名、恶意破坏系统的一致性。这就要求区块链网络的共识机制有容错设计,在部分节点作恶或者失效之时仍然能达成整体的一致性。
实用拜占庭容错算法是一个循环,在每一轮中,首先会根据设定的规则选出一个主节点,由其来组织网络中的交易,这整个处理过程分为三个阶段:分别是预准备阶段、准备阶段和确认阶段。在每一个阶段中,都会进行投票,在本阶段中只有超过2/3的投票同意才会进入下一个阶段,每轮结束后都会产生一个新区块。
目前有一些机构正在关注实用拜占庭容错算法,比如中国China Ledger联盟曾经就在研究探讨其实际应用,Fabric联盟链也曾经使用该算法作为其共识协议,迅雷发布的迅雷链也是使用的这一共识算法。
但是实用拜占庭容错算法也存在着一定的缺点,首先计算效率依赖于参与协议的节点数量,不适用于节点数量过大的区块链系统,扩展性差;其次系统节点是固定的,无法应对公有链的开放环境,一般仅适用于带身份认证的联盟链或私有链系统;另外就是系统的失效节点数量必须小于全网节点的三分之一,容错率相对较低;最后拜占庭容错算法不能很好的存储记录其交易信息,黑客能够截取一些失效的副本,这会让信息外漏。交流请加笔者!