Conflux伍鸣:用DAG结构提高中本聪共识的吞吐率

12月25日圣诞夜,Conflux CTO伍鸣博士作客「火星财经创始学习群」,分享了“Conflux: 使用 DAG 结构提高中本聪共识的吞吐率”。算法

嘉宾简介:

clipboard.png
Conflux CTO:伍鸣博士
本科毕业于中国科技大学,中科院计算机系统结构博士,曾为微软亚洲研究院(MSRA)系统研究组的高级研究员,研究方向包括分布式事务处理系统、图计算引擎和人工智能平台。近年来在多个系统领域的顶级会议(如 SOSP、OSDI、NSDI、ATC等)中发表论文,并担任过 OSDI、ASPLOS、HotDep等会议的程序委员会委员。安全

要点速览:

1.基于中本聪共识的思想,使用 DAG 技术改造,能够在不牺牲去中心化和安全性的前提下,大幅提升吞吐效率。
2.为何传统的基于PoW的中本聪共识机制的吞吐率很是低下?总结来讲,为了安全,不得不如此。
3.保证安全性是公链系统最核心的要求,PoS虽减小了PoW中挖矿所须要消耗的资源,但同时引入了不少新的攻击情形和安全性威胁,目前没有很完美的解决方案。

伍鸣博士坦言,目前存在的一些基于PoW的区块链系统所能提供的交易吞吐率都很是低,由此带来不少问题,包含用户体验糟糕、交易费用高昂,并进一步限制了在区块链系统上开发更有意义的应用的能力。网络

在此背景下,Conflux经过有向无环图技术(DAG)与中本聪共识(比特币的共识机制)的结合,在不牺牲去中心化和安全性的前提下,提升基于工做量证实(PoW)的区块链系统的吞吐率。并发

如下为伍鸣博士直播的详细内容(由Conflux和火星财经整理)分布式

第一部分:行业背景

众所周知,当前区块链领域面临的最大的一个问题之一,就是效率的问题。业界已经存在的一些基于PoW的区块链系统(例如比特币、以太坊)所能提供的交易吞吐率都很是的低。比特币的极限速度是平均每秒处理大概7个交易,以太坊是每秒30个交易,远远低于像Visa这样的中心化的交易服务能够支持每秒上千个交易的吞吐率。性能

效率低会带来不少问题:学习

首先,效率低使得现有的区块链的用户体验很糟糕,好比交易被加入区块须要等很长时间。区块链

其次,吞吐率有限使得交易费用高昂。测试

更进一步,交易费用高昂限制了在区块链系统上开发更有意义的应用的能力。优化

为了提升效率,大致有如下这么几个思路:

1.依然采用中本聪共识,但调整协议参数。

经过调整出块时间和区块大小来提升效率。如莱特币(2.5 min/1MB block), BCH (10min/32MB block)。但有研究代表,不管这两个参数如何调整,提升吞吐率必然以下降安全性为代价,在第二部分,我将为你们分析这其中的缘由。

2.基于中本聪共识的思想,使用 DAG 技术改造。

这能够在不牺牲去中心化和安全性的前提下,大幅提升吞吐效率。

3.使用 PoS 或 dPoS 机制。

dPoS算法如 EOS 很大程度上牺牲了去中心化,有不小的争议。而 PoS 算法也存在股权集中、难以应对长程攻击(Long Range Attack)等去中心化或安全性问题。

4.使用分片 (Sharding), 状态通道 (State Channel) 等侧链或链下解决方案。

其中一部分被有些人称为 Layer 2。 这些方案与 Conflux 目前的解决方案是正交的,它们在尝试从另外一个角度解决吞吐率问题,对吞吐率的提升是能够效果叠加或优点互补的。例如,提高全节点的吞吐率的技术能够帮助使用分片技术的系统减小跨链交易所形成的性能瓶颈,也能够完成更多的状态通道结算交易。

第二部分:中本聪共识机制为什么吞吐率低下

为何传统的基于PoW的中本聪共识机制的吞吐率很是的低下?总结来讲,为了安全,不得不如此。

在公有链中,为了能让参与网络协议的机器节点对交易的执行达成共识,矿工挖出区块之后须要在P2P网络中进行广播,以便让全部的机器得到一致的帐本结构。每一个矿工会根据最长链规则,选择将新挖出的区块接在它所看到的最长链的末尾。也就是全部诚实的节点,会共同延长这个最长的主链。这样,若是恶意的节点没有>50%的算力就不可能逆转主链。

然而,若是网络延迟比较大,使得一个新块在产生之后还来不及传播到全网就会有其余的节点产生另外的新块,就会在区块链上产生了大量分叉。

下面让咱们用一个图片,来展现了发生分叉后区块链帐本的样子。

clipboard.png

这些分叉带来两个问题。第一,分叉的区块最终被丢弃,这浪费了网络和计算资源。第二,分叉同时也危害了安全性,若是大量诚实节点生成的区块由于分叉被丢弃,攻击者只须要少于50%的算力就能够产生出恶意的最长链了。

