Neo区块链如何实现终局性?|Neo专栏
不知道小伙伴们有没有注意到,我们在往交易所进行转入的时候,几乎所有的交易所都会在区块链上监测到交易数据之后,还需要我们等待几个区块链周期来进行确认,比如比特币通常需要6个确认周期,按照十分钟一个周期来算,我们往交易所转账,则需要等待大概一个小时才能对我们转入的资金进行操作,XRP大概需要12个周期,NEO大概需要5个周期。这件事是很烦人的,因为这样的确认其实数倍的增加了我们转账操作的时间成本。
所以这篇文章里,我们就首先一起来讨论下这个确认周期的由来,之后我们再一起聊聊关于NEO的确认周期的问题。当然,对这块比较熟悉的小伙伴可以直接跳到第二部分来看关于NEO确认周期的专题讨论。
什么是网络确认(Network Confirmation)
网络确认这个概念来源于区块链这种数据组织结构里的新区块生成这种行为,最开始是出现在中本聪大神的那个开天辟地的《比特币:一种点对点的电子货币系统》论文里。单数的网络确认的意思是交易在经过共识后被打包进新区块的过程,或者说是交易被写入区块链的过程,复数的网络确认指的是在交易被写入区块链后,从包含了那笔交易的区块在内新生成的区块的个数。所以6个比特币网络确认的意思就是交易被打包进比特币的链上之后,又在此基础上生成了5个新的区块。
为什么需要网络确认
网络确认其实是比特币这个支付系统可靠性的一个重要组成部分。为了解释这个问题,我们首先来回顾下比特币里使用的PoW算力证明共识算法。在PoW里,所有的矿工独自(矿池除外)的去解一道数学难题,第一个解出这道题的人则优先获取生成新区块的权力,然后把他生成的区块广播给整个网络。可是问题在于由于整个网络的矿工都是独立工作的,有可能在同一时间可能会有多个矿工同时解出了问题的答案,然后分别广播出了自己的新区块,就好像是班里两个跑步成绩不相伯仲的人同时冲向了终点线。但是区块链本身只能有一条主链,就好像比赛只能有一个第一名,那怎么去从两个新的区块中选择一个加入主链呢?中本聪给出的答案是,不选择,两个新区块都保留,就像是在一棵树上分出了两个小枝丫,一个比赛中出现了并列第一。可是这样就在一个原本需要是一条光溜溜的链上引入了分叉,如果这样的情况不停的发生,那么我们最终拥有的将不再是一条区块链,而是一颗区块树,一颗毫无用处存在大量冗余数据的树。
为了解决这个分叉问题,比特币提出了网络确认的概念。具体来说就是,如果比特币网络上出现了分叉,那么就保留所有的分叉,但是在任何时候,比特币只承认最长的那个分叉为主链。就好比原本跑步存在了并列第一,但是现在我们不以一轮跑步的结果作为依据了,我们要跑接力赛,如果你们并列第一,那也没有任何意义,因为最终的结果将是看好几轮下来之后的最终成绩,即使期间有一次两个人水平差不多,那么几次下来也将会产生很大的差距。尤其是在所有矿工相互博弈的情况下,矿工都会选择在更长的链上去生成新区块,就好像比赛的时候如果对方比你跑得快,那你下面将没有人为你接力,你跟别人的差距肯定会越拉越大。
那么为什么对于比特币,这个确认周期会是6呢?这里的分析方案是假设在一个正常的比特币网络里的出现了跟正常算力和另一股攻击算力,如果攻击者的算力只有正常算力的九分之一,也就是攻击者拥有全网算力的10%,那么攻击者能够在落后当前主链1个区块的基础上将分支的高度拉到超越主链的概率是0.2045873(数据来源于中本聪区块链论文),如果落后3个的话,追上的概率是0.0131722,落后6个区块的情况下攻击者能把支链变成主链的概率则变成了0.0002428,算是达到了一个相对安全的位置,这意味着如果攻击者掌握着10%的全网算力,那么攻击者想要在交易已经确认了6个周期的基础上再修改包含那笔交易的区块的概率是0.0002428。这是啥概念呢,我们全靠蒙来做6道四选一的单项选择题的全对概率是0.000244。
因此在引入了网络确认这个概念之后,比特币就可以保证整个链也许过程中会出现一些短时间的分叉,但是最终都会只有一条主链。这里多提一句,我们常说的51%攻击的意思是当攻击者拥有了超过50%的全网算力之后几乎肯定可以任意高度的修改当前的主链,但是并不是说只有攻击者拥有51%算力之后才能对区块链发动攻击。按照概率来说,哪怕攻击者只拥有1%-49%的算力,他也是可以对主链发动攻击的,只不过成功的概率大小不等。
Neo的迷之网络确认
对Neo的共识算法有了解的小伙伴应该知道,Neo用的是一种叫做委托拜占庭容错(dBFT)的共识算法,按照Neo官方文档的介绍,dBFT具有终局性,也就是说,这个共识算法维护的区块链不会产生分叉,不会像比特币那样同一时间产生两个或者多个区块。这个终局性的原因在于不同于比特币世界里每个矿工都在撅着屁股去挖掘新的区块,Neo的世界里在每一个共识周期(不考虑视图)里,只有一个节点有权利去生成新的区块,而且其他议员节点都是围绕着这个节点生成的新区块进行表决验证,也就是说哪怕是这个节点单次生成多个有效区块,那么最终在一个周期里也只会有一个有效区块被表决通过。换句话说,任何情况下,任何时候,Neo的世界里都只有一个话事人,这个话事人会变,但是在任何一个共识周期里都只有一个声音,产生一个区块。
所以这件事就很奇怪,明明Neo不可能产生分叉,为了PoW设计的多个网络确认的机制为何也用在了Neo的系统中呢?仔细考虑之后我认为有可能是以下几个原因:
第一就是交易所本身为了自己的安全,对于任何币种的所有的deposit交易都进行了冗余的确认,以避免意外情况,无论这种意外是否存在,对于交易所来说额外的确认都是更安全的。
第二就是针对于Neo历史上确实存在的几次分叉事件。哦,不好意思,虽然理论上来说Neo的共识协议是不会产生分叉的,但是实际上在运行的过程中,Neo之前的共识协议确实也因为存储以及节点问题出现过一些分叉情况,如果大家去同步Neo的主链,大概率会经历几次同步过程终止等等问题。当然,Neo的共识协议已经升级到了2.0,以往的问题已经得到了妥善的解决。毕竟区块链还是一种处于研究阶段的技术,各种新的概念都还没有充分经过时间的检验,出现问题也是在所难免,无论是龙头比特币还是任何其他区块链项目都被发现过或多或少的问题。
第三就是可能存在的验证问题,因为我们知道虽然Neo整个共识协议是完整的,但是交易所用来同步Neo区块链数据的却仅仅是一个单独的没有任何特殊权益的普通节点,它能做的无非就是跟别的Neo节点相互连接然后进行数据同步,而数据的真实性有效性则完全需要交易所节点自己来验证,在这个过程中,也有可能存在潜在的攻击,比如之前对EOS交易成功与否的判断失效问题,以及针对区块链网络的日蚀攻击等等都可以专门针对交易所的区块链节点进行单独的攻击,因此交易所无差别的引入多个交易确认在一定程度上可以增加攻击者的攻击成本或者难度降低交易所的风险。
结论
本文通过分析交易所的交易确认,介绍了区块链需要交易确认的原因以及没有交易确认会导致的后果,并从Neo的共识算法角度来分析为什么Neo区块链具有终局性,以及为什么交易所不需要对NEO的存入进行多轮交易确认。本文纯粹从技术角度看待问题,不足之处敬请谅解。