公链的交易速度慢总是被大家所诟病,近几年几个主流公链都有拥堵的情况。现在许多项目都标榜自己百万TPS,从而解决了公链性能不足的问题。但区块链性能问题真的解决了吗?不妨我们一起分析一下,看看公链的性能的瓶颈到底在哪里。
1 传统的POW共识
比特币作为区块链技术的开山鼻祖,其性能早已不能满足现在的交易需求,故而时常发生拥堵。我们先来看看下图比特币的记账过程:
比特币采用POW共识(工作量证明),其中主要有两个步骤耗费比较多的时间。一是做工作量证明(Time1),即算出符合要求的区块哈希值。二是全网广播(Time2),等待其他矿工确认这个区块的过程。
在设计时,比特币的出块时间设定为10分钟(即需要10分钟的工作量证明),每个区块的大小约1MB,一个块最多可以打包几千条交易数据。尽管单个区块可以包含千条交易信息,但由于至少需要10分钟才能完成一次出块,这导致平均单位时间内记录的交易信息低,即TPS低。
| TPS( transection per second )是常用的描述区块链性能的指标,指每秒处理业务的数量,是衡量一个系统吞吐量的重要参数。
由于出块慢导致比特币的TPS只有7左右。因此,比特币的拥堵常被归咎于其所用的POW共识机制。
有人会说可以通过增大区块的容量或是提高出块速度的方式来增加TPS,这样就不会拥堵了。这个想法很美好,但是实际上不能这么简单地增加交易吞吐量。增大区块容量会导致Time2的增加(广播时间变长),因为单个区块包含的字节变多了,所需要的传输时间也就相应变长;尽管提高出块速度会使Time1变小,但当出块速度太快而广播速度跟不上时,一个区块在被全网矿工确认之前,新的区块又被挖出来了,这样会出现分叉。分叉会降低网络的安全性。请参考下图:
本来不分叉时作恶的成本是不少于全网51%的算力。现在分叉以后假设A链分到60%的算力,B链40%的算力。如果想要作恶把A链回滚改到B链,只需要全网21%的算力就可以了。所以分叉降低了作恶的成本,使网络变得不安全。因此,10分钟的出块时间是比特币在安全与效率之间做的妥协。
所以在POW下不可以随意的加大区块容量或提高出块速度。这会增大分叉的可能,降低网络的安全性。
2 POS共识提升交易速度
由于POW的交易速度慢和高能耗,POS共识(权益证明)渐渐被更广泛的采纳。例如以太坊2.0中重要一步就是从POW共识转为POS共识。与POW不同,POS通过质押Token获得打包区块和投票的权利。其记账过程如下:
在POS中,矿工所出的块直接就是候选区块,省去了POW中工作量证明的步骤(Time1)。因为在质押代币成为矿工的时候就已经默认把打包的权利分配给矿工了。POS在出块以前就把打包权分配好了,而POW要在出块后再去竞争打包的权利。所以POS会比POW效率更高,甚至可以做到秒级确认。可见POS的交易性能较POW有了显著提升。
以太坊在现有POW共识下,TPS大概在30到40。虽然大大高于比特币,但还是时不时地拥堵,转账有时候要等上好几个小时才能完成。为了解决这个问题,以太坊选择放弃POW而采用效率更高的POS机制。今年ETH2.0的phase0信标链(Bacon Chain)启动,开始POS逐步取代POW,届时只需要质押32个ETH就可以成为矿工。
3 更高速度的DPOS
EOS的DPOS共识属于POS,由代币的持有者选出一些代表,再由这些代表轮流记账。DPOS本质是牺牲了去中心化来获得高吞吐量,EOS网络只有21个超级节点进行出块。
相比POS的几百上千个节点,EOS只需要在21个节点中广播,因此Time2所需时间会进一步缩短,TPS也将大大提高。
EOS在白皮书中宣称有百万级的TPS,可是在2019年的EIDOS空投时还是发生了拥堵。尽管改进了共识算法获得了超高的TPS,可为什么连一个空投项目都会引发拥堵?可见还有其他因素制约着区块链的性能。
区块链网络的性能不光和TPS,也就是吞吐量有关;还和单个全节点的性能有关。区块链网路中的常见节点大致有两种:全节点,轻节点。网络中每个全节点都要负责广播区块,确认交易。所以全节点要保存整个区块链的交易历史,还要存有全网所有的用户、DAPP的状态以便在交易时验证这些信息。轻节点只负责查询全节点的信息,不参与记账过程,所以轻节点不会对网络性能有什么贡献。在执行交易或运行DAPP时,会依赖全节点来完成,因此全节点的性能决定了交易执行的处理速度。但是区块链网络的性能并不是所有全节点的性能叠加,而是存在一个木桶效应。木桶的储水量取决于木桶中最短的那块板,整个网络的性能也受制于单个全节点的性能:全网性能不会高于单个全节点的性能。
EOS的拥堵正是受限于单个全节点的性能。EOS把全节点的性能分成RAM,CPU等资源。再把这些资源通证化,允许网络中用户通过租赁的方式最大程度的提高全节点的利用率。当短时间内出现大量处理请求,全节点的性能资源会快速枯竭,就像是运行了过多程序的电脑,再开个网页也会十分卡。2019年EIDOS空投引发的拥堵正式因为EOS网络中CPU资源快速告急,一笔转账所需的CPU超过了网络能分配给它的CPU而被搁置无法完成。
4 公链性能的瓶颈究竟在哪里?
从上面几个例子可以看出,改变共识算法可以在一定程度上提高吞吐量,增加TPS。但无论共识算法如何改变,始终逃不了Time2这个步骤:全网充分广播,待节点验证后确认区块。而这一过程的处理效率主要和广播的传输效率以及节点处理信息的能力有关。
广播的传输效率越高,网络的吞吐量就越大,TPS也就越高。吞吐量的物理上限是各个全节点之间的网络带宽,而网络带宽又受制于通讯技术和硬件设备。现在很多项目一味的鼓吹千百万级的TPS,这需要一个很高的网络带宽,要把所有全节点困在一个局域网里才有可能实现,但这样的网络几乎没有去中心化可言。
单个全节点的性能越好,其处理信息的能力就越高,公链性能就越强悍。可一味提高全节点的要求同样会导致中心化,比如只有一些高配置服务器才能做全节点,那这些节点就可能被一些大型公司控制。
综合来看,区块链的性能主要受限于网络带宽和单个全节点的性能。现在很多项目只一味的追求高TPS,使人误以为这样就提高了公链的性能。实际上他们只关注了网络带宽而忽略了全节点性能对整个网络性能的影响。对公链来说提高性能的关键是要保证在一定去中心化程度的基础上突破这两点限制。
5 突破瓶颈的办法
现在提出的最有可能实现的是分片(sharding)方案:把一条单链切分成好几组,每组叫一个shard。假设全网100个全节点,分组后每组只有20个全节,一个交易不用向全网所有的全节点广播确认,只要这组20个全节点局部验证了就行。这样提高了网络带宽的利用率。每组的节点也不同存储全网的用户信息,DAPP状态;主要存储自己这个小组的就好,减轻了节点负担,可以有效避免拥堵。
当然分片方案还要注意协调不同shard之间的运行。以太坊2.0的最终目的也是通过分片的扩容方案解决现有以太坊性能不足的问题。以太坊2.0的规划是5年,可见执行起来难度不小。现在为了克服公链的性能瓶颈,越来越多的方案被提出,相信未来一定能找到一个完美的解决办法。
参考资料:
1.《从以太坊网络拥堵说起》https://www.jianshu.com/p/7cc32f212a1d
2.《EOS出现区块网络拥堵?这件事其实是这样的》https://www.jianshu.com/p/04d01c0f4873
3.《时隔一年EOS又堵了,我们再次感受到了Fomo的力量》https://baijiahao.baidu.com/s?id=1649077077299497991&wfr=spider&for=pc
4.《EOS主网TPS再创新高,但TPS并不是越高越好》https://www.8btc.com/article/245055
5.《PoW和PoS的全面比较:各自的优劣在哪?》https://baijiahao.baidu.com/s?id=1627215065673166980&wfr=spider&for=pc
6.《区块链公链如何才能快起来 (一)》https://zhuanlan.zhihu.com/p/46766111
7.《号称「公链分片」技术的五大谎言 - 区块链公链如何才能快起来 (二)》https://zhuanlan.zhihu.com/p/47592706
希望大家可以关注微信公众号更加方便交流。公众号的文章也会率先更新~