所以,在比特币或以太坊中,为了保证安全性,它们须要保持一个很长的出块时间(即很低的出块速率),或者维持很小区块大小以减少区块在网络中广播的延迟,以此来减小分叉出现的频率,但同时也所以大大下降了系统的吞吐率。

提升吞吐率会引起分叉,而不一样分叉上的两个区块是竞争关系。它们争夺后续挖出的确认区块,来让本身所在的分支成为最长链,失败者则被丢弃。诚实节点挖出来的区块之间这种无心义的竞争,为攻击者带来了可乘之机。为了提升安全性,比特币选择了下降出块速度,尽可能避免这种状况出现。

那么,若是咱们选择了另外一个思路,即经过容许每一个区块选择多个区块做为本身的父亲或祖先,哪怕在出块速度很快的时候,也能够避免诚实区块之间无心义的竞争。这样,就绕开了中本聪共识中安全与效率两难的困境。

在这种思路下,整个网络将构成有向无环图结构(DAG)。下一步要考虑的是,不一样的区块中的交易,应该以什么顺序执行?这时,咱们经过设计一个安全的有向无环图拓扑排序算法,每一个节点只须要在本身本地的 DAG 上执行一遍这个算法,就能够得到一个区块的执行顺序,这个算法应该保证:

·每一个挖矿的机器节点排出来的序应当是一致的。
·即便在遭遇双花攻击时,这个顺序也不可被更改。

稍后,我将以 Conflux 为例,来看一下怎么样设计这个安全的拓扑排序算法。

DAG 技术有不少了,好比说 Spectre和 Phantom 算法,这是设计思路与咱们最接近的算法,都是采用 DAG 角度优化 PoW 链的效率。但遗憾的是,Spectre 没法对全部区块排一个序出来,这致使它上面没法跑智能合约。而Phantom 被咱们发现有漏洞。

同时,还有一些基于 DAG 的算法,与今天讲的内容相比,形似但非神似,好比说雪崩共识,Hashgraph. 这些算法本质上都是联盟链的算法。与经过“股权质押”的方式,将联盟链算法转换成PoS 公链算法。但联盟链转换成PoS公链算法的过程存在安全性问题。比较为人熟知的一些针对PoS的攻击有,无利害攻击(Nothing-at-Stake Attack)和长程攻击(Long-Range Attack)。

第三部分:使用PoW+DAG提升区块链吞吐量实例分析-Conflux 的机制设计

接下来咱们以Conflux为例,具体从技术细节的角度看一下,利用DAG提升吞吐量的思路是怎么实现的。

在Conflux中,每一个区块包含两种边,父边和引用边。父边和引用边共同构成一个有向无环图。去掉引用边,全部父边又构成了一棵树。在挖矿环节,矿工要监听 P2P 网络中广播的区块,并在本地维护一个有向无环图结构的区块帐本。矿工在挖矿时,新区块父边和引用边的选择,须要遵循如下的规则:

clipboard.png

1.在父边构成的树中,依据 Ghost 规则选择一条主链。具体来讲,从创世块开始,迭代地去从孩子区块中选择下一个在主链上的区块。选择的规则是挑选拥有最大子树的孩子区块。新区块的父边,应当指向主链中最后一个区块。

2.此外,对于那些既没有父边,也没有引用边指向的区块,咱们称为“叶子区块”,新区块的引用边要指向全部剩下的叶子区块。

有了这些边的定义,这个帐本结构就定下来了,区块被广播后,全部的节点最终都会获得一个结构一致的有向无环图,即一个一致的帐本。

那么有了一致的帐本之后,全部的节点如何去决定一个安全的、一致的区块排序呢?咱们的核心想法是,首先,这些节点先在DAG中决定一个一致的主链,而后,再根据这个主链来决定一个一致的区块的排序。

下面,让咱们用一个例子来看下如何决定一个一致的区块排序。

clipboard.png

主链的选取一样遵循 Ghost 规则,刚刚在选父边的时候我提到过这个规则。咱们根据这一规则,咱们将区块C,E,H,都选进了主链。

根据咱们刚刚讲的选边规则。新区块的父边应当指向 H, 同时 K 是叶子区块。因此新区块的引用边应当指向 K.(注意:H 的引用边指向了 G, 因此 G 不是叶子区块)。

如今咱们有了让全部节点对主链产生共识的机制。那接下来,这些节点如何对区块的全序达成共识呢?为了作到这一点,咱们引入一个Epoch的概念。在主链上的每个区块就肯定了一个Epoch。在分叉上的区块属于哪一个Epoch,是由第一个产生在它以后的主链区块所在的Epoch决定的。好比,区块D属于Epoch E,由于D最早被E引用,因此产生在E以前,可是D并不产生在C以前。按照这个规则,咱们能够获得一个一致的排序,以下图所示。

clipboard.png

