11月8日,由巴比特主办的“2019年世界区块链大会•乌镇”正式开幕,大会聚集了百余位全球区块链、数字资产、AI、5G领域的专家学者、技术大咖、意见领袖、热门项目创始人,以“应用无界”为主题,围绕区块链的应用落地、技术前沿、行业趋势和热点问题进行探讨,推动区块链技术和产业创新发展。
Conflux联合创始人兼CTO伍鸣发表《让去中心化的公链系统接近最优的性能》主题演讲。
精彩要点提炼:
1. 理想的公链系统应该具备三个特点:A.足够的鲁棒性(Robustness);B.高性能;C.去中心化。
2. 比特币和以太坊等公链采用“中本聪共识”,出块慢、吞吐量低。
3. GHOST协议采用最重子树规则,可以克服分叉带来的安全性问题。
4. GHOST协议可以提高出块速率,同时不用担心双花攻击。
5. 结构化的GHOST方法不会让所有区块影响主链的选择,只让很小部分的区块影响主链选择。
6. PAST集合和Epoch概念分别实现自动的模式切换和确定区块出块顺序,让所有的区块能够贡献系统的吞吐率。
以下是演讲全文,巴比特整理:
大家好,很高兴今天有机会在这里分享一下Conflux的技术进展。
Conflux是一个高性能的公链项目,我们去打造一个高性能的公链系统。所谓高性能,我们能够获得上千TPS吞吐率,大概在3千-6千左右。并且我们的系统能够在半分钟之内确认一笔交易,而Conflux取得这样的性能不会牺牲任何去中心化和安全性。
先来看一下问题的背景,随着比特币的出现和发展,区块链已经被越来越多的人所熟知。区块链最具代表性的一个特点是它的分布式账本,它非常强大,可以提供互联网级别的交易记录,这使得在现在应用领域都有很多技术创新,比如说金融系统、供应链还有医疗健康等等。但现有的公链系统里,它仍然很大程度上受到性能问题的干扰,使得它在实际场景落地时受到一些阻碍。比如说比特币,它每秒处理7笔交易,确认一笔比特币交易需要1个小时。以太坊是30笔交易/秒,确认的话要10分钟。但是像中心化的系统VISA,它可以很轻松提供3千TPS吞吐率,并且在秒级确认。
我们知道一个公链系统里有很多组件,不同的组件有不同的性能特点。比如说存储,我们需要存储来存区块链账本。网络,需要网络交换区块和交易。我们需要计算资源执行这个交易。但公链里还有一个很重要的一环:共识。现在的公链系统共识是一个最主要的。我们认识到这个问题,并且找到了一些解决方法,于是就有了这样一个团队。我们的团队是以姚期智院士作为首席科学家,他也是唯一一个获得图灵奖的华人科学家。另外两个创始人龙凡和周冬,海外留学回国来创业做这个项目,他们也是国际奥林匹克信息竞赛金牌得主。
我们认为一个理想的公链系统应该具备以下三个特点:
1.足够的鲁棒性(Robustness)。也就是说,它能够抵抗双发攻击以及存活性攻击,存活性攻击就是说你的系统应该在任何时候都能持续的有进展。
2.高性能。所谓高性能,就是这个系统应该同时有很高的吞吐率和很短的交易确认延迟。
3.去中心化。这个系统能够承接成千上万节点,这些节点不经过允许可以加入和离开这个网络。去中心化的好处可以不依赖于对每一个中心实体的信任。
据我们所知,现有所有系统,没有任何一个公链系统在这三个方面同时取得很好的效果。比如比特币和以太坊这类系统,它有很好的鲁棒性、很好的去中心化,但它的性能非常糟糕。还有一类系统是基于拜占庭协议来做的,这样的系统鲁棒性可以,性能也OK,但是牺牲了去中心化,因为它的共识机制是靠选出一个很小的委员会完成的,Conflux是唯一一个可以在这三方面都可以做得非常好的系统。
为什么Conflux系统比现有其它系统更加优秀呢,先看一下比特币和以太坊是怎么工作的。比特币、以太坊这类去中心化公链,它们要部署在一个P2P gossip network,区块和区块之间形成一条链,链实际上就是存储交易记录的账本,这个账本也会被复制到所有的节点上。虽然去中心化有信任的好处,但去中心化也会遭到攻击。任何节点都可以加入到这个网络,也就是坏人可以随意构造很多节点操控成本,于是在比特币和以太坊里使用了工作量证明的机制,你要去对账本产生影响,就要去付出算力。如果你想做的话,就要付出成本。
在比特币和以太坊网络里采用“中本聪共识”,一个很重要的原则就是最长链规则。在“最长链”规则里说的是,所有的好人节点,他们都只会是认为最长的链作为有效的交易记录。这里一个安全假设,只要好人拥有超过50%的算力,最长链就应该是好人节点所产生的。
这样的系统通常会采用非常慢的出块速度,比特币是每10分钟出1MB大小的块,以太坊是出一个块是15秒,吞吐率非常低。为什么不能直接把区块大小增加,就可以让系统吞吐率变高了?但简单地这么做是不行的,因为如果这么做的话,账本的结构就会看起来如图中所示,会有很多分叉。原因是出块是并行的,所有节点都是并发的出块。当出来一个块之后,这个块在网络上传播需要时间延迟。也就是说,当出了一个块再往上广播,其它的节点并不能马上看到这个块,他们还会跟着老的区块去挖,这样就会产生分叉。如果区块大小越大,在网络上延迟越长,所以产生的并发区块就会更多,分叉也会越多。如果出块率变高,效果也是一样的。
分叉很多账本会带来什么问题,首先根据“最长链”规则,只有最长链里区块才会被认为有效,其它分叉上的区块就会被丢掉,这样就会造成网络和处理上资源的浪费。另外一个很重要的点,它也牺牲了安全性。具体来说,假设固定数目的区块,如果分叉越多的话,最长链越短。假设最长链的区块只占所有区块10%,那就意味着坏人可以只用10%的算力,就可以随意篡改你的账户。
后来有些研究人员发明了GHOST协议,克服分叉带来的安全性问题。在GHOST里面,所有的节点仍然要选择一条主链,它选择的规则不是根据最长链规则,而是根据最重子树规则。我们选择主链也是从创世块开始,把创世块选择主链。会迭代去看它的子区块,比如创始区块有两个子区块A和B,A的子树有6个区块,B有5个,因为A的子树比B重,我们会把A加入主链里。根据相同规则依次做这样的事情,可以把CEH选到主链。当产生一个新的区块时,跟着主链里最后一个区块产生就好了。
最重子树规则和最长链规则区别在于,我们对子树的选择不仅是最长链上子树做出贡献,包括分叉上区块也会对主链选择做出贡献,这样的话“坏人”必须需要50%的算力,才能影响主链的选择。A假设是主链上的区块,如果坏人想用A.上区块,替换A在主链上的位置,需要产生A.指数,比A还要重。坏人需要超过50%的算力,才能够篡改A在主链上的位置。这样的情况下我们想确认一笔交易,需要A的子树比A.大很多。A.想替换A在主链上的位置,概率随着时间是下降的。出块量越高的话,确认的时间越短。
有了GHOST协议之后,可以以很高的出块率出块,同时不用担心双发攻击。问题是不是解决了呢?没有,GHOST还会受到存活攻击的影响。假如好人区块会分成GroupA和B,假设Group内部区块之间通信没有延迟,好人和坏人之间通信没有延迟。因为两个Group之间有延迟,某一个时候有可能账本会结构A和B两个分叉。坏人可以暗自观察账本结构,偷偷在这两个分叉上产生新的区块,这些区块不告诉好人。当GroupA节点产生一些新的区块时,它会把这个节点传给B,但传输需要一段时间。在这个过程中坏人先发生这件事情,于是就把原来在B分叉上偷偷挖的区块告诉B,B就会认为原来B的分叉是比A分叉更加重,它就会接着B的分叉去挖。相反,坏人也会选择适当的时机把它在A分叉上预先挖的块再告诉A,会认为A的节点是更重的,这个过程可以持续下去,造成分叉一直保持,也就是交易没有办法确认。
解决这个问题的方法叫做结构化的GHOST方法,我们不应该让所有区块都能影响主链的选择,只让一个很小部分的区块去影响主链的选择。很小部分的区块能够影响主链的选择,意味着这些区块出现的概率是比较低的,它们并发出现的概率是比较低的。在这些影响主链选择的区块之间,它们不容易出现分叉。
比如上图里虚线区块就是没有权重的区块,不影响主链。在某一时刻,比如A的分叉上出现一个有权重的区块,这时候B可能不会马上看,所以B仍然会在B的分叉上产生区块。但当过了一个延迟以后,B早晚会发现有权重的A区块,这时候B就可以判断出原来A的分叉是比B的分叉重,因为A上面有一个有权重的区块,这时候B就可以在A的分叉上产生新的区块,从而打破平衡。
那些没有权重的区块怎么办呢,我们仍然希望那些区块的交易能够贡献系统的吞吐率,所以我们需要一个确定性的排序算法,能够让所有区块交易顺序被一致的决定出来,这样的话系统的吞吐率就可以提高。但是这样的系统仍然有确认延迟问题,因为我们仍然需要等待足够多的有权重区块出现以后,才能去确认这个区块,时间仍然是很长的。
回顾一下刚才说的两个情况,一个是原始的GHOST方法,它可以在没有攻击情况下迅速的确认交易。但有攻击的情况下没有progress(进展)。有没有一种方法,让这两个系统在有攻击的情况下,没有攻击的情况也能保证progress。有的,我们的一个方法是GHAST,让所有节点选一个主链,最重子树规则。我们的主链叫做数轴链,我们还发明一个确定的排序算法,使得所有节点根据主链就能对所有区块做一个一致排序,可以让所有区块交易贡献系统的吞吐率,从而提高系统的效率。系统操作在原有GHOST模式上,从而取得最有的效率。我们的系统会去attack攻击发生,如果攻击发生会给一部分区块很小的权重,从而保证系统的progress。
如何自动的做模式切换,区块组成树突的结构,这里一个重要概念是PAST集合,根据这个集合,如果follow所有的边(Edges)可以编辑到一个区块的集合,这个区块都是发生在这个区块之前,这个叫做PAST集合。比如这个图显示的是E的区块PAST集合,这个显示的是A区的PAST集合。怎么自适应给区块权重呢,看一个区块Past树突长什么样子。如果发现Past集合不够稳定,我们以很小的概率,1/H,把区块赋为H,把其它区块赋为0。一个账本每个Past是固定的,所有节点能够一致决定一个区块的权重。一个正常的情况,对于一个区块,比如区块A来讲,系统运行一段时间之后,账本结构,账本的子树会聚集在某一个孩子下,比如A.下,A.的子树应该在A所有的后继区块里占绝大部分。对于每个区块Past集合里,判断有没有违反,如果违反了就切换到GHOST结构下。
如何确定区块的顺序,让所有的区块能够贡献系统的吞吐率?我们的想法是引入一个Epoch概念,每个树轴链上区块都定义Epoch,其它分叉区块可以根据规则散到相应的Epoch里。这样的话根据Epoch给区块做排序,在Epoch内部根据图的拓扑序做排序。这样的方法可以抵御双发攻击,主要原理是这样的,因为区块的排序是由树轴链决定的,树轴链如果不变的话,区块排序不会被改变。另外,我们树轴链的选择,因为是应用了最重子树规则,只有超过50%算力的人才能够去改变树轴链的选择。基于这两点假设,系统能够和比特币一样假设条件下,取得对双发攻击防范。
确认规则是说对于任何一笔交易,我们会先发现交易在哪个Epoch里,找到Epoch对应的树轴链区块,可以理论去估计这个区块被篡改了一个概率是不是小于用户所能承担的风险,如果小于用户所能承担的风险,我们就能确认这笔交易。正常情况下,确认时间是非常短的。我们上层执行环境是兼容以太坊智能合约,测试网已经发布,主网计划在明年Q1上线,也就是3月份时上线。
再说一下应用场景的事情,我们认为在Conflux最关注的应用场景,一个是跨境的支付,跨境的汇款。另一个是如何去支持更加高效的去中心化交易所。还有关注一个场景,如何支持toC端存证应用,让用户可以在互联网数据中享受到具有信用价值的数据。我们相信有了Conflux这样高性能的公链后,这些场景的落地都是有可能实现的。
另外,我们最近在上海市政府的支持下落地了树突区块链研究中心,以此不断推动区块链技术进步,使我国的区块链技术能够在世界上保持领先的地位。