Conflux项目的CTO 伍鸣在Odaily星球日报与36Kr集团共同主办的2018 P.O.D New BlockTrend新区势区块链峰会上就《Scaling Nakamoto Consensus to Thousands of Transactions per Second》(将中本聪共识的吞吐率提升到每秒数千次交易)发表演讲,对于基于POW机制的扩容提出了新见解。
伍鸣从中本聪共识机制的工作原理出发,指出简单的在共识机制中增大区块容量以及提高出块率的方式并不可取,这两种方式均会使区块在网络上传播的延时相对变长,从而在账本中产生很多分叉,不仅浪费计算和网络的资源,也危害了安全性。
对此,伍鸣介绍,Conflux利用区块链中交易少冲突的特点,乐观的处理并发块,且将区块通过父边和引用边组织成有向无环图(DAG),同时创新的将Ghost规则和Epoch的概念相结合,从而使参与协议的机器节点能够在一致的账本结构中决定一致的交易全序。Ghost规则保证的了主链的选择无法被逆转,DAG和Epoch帮助确定一致的交易全序。通过这样的技术,Conflux能够在防治双花攻击的同时将分叉上的区块变为有效从而提升有效区块的比例,进而能够将公链系统的吞吐率提升到每秒上千次交易,且能够在分钟级别的延时内确认交易。在Conflux中,系统的吞吐率瓶颈已不再是共识机制本身,而在于网络带宽以及每个节点局部的计算处理能力。
以下为伍鸣博士的演讲实录:
大家好,今天很高兴有机会给大家介绍一下我们的Conflux项目,它是一个创新的公链系统,它主要的优势特点是能够将基于工作量证明的中本聪共识机制的吞吐率提升到每秒上千条交易的量级。
我们先来看一下问题的背景。现如今,区块链和数字货币在业界已经产生了相当大的影响力。也有越来越多的人开始关注它。以比特币为代表的区块链技术已经发展成为一可以个在互联网级别上支持安全的,一致的,分布式的交易账本的平台。这个平台进而带动了金融科技,供应链,和医疗健康等应用领域的技术创新。全球的数字货币市场也支撑着千亿美元的市值。
然而,尽管如此,性能和效率问题仍然是现有的区块链系统一个很大的痛点。这使得现有的区块链的用户体验很糟糕,比如很长的处理延迟,以及高昂的交易费用。同时也限制了在区块链系统上开发更有意义的应用的能力。我们都知道,比特币每秒可以处理大概7个交易,以太坊是每秒30个交易。而像visa这样的中心化的交易服务可以支持每秒上千个交易的吞吐率。
我们先来简单的看一下比特币中的共识机制是如何工作的。在这个协议里面,交易是被打包到区块里面的。所有的区块形成了一个链,这个链表示了交易的历史纪录。每一个参与这个协议的机器节点都会想要去产生一个新的区块并在该区块里打包新的交易,并且通过将前一个区块的哈希值存入新区块的头部信息来将新区快链在区块链的尾部。这个协议通过使用工作量证明以及最长链规则来让所有的机器节点对区块链的状态达成共识。同时,它维持了一个很慢的全网的平均出块率以及相对较小的区块大小。
假设图中是一个区块链的当前的状态,假设一个攻击者想要逆转区块n-2中的一个交易,他就会想要从区块n-3后面引入一个分叉来使区块n-2变得无效。但是与此同时,所有的诚实的节点都会遵循最长链规则从而将他们新产生出来的区块链在最长链的尾部。由于系统维持了很低的出块率和较小的块大小,网络延迟相对于出块时间来讲是比较小的,所以这些诚实的节点所产生的区块基本上就是顺序的。这样的话,只要诚实节点的总算力超过50%,攻击者就不能够使他自己产生的链成为最长链。
但有人接下来可能会问,是不是可以通过增加出块率或者增大区块的大小来提高系统的吞吐率?简单的在中本聪共识机制里面这样去做是有问题的。因为不论是增大块的大小还是增加出块率都会使得区块产生的时间和区块在网络上传播的延迟相比变得相对较小。这就使得一个新块在产生以后还来不及传播到全网就会有其他的节点产生另外的新块,于是就在区块链上产生了分叉。虽然整个系统最终会收敛到某一个最长的分叉上,但是出块率和块大小越大的话,分叉的情况就会越发严重,分叉也会进一步出现在已有的分叉上。所以最终区块链的账本就发展成这个样子,就是有很多的分叉。
这带来两个问题。第一,这些分叉浪费了网络和计算资源,因为只有最长链中的区块才被认为是有效的。第二,它危害了安全性,因为整个区块链里的最长链变短了,这使得攻击者只需要少于50%的算力就可以产生出恶意的最长链了。
那接下来我们来看一下Conflux是如何解决这个问题的?我们注意到,在比特币中的这种基于链的共识机制里,它本质上对交易的执行顺序有一个严格的限制,也就是交易的执行顺序要和他们所在的区块的产生的顺序是一致的。比如在这个例子中,如果区块1是在区块0之后产生的,它隐含的意思是说,区块1中的交易都要发生在区块0的后面。同样当区块2产生在区块0后面,它也隐含了相同的意思。所以假如后面的区块3,4,5,链在了区块1的后面,区块2就会被丢掉,因为我们无法确定它的交易应该怎么去排序。
但是我们如果仔细观察的话,实际上区块链的系统里面,很多的交易是没有冲突,所以它们可以按任意的顺序执行,只要所有的参与节点都同意一个顺序就可以了。那么基于这样一个观察,我们Conflux的主要的核心想法就是这样的。我们首先乐观的处理这些可能并发的区块,然后我们把这些区块组织成有向无环图,也就是DAG。接下来我们让所有的机器节点首先假设所有的交易相互之间都没有冲突,从而决定一个一致的区块顺序。然后他们再根据区块的顺序进一步决定所有交易的执行顺序,最后再依照这个交易的顺序去解决交易的冲突问题。
接下来我们用一个具体的例子来说明这个想法。假设这个图上显示的是Conflux的账本在某一时刻的状态。每个区块都有一个指向它的父亲区块的parent边。那么这些区块和它们的parent边,就构成了一个树形结构。除了指向父亲的边以外,每一个区块还可以有多个引用边。这个引用边主要是记录和表达区块之间的happens-before关系。比如,如果一个机器节点在产生区块E的时候,它已经有了区块D,而且这个时候,D也没有任何一个其他区块引用了它。那么这个节点可以给E加上一个引用D的边来表示D是在E之前产生的。
有了这些边的定义,这个账本结构就定下来了,这个结构会在全网节点进行广播,所以,所有的节点最终都会得到一个一致的账本。那么有了一致的账本以后,所有的节点如何去决定一个一致的区块全序呢?我们的核心想法是,首先,这些节点先在DAG中决定一个一致的主链,然后,再根据这个主链来决定一个一致的区块的全序。
为了决定主链,Conflux使用了Ghost规则。具体来说就是,我们从创世块开始,迭代的去从孩子区块中选择下一个在主链上的区块。选择的规则是挑选拥有最大子树的孩子区块。比如,区块A和区块B是创世区块的两个孩子区块。A的子树有6个区块,B的子树有5个区块。所以我们选择区块A作为紧接着创世区块的主链区块。相应的我们根据相同的规则,将区块C,E,H,都选进了主链。
为了产生一个新的区块,一个机器节点首先选择主链上的最后一个区块作为新区块的父亲,然后这个新区块再把所有已经收到但还没有被其他区块所引用的区块引用起来。
这里之所以使用Ghost规则而不是最长链规则来选主链,是因为Ghost规则中所有的区块,包括那些在分叉上的区块,都会对主链的选择做出贡献。这样的话,就保证了只要攻击者的算力没有超过50%, 就无法改变由诚实节点确定的主链。
现在我们有了让所有机器节点对主链产生共识的机制。那接下来,这些节点如何对区块的全序达成共识呢?为了做到这一点,我们引入一个Epoch的概念。在主链上的每一个区块就确定了一个Epoch。在分叉上的区块属于哪个Epoch,是由第一个产生在它之后的主链区块所在的Epoch决定的。比如,区块D属于Epoch E,因为D最先被E引用,所以产生在E之前,但是D并不产生在C之前。
所以,在Conflux中,我们首先按照Epoch的顺序来给区块排个序。然后在每一个Epoch内部,我们再按照拓扑排序来确定区块的顺序。如果出现平局的情况,我们再根据区块的哈希值来打破平局。所以这个图中的区块排好序以后就是这样的。接下来我们要为交易排序,Conflux首先按照区块的顺序去给交易排序。然后在每个区块内部,我们就按照交易在区块里所在的位置来排就可以了。
交易可能会冲突。比如这个例子里面的交易2和交易3。因为交易2执行过以后,账户X里面就没有足够的余额来完成交易3了,因为在这个交易的全序里面,交易3是发生在交易2之后的,所以我们会让交易3变为无效。另一种情况是,相同的交易有可能被不同的节点打包到不同的并发区块里,比如交易4。 在这种情况下,Conflux只会接受在全序中出现的第一个这样的交易,而把后面的重复交易无效掉。
那么接下来一个问题是Conflux如何能够防止双花攻击。我们首先来看一下一个攻击者如何能够逆转在账本中的一个交易,比如交易4。为了做到这一点,一个攻击者需要产生一个交易4的双花交易,打包到一个区块里面,并且将这个区块在区块的全序中插入到区块B的前面。但攻击者很难做到这一点,主要有两个原因。第一个就是除非攻击者能够改变主链,不然他不能够逆转交易,因为交易的顺序是由主链来决定的。比如一个攻击者想把一个块插在靠前的位置,他能做就是在一个很早的Epoch里面的区块后面接着产生新块。但是只要这个块不在主链上,它就最终还是会属于一个很晚的Epoch。因为当一个诚实的新块产生以后,它会通过引用边把这个攻击者的区块给拉到新的Epoch里面。
第二个原因就是,如果攻击者没有超过50%的算力,他就没有办法改变主链。为什么是50%呢。我这里给出一个直观的解释。假设区块A是一个主链上的块,一个攻击者想要用区块A’来取代A在主链上的位置。那么所有攻击者产生的块都会在A’的子树下面,然而所有诚实的节点所产生的块都会在A的子树下面,这样的话,攻击者就需要超过50%的算力才能让A’的子树超过A的子树。根据理论的分析,A’能够取代A的概率是随着时间的增加而指数下降的。
因此,一个交易的确认就包含以下几步。用户首先对攻击者的算力比例以及他所能承受的风险有一个假设。给定这个假设,Conflux首先找到这个交易所属的Epoch,然后找到和这个Epoch相应的主链区块。最后再检查这个主链区块被逆转的概率是否小于用户所能承受的风险。如果小于,则该交易可以确认。
这个图概括的展示了Conflux系统架构。 所有参加Conflux协议的机器节点由一个p2p的网络连接起来,他们通过Gossip的方式在网络中传播交易和区块。每个机器节点,维护一个交易池,交易池里面缓存着将要打包的交易。另外每个机器节点同时也在不停的运行Conflux的共识协议。
接下来我们再简要的看一些实验结果。我们搭建了Conflux的一个原型系统,然后在Amazom EC2上运行1万个Conflux节点来做实验。为了模拟公网上真实网络环境,我们限制每个节点的网络带宽是20Mbps。在实验中我们调整不同的区块大小和出块率。我们测量了系统的吞吐率和交易延迟,并且和比特币以及Ghost的协议进行了比较。
这个蓝色线是Conflux,可以看到区块越大、出块率越高,Conflux的吞吐率就可以线性的增加,但是比特币和Ghost就做不到。这是因为这时比特币和Ghost的区块利用率会大幅下降。
最后总结一下。Conflux利用了优化处理并发区块的想法,使得公链系统的吞吐率达到每秒上千次的交易,以及分钟级别的确认时间。在Conflux的交易里面,整个系统的吞吐率瓶颈已经不在共识机制上,而是在网络带宽或每个节点的计算能力上。
谢谢。
本文部分内容经授权转载自“36氪”和“Odaily星球日报”
点击获取→本次演讲PPT
Conflux在团队成员的组成方面有着巨大的优势:团队成员均有着专业的研究背景,丰富的从业经验和编程大赛获奖经历。
Conflux是由中国唯一图灵奖获得者姚期智教授所领导的团队。姚期智院士是世界著名的计算机科学家。因为其对计算机理论研究的重要贡献,包括基于复杂性的伪随机数生成理论,密码学和通信复杂性,在2000年获得了图灵奖。此外,包括联合创始人,首席技术官,核心系统工程开发师,算法工程师等技术团队成员,大部分都是“姚班”出来的。并且几乎所有人都有国际信息学竞赛,ACM-ICPC,Code Jam等编程大赛金牌的经历。Conflux团队在技术人员配置方面,有着无与伦比的优势。而在未来的发展中,还会不断扩充壮大这一核心优势。