区块链本质论:性能本质

区块链本质论

区块链被大家关注件好事情,但非常不希望看到各种区块链项目盲目上马,造成各种社会资源的浪费。区块链技术本身尚在发展阶段,还有很多核心技术问题有待突破,对区块链技术本质还充斥着各种不同的理解。后面几天我们将就区块链的计算本质,技术难点,业务调整,社会影响等方面和大家分享。

(3) 性能: 吞吐量、确认延迟和状态容量

咱买个电脑,大家都知道要看处理器(CPU)的速度,每秒能处理多少指令;也会要看内存容量,这基本上决定了我们能同时开多少个应用,打开多大的文件并且不卡。区块链系统,也是类似,吞吐量类似于一台电脑的CPU处理速度,决定了每秒可以处理多少个交易;而状态容量类似于一台电脑的内存容量,决定了整个系统可以承载多少个用户(地址)在各个应用里面的状态。

有个额外的指标是确认延迟,这个源自一个很奇特的现象。区块链系统可以接受一个交易,但是没处理或者没处理完,就开始接受下一个交易了。这个时候你就会发现,例如每秒100个交易的处理吞吐量,并不是你发一个交易,1/100秒之后这个交易就处理完,并且被确认了。通常每个交易会需要历经更多的时间,才最终得以确认。

比特币性能很弱鸡,大家都知道,大约平均每秒处理7个交易。每个交易仅包含几个大整数的加减法,如果单纯是计算这些交易,随便拿个笔记本每秒都能算上百万的交易。那为啥比特币这么慢呢?先说个结论,这个事情不能赖在共识算法头上,这不是PoW的问题。共识算法的事儿可以先看上一篇。

比特币慢,有人说是PoW的难度很高,要十分钟才算一个块,也有人说比特币需要大量的算力才行。这些其实都是误解,把因果搞反了。十分钟才出一个块,是因为协议就是这么定的,不让出太快。如果大家算力多了,出块出得快了。比特币网络的算力调整算法会自动加大PoW难度,使得出块速度始终保持在十分钟一块的样子。需要大量的算力,是因为大家都要抢着去参与比特币的这个共识过程,因为每抢到一次机会,奖励25个比特币呀,看了一下,今天9000多美元一个。

所以,就这样参与比特币共识的算力越来越多,PoW的难度也越来越高,就是我们今天看到的状况。但是这个的PoW算力,只是在争抢出块机会,这个算力再大,也不会使得比特币处理交易的速度有丝毫的提升。比特币系统,吞吐量低的原因是因为,其最初上线的时候,顺应当时的底层互联网的通讯能力,设定了每十分钟出一个块,每个块大小为1M字节。然后每个交易差不到需要200到300个字节,然后综合起来就是这个大概7几个交易每秒的吞吐量了。

为什么比特币系统要这样设计呢?不能出块间隔小一点,或者每个块大一点吗?到底是什么被什么东西限制住了呢?答案是,

网络带宽从根本上限制了区块链的吞吐量

这就是为什么,我去年还看项目的时候,对于那些吹几十万几百万TPS的项目。我一般就问一个问题,你的系统跑起来需要多少带宽?要那么高的带宽,你就只能把所有节点放在一个机房里面,用局域网连起来,这不是区块链,这叫做云服务 …..

咱开头第一篇就讲到,区块链是在一个松散分布的节点之间,接力执行计算的过程。那么,计算的过程要能被接力,那就意味着每个节点都需要获得这个计算的最新的上下文,最新的数据和状态。在区块链里面,具体的做法是,有节点出了一个块之后,必须要有足够的时间,让大部分其他参与者都同步到这个新的块,然后再出下一个块。就是因为这个原因,吞吐量会受到网络带宽的限制,不能太高,否则区块链网络就会无法达成共识的一致性。

然后,毕竟我们现在的互联网已经比起10年前要快不少了。所以,现在把比特币网络加快几十倍其实根本不需要什么算法的改进,改大块大小,改小出块间隔就可以轻松实现至少几十倍的吞吐量提升。但是如果要进一步提高,并且还要保证其去中心的程度,这就有很大的理论挑战了。

