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