因此,在Conflux中,咱们首先按照Epoch的顺序来给区块排个序。而后在每个Epoch内部,咱们再按照拓扑排序来肯定区块的顺序。若是出现平局的状况,咱们再根据区块的哈希值来打破平局。因此这个图中的区块排好序之后就是这样的。接下来咱们要为交易排序,Conflux首先按照区块的顺序去给交易排序。而后在每一个区块内部,咱们就按照交易在区块里所在的位置来排就能够了。

最后,咱们来看一下,交易若是发生重复或冲突怎么解决。咱们再用一个例子来解释一下:

clipboard.png

这个例子里面的交易2和交易3发生了冲突。由于交易2执行过之后,帐户X里面就没有足够的余额来完成交易3了,由于在这个交易的全序里面,交易3是发生在交易2以后的,因此咱们会让交易3变为无效。另外一种状况是,相同的交易有可能被不一样的节点打包到不一样的并发区块里,好比交易4。在这种状况下,Conflux只会接受在全序中出现的第一个这样的交易,而把后面的重复交易无效掉。

问答环节:

Q1:Conflux 如何与PoS 公链项目对比?

A1:咱们都知道,保证安全性是公链系统最核心的要求,由于公链自己就是在构建一个可信的系统。PoS虽然减小了PoW中挖矿所须要消耗的资源,但同时它也引入了不少新的攻击情形和安全性威胁,并且目前没有很完美的解决方案。比较为人熟知的一些针对PoS的攻击有,无利害攻击(Nothing-at-Stake Attack)和长程攻击(Long-Range Attack)。出于这个缘由,Conflux坚持采用基于POW的共识机制,经过引入DAG的技术来打破共识机制的性能瓶颈。这是咱们原型测试系统实际跑出来的结果。

Q2: Conflux 一笔交易能多久确认?

A2: 在没有坏人攻击的状况下,5s 一个 4MB 大小的区块,确认时间约 8 分钟。在有 30% 算力攻击的状况下,确认时间约 16 分钟。

Q3:Conflux的TPS能跑到多少 ?

A3:在谈论和对比 TPS 的时候,咱们须要注意区分测试 TPS 的实验设定。例如在比特币中,每个区块都须要广播给全部矿工,每一笔交易都被全部人验证过,咱们称之为一个交易获得的“全节点验证”。在一些 Sharding方案的实验中,全部的交易被分红 30 份, 每一个节点可能只验证其中一份。这样的交易称为“部分节点验证”。很显然,“部分节点验证”交易的总 TPS 是能够成倍于 “全节点验证” 的。

Conflux 在共识层面能够作到 4000-6000 TPS 的“全节点验证”, 若是考虑合约执行、状态读写等因素,实际部署可能会低一些。Sharding 技术是共识层技术一个很好的补充,Conflux 有计划在将来实现 Sharding, 提供更高的 “部分节点验证” TPS, 为用户提供多种选择。

Q4: Conflux的roadmap和相关时间计划是怎样的?

A4: 咱们计划在春节后测试网上线,预计明年Q3主网上线。

Q5:Conflux会有代币发行吗?仍是挖矿?

A5:Conflux没有ERC20,主网上线以后会有挖矿。

Q6: 那这里会不会涉及到PoW,或者挖矿的算力? 另外这里的主要难点是什么?面临的主要技术问题是什么?

A6: Conflux 是基于中本聪共识作的改进,是一个PoW 共识机制,固然会有挖矿。

这里主要的难点是为DAG的帐本设计高效的一致的排序算法。这个算法要能保证好人之间达成一致,还可以抵抗各类复杂的攻击情形。

Q7: Conflux是如何预防双花攻击的?

A7: 这个问题回答起来比较复杂,先来看一个图

clipboard.png

在这个图中,咱们首先来看一下一个攻击者如何可以逆转在帐本中的一个交易,好比交易4。为了作到这一点,一个攻击者须要产生一个交易4的双花交易,打包到一个区块里面,而且将这个区块在区块的全序中插入到区块B的前面。

但攻击者很难作到这一点,主要有两个缘由。第一个就是除非攻击者可以改变主链,否则他不可以逆转交易,由于交易的顺序是由主链来决定的。好比一个攻击者想把一个块插在靠前的位置,他能作就是在一个很早的Epoch里面的区块后面接着产生新块。可是只要这个块不在主链上,它就最终仍是会属于一个很晚的Epoch。由于当一个诚实的新块产生之后,它会经过引用边把这个攻击者的区块给拉到新的Epoch里面。

第二个缘由就是,若是攻击者没有超过50%的算力,他就没有办法改变主链。

Q8: Conflux的CTPS有测试数据吗?

A8: CTPS是指确认交易的TPS。咱们实验中测出来的TPS实际上就是确认交易的TPS。大概在4000~6000。

Q9: 挖矿的话,对于挖矿设备具体有什么要求呢?

A9: 咱们会选择GPU友好的POW算法,因此使用GPU设备就能够了。

clipboard.png

相关文章
相关标签/搜索