作者:密码极客 / 来源:密码朋克
这支清华姚班团队,由国内唯一图灵奖获得者姚期智教授担任首席科学家。但他们并不大愿意把自己的首席科学家拿来当噱头。
和那些用心做实事的团队一样,Conflux团队想要用 DAG 解决中本聪协议最大的挑战,但也从不说自己达到百万TPS。
为了把一个充满学术气息的团队推到我们社群成员面前,密码极客邀请了Conflux的CTO伍鸣博士,一位中科院计算机系统结构博士。
而接下来的内容,密码极客提醒一下,“内容非常干货,信息量极大”。毕竟密码极客作为国内最权威的区块链技术创投社群,走的一直是实力派技术路线。
如果你还是对DAG结构或者Conflux有疑问,欢迎在下方留言。
分享正式开始
大家好,今天很高兴有机会来到密码极客。我们Conflux是一个创新的公链系统,它主要的优势特点是能够将基于POW的中本聪共识机制的吞吐率提升到每秒上千条交易的量级。
我先简单介绍一下Conflux的团队。我们有很多成员来自清华姚班,而团队大部分都曾经有信息学、数学物理奥赛取得优异成绩的经历。同时,我们部分成员在计算机领域有很强的学术背景。
我们将学术研究中一些严谨的作风带给了团队。所以我们虽然是在解决区块链的扩容问题,但不会随便说自己达到百万TPS的言论。
当前区块链领域面临的最大问题之一,就是效率。目前基于 PoW 的区块链系统,不管是比特币还是以太坊,交易吞吐率都很低。
那么接下来我们再来看一下,为什么传统基于POW共识机制的吞吐率会这么低下呢?
总的来说就是为了安全,不得不如此。
比特币的共识机制
我们先来简单看一下,这个比特币中的共识机制是如何工作的?
在这个协议里面,交易是被打包到区块里面的。所有的区块形成了一个链,这个链表示了交易的历史纪录。每一个参与这个协议的机器节点都会想要去产生一个新的区块并在该区块里打包新的交易,并且通过将前一个区块的哈希值存入新区块的头部信息来将新区快链在区块链的尾部。
这个协议通过使用工作量证明以及最长链规则来让所有的机器节点对区块链的状态达成共识。同时,它维持了一个很慢的全网的平均出块率以及相对较小的区块大小。
假设图中是一个区块链的当前的状态,假设一个攻击者想要逆转区块n-2中的一个交易,他就会想要从区块n-3后面引入一个分叉来使区块n-2变得无效。
但是与此同时,所有诚实的节点都会遵循最长链规则,从而将他们新产生出来的区块链在最长链的尾部。由于系统维持了很低的出块率和较小的块大小,网络延迟相对于出块时间来讲是比较小的,所以这些诚实的节点所产生的区块基本上就是顺序的。
这样的话,只要诚实节点的总算力超过50%,攻击者就不能够使他自己产生的链成为最长链。
但是有人接下来可能会问,是不是可以通过增加出块率或者增大区块的大小来提高系统的吞吐率?
简单在中本聪共识机制里面这样去做是有问题的。因为不论是增大块的大小还是增加出块率都会使得区块产生的时间和区块在网络上传播的延迟相比变得相对较小。
这就使得一个新块在产生以后还来不及传播到全网就会有其他的节点产生另外的新块,于是就在区块链上产生了分叉。虽然整个系统最终会收敛到某一个最长的分叉上,但是出块率和块大小越大的话,分叉的情况就会越发严重,分叉也会进一步出现在已有的分叉上。所以最终区块链的账本就发展成这个样子,就是有很多的分叉。
这就会像下图一样。
这带来两个问题。第一,这些分叉浪费了网络和计算资源,因为只有最长链中的区块才被认为是有效的。第二,它危害了安全性,因为整个区块链里的最长链变短了,这使得攻击者只需要少于50%的算力就可以产生出恶意的最长链了。
因此在比特币或以太坊中,我们为了保证安全性,他需要保持一个很长的出块时间,也就是很低的出块率。或者维持一个很小的区块大小,以减少这个区块在网络中传播的延迟,从此来减少这个分叉出现的频率。但同时也因此大大降低了系统的吞吐率。
Conflux的DAG如何产生
那么,如果我们选择了另一个思路,即通过允许每个区块选择多个区块作为自己的父亲或祖先,哪怕在出块速度很快的时候,也可以避免诚实区块之间无意义的竞争。这样,就绕开了中本聪共识中安全与效率两难的困境。
我们注意到,在比特币中的这种基于链的共识机制里,它本质上对交易的执行顺序有一个严格的限制,也就是交易的执行顺序要和他们所在的区块的产生的顺序是一致的。
但是在不同的区块分叉之间,他们的顺序是没有办法在全网的机制节点上达成统一的确定,因为他们是并发产生的。
但是我们如果仔细观察的话,实际上区块链的系统里面,很多的交易是没有冲突,所以它们可以按任意的顺序执行,只要所有的参与节点都同意一个顺序就可以了。那么基于这样一个观察,我们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,都选进了主链。
(黄色的即选进去的主链区块)
为了产生一个新的区块,一个机器节点首先选择主链上的最后一个区块作为新区块的父亲,然后这个新区块再把所有已经收到但还没有被其他区块所引用的区块引用起来。
比如像里面的区块K。
这里之所以使用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的一个原型系统,然后在Amazom EC2上运行1万个Conflux节点来做实验。为了模拟公网上真实网络环境,我们限制每个节点的网络带宽是20Mbps。
在实验中我们调整不同的区块大小和出块率。我们测量了系统的吞吐率和交易延迟,并且和比特币以及Ghost的协议进行了比较。
(蓝色是Conflux的曲线,蓝色绿色是GHOST、比特币的曲线)
上面这个图呢,显示的是吞吐率随着区块大小增加的变化。下面这个图呢,显示的吞吐率随着出块率减少的变化。
那么我们可以看到当块大小在4MB,以及五秒钟出一个块的前提下,Conflux的TPS可以达到3200。
在这种情况下,我们也和这个另外一个公链项目Algorand进行数据比较。在相同的这个环境下,Conflux的性能可以达到Algorand的3.7倍。
同时跟比特币、GHOST比较的话,也是比他们高这个12.5倍。
Conflux和其他DAG项目比较
DAG 技术有很多了,比如说 Spectre和 Phantom 算法,这是设计思路与我们最接近的算法,都是采用 DAG 角度优化 PoW 链的效率。但遗憾的是,Spectre 无法对所有区块排一个序出来,这导致它上面无法跑智能合约。而Phantom 被我们发现有漏洞。
同时,还有一些基于DAG 的算法跟Conflux形似但非神似,比如说雪崩共识,Hashgraph. 这些算法本质上都是联盟链的算法。与通过“股权质押”的方式,将联盟链算法转换成PoS 公链算法。但联盟链转换成PoS公链算法的过程存在安全性问题。比较为人熟知的一些针对PoS的攻击有,无利害攻击和长程攻击。
IOTA也是一个使用了DAG账本结构的区块链系统。他的这个账本数据结构有个特殊的名字叫“tangle”,翻译成中文就是纠缠混乱的意思。IOTA有一个很好的愿景,就是用区块链来改造这个物联网和供应链的工业啊。
梦想是美好的,然而现实总是骨感的。IOTA的项目愿景非常美好:它通过无区块链,无交易费,无限可扩展,解决了物联网场景中各种痛点。
首先就是说无限可扩展,其实是一个比较可笑荒谬的。就在这个世界上没有什么实际的应用系统是可以无限扩展,而这个无交易费和可扩展本身就是相互矛盾的。因为这个无交易费就意味着没有机制来防止用户随意的乱发垃圾交易。
(接下来的内容,都在密码极客喜马拉雅FM上,该部分内容不代表密码极客观点。)
Q&A
接下来是对Conflux项目、团队的进一步提问,这次的提问,由密码极客事先已经在社群内部以及各个协办方处收集。
01密码极客:
Conflux的DAG结构是如何解决垃圾信息攻击的问题?Conflux和现有DAG算法的IOTA、BYTEBALL、NANO、摩尔链等项目相比,优势在哪里?
关于垃圾交易的这个攻击,一般都需要通过激励机制来解决。比如这个交易费其实就是一种防止垃圾交易的机制。当然我们目前也在研究和设计一些更好的激励机制,更有效地处理这个问题。这方面的进展我们将来会持续的更新给大家。
那么跟IOTA的区别,我刚才已经讲了很多了。
Byteball是IOTA的一个扩展。在IOTA的基础上,它增加了在交易DAG中对确定交易程序的机制。它的这个确定交易程序的方法和Conflux有点像,但是有一个很重要的区别:主链是如何选择的?
Conflux是使用这个POW加GHOST的方式,那Byteball是通过见证人的方式。见证人呢就类似于EOS的超级节点,所以它们还是缺失了去中心化带来的安全性好处。相比之下的话,Conflux会更加的安全。
NANO的话,它所谓的DAG其实叫做这个BlockLattice,它是每个用户自己的交易都有一个链状的结构,然后不同用户的交易之间,由引用边来描述依赖关系,但是它的共识机制仍然是基于POS或者是DPOS的。那么所以这个安全性和去中心化程度仍然是比Conflux要差。
02.TokenClub:
Conflux商业落地的话,会在哪些行业首先展开?目前的研发队伍大概有多少人?有哪些城市有研发中心,有没有到其他城市建立site的计划?
我们正在积极思考商业落地的场景,同时也在积极寻找一些应用和商业端的合作伙伴。
目前我们看到一些比较有潜力的落地场景,有这么一些。比如这个金融数据的共享,这里面需要解决数据共享的质量、隐私以及防篡改等问题。
再有就是我们和一些合作伙伴在积极地探讨,就如何通过去中心化预言机来解决这个链下数据安全上链的问题。这是一个很重要的问题,能解决区划链与现实生活脱节的现状。
还有一类就是这个去中心化交易平台的应用场景,这也是我们目前积极去探索和研究的方向。
我们现在的这个研发队伍大概有20人左右。我们目前的这个研发团队都在北京。那么在其他城市建立分支的site,我们也是有计划的,因为这有利于我们在全国推广技术,壮大Conflux社区。
03.BRC:
Conflux TPS能到多少?交易确认时间是多少?是否能做到全网异步并发交易?
我刚才的分享也讲到,Conflux我们实验的结果就是TPS可以达到3000以上。交易确认的时间大概是十分钟。
对于全网异步并发交易,就是说这个交易肯定是全网并发产生的,但交易的执行是顺序的,对吧?就每个节点他会将交易的顺序确定下来,然后去做一致顺序的执行。
就是刚才有朋友问到,就是说跟摩尔链的区别。其实摩尔链的话它跟NANO是很像的,实际上它是在NANO的基础上做了一些小的修改。
根据摩尔练的白皮书描述,它采用的共识机制仍然是基于DPOS的。这个跟Conflux完全不一样的,因为我们基于POW。
04.腾讯区块链场外论坛:
Conflux作为一个公链项目,现在还没有发币,那有发币的打算吗?这方面的计划是怎样的?
Conflux是一个这个公有链的项目,我们分专注这个底层技术和系统的开发。目前没有公募,也不会发ERC-20。
我们的主网预计会在19年的第三季度上线。
05.密码极客:
请问你们怎么看待区块链信息服务备案的规定?Conflux有备案的打算吗?
区块链信息服务备案的规定,我们肯定是欢迎的。它给整个行业带来了好的指导,有助于整个行业来净化环境,那么可以让真正有技术和创新突破的项目在鱼龙混杂的环境中站出来,那对我们这些项目肯定是有帮助的。
那我们在2月15号之前呢已经注意到了这个备案信息,并且已经着手去做备案的工作。目前我们产品还没有上线,还没有对外提供这个区块链的服务,所以还没有完成备案。
那一旦产品上线,我们以测试网为时间节点,我们就会尽快去完成备案!
06.TokenClub:
Conflux是如何预防双花攻击的呢?Conflux和PoS公链项目对比有什么优势呢?
我刚才在分享的时候,其实已经讲到了,因为主链的情况决定了交易的顺序。但是主链的选择、安全性是由GHOST的规则来保证的。所以这就是它防止这个双花攻击的机制。
关于就是说跟POS功能相对比较的话,就是我们一直认为就是说,POW机制和POS相比的话,是具有更高的安全性的。
(部分内容语音转录,完整请到喜马拉雅FM上搜索:密码极客)