这里需要强调一下,去中心的程度和性能是有矛盾的。去中心的程度要求,尽量多的人可以参与到网络里面来,可以自己运行一个节点。那么,带宽要求就不能太高,要匹配互联网接入的平均带宽水平。为什么DPOS(例如 EOS)这么高吞吐量?因为它去中心的程度基本没有,无异于云服务,那么他就可以利用非常高的带宽,是普通互联网接入带宽的几千倍,那么吞吐量当然就轻松提升了。

随着吞吐量的提升,除了带宽,对每个节点的CPU处理能力,磁盘的读写能力也都会有更高要求。这里强调带宽,不仅仅是因为带宽是首要瓶颈,更是因为高带宽对去中心的程度有极大的伤害,因为高带宽的接入受到地理位置的限制,基本上只能在数据中心。而CPU, 磁盘的升级,完全不受地理位置的约束。

(4) 性能: 状态容量

状态容量之于区块链,就好似内存大小之于一台电脑一样。但是这一点不像吞吐量的TPS被大家所关注。状态容量很少被各种项目拿来大肆吹嘘,是因为这个容量不是太好测定,同时要扩容状态容量极其困难。

状态具体指用区块链中来表示链上每一个地址(即用户)和每一个应用的状态,所有需要准备好为验证随时到来的交易的信息的总和就是区块链的状态。典型的,比如,这个状态包含每个地址的账户余额。当链上应用丰富的时候,每个地址将有更多的信息用来表示各个地址在各个应用中的状态。

状态容量就是指一个区块链系统可以具备多大的有效内存空间用来表示整个链上的状态。链上状态是必须随时驻留在内存中,准备用来验证随时到来的交易的,这个部分信息无法放在硬盘上,否则会大大减低交易验证的吞吐量,从而极大地约束区块链整体的吞吐量。那么状态容量具体是多少呢?

在第一篇计算本质中,我们介绍了,区块链网络中,每个参与节点需要随时准备好验证和更新下一个到来的区块,也就是说每个节点都完整地存储了链上每一个地址,每一个应用的状态。那么状态容量本质上受限于每一个参与节点的内存容量。从这个意义上来说,只要提高每个参与节点的内存容量,就可以提升一个区块链网络的有效状态容量。

但是,提高单节点内存容量首先这个提升非常有限,更大的问题是提高了参与者的进入门槛, 严重伤害了一个区块链网络的去中心程度。对于联盟链系统来说,尚可接受;但对于公链系统来说,这种提升状态容量是不可取的。如果要从本质上,提升状态容量,同时又不提高单个节点的内存压力,唯一的出路是全分片,至少是状态分片。不过这还是一个非常前瞻的学术研究方向,有兴趣的同学可以深入阅读本文:区块链公链如何才能快起来

这里顺便说一下,另一个涉及存储的信息: 交易历史。交易历史是从创始区块开始至今的每一条被确认的交易的总和。这个部分信息会不断积累,只增不减。例如,比特币系统,这个历史已经有200多GB了。这部分信息,一旦区块和交易被确认和执行,就不再涉及之后的区块验证和确认过程,所以可以完全放在硬盘上,而不占用内存空间。

当然这200多GB也是个事儿,硬盘容量也不是无限的。就比特币而言,消费级硬盘的发展速度也未必能赶上其历史交易记录的增长(每年最多约50GB)。但是已经有两类比较成熟的技术问题解决这个挑战。一个是checkpoint技术,可以使得节点丢弃掉陈旧的历史交易记录,另一个是RSA accumulator技术,可以使交易记录分散存储,不再要求每个节点都记录完整的全网交易记录。

 

作者:王嘉平

作者简介:王嘉平博士原为微软研究院主管研究员,专注分布式系统,计算机图形学和视觉以及用于机器学习的GPU集群等领域的研究,有数十项研究成果发表于ACM SIGGRAPH/ToG顶级国际期刊,已授权的美国专利十余项。他师从沈向洋博士(现微软全球执行副总裁),在中科院计算所获得博士学位。他的博士论文获得2009年度全国百篇优秀博士论文奖,是该年唯一一名计算机科学专业的获奖者。

为您推荐