2018-10-22 00:00:00
热度: 1896
1. 区块链的TPS缘起
TPS (Transaction Per Second)并不是一个新的名词,在传统数据库中它代表了每秒钟可处理的事务(交易)数目。其计算方法,简单来说就是用单位时间内处理事务数量除以时间长度。TPS在传统数据库中已经有各种加速方法,并且根据事务的类型进行了细分,分为增加、删除、修改、查询。在区块链的世界里,所有的事务(交易)数据都被保存在区块链里,难以篡改,因而对区块链的事务处理主要是增加和查询两种。
某种角度而言,区块链是一种新型的分布式数据库系统。分布式系统的不可能三角,去中心化(节点数)、效率(TPS)和安全性,是区块链系统设计的核心问题。因而单纯谈区块链的TPS而不考虑去中心化和安全性是毫无意义的。某些项目号称解决了不可能三角,某种角度只是市场宣传而已,大家大可不必当真。所谓定理,不是那么轻易被打破的。
在传统数据库中,事务数据被存储在各种数据表中,且表的行数通常没有限制。只要有更好的数据访问方法,例如各种索引Index,内存数据写入,就能较好的提升TPS。区块链系统中,事务(交易)被打包在区块里,一个块接着一个块被存储在链式结构中,且事务(交易)的有效性取决于区块链系统中大多数节点的共识。因而区块链的TPS受制于区块的大小(一个区块中所能打包的交易数目)和区块的出块时间。区块的出块时间由生成新区块的时间和区块取得共识所需要的时间两部分构成。
自比特币区块链2009年诞生以来,广被诟病的就是TPS不够高。尤其是POW共识算法似乎不够快。10分钟才出一个区块(事实上,10分钟出一个块并不是POW算法本身的限制,而是一个产生新比特币机制的巧妙设计)。然而,由于当时的用户并不多,大家对于大规模TPS的要求也并没有那么迫切。2013年以太坊提出基于区块链的智能合约,为区块链的大规模行业应用开启了新的想象空间。以太坊1.0依然基于改进的POW算法,15秒钟产生一个区块。在很长的一段时间里,TPS看起来也足够好了。甚至有观点认为,TPS对于区块链并不重要。
2. TPS不是区块链需要解决的核心问题?
这一切随着区块链技术打开的行业应用而改变。以太坊智能合约的提出和2015年区块链联盟链的兴起,为区块链的行业应用打开了大门。人们开始憧憬并尝试基于区块链技术的各种行业应用、金融、供应链、能源、医疗、教育、电子商务。然而,任何一项行业应用对TPS都是有要求的。例如,各种金融业务,买火车票,电子商务。阿里巴巴每年的双十一都会公布一个新的系统峰值交易处理数。我们刷手机在上买东西,谁也无法忍受点了半天网页打不开,点了半天手机没有反应。2016年联盟链的发展与行业应用的尝试,让很多区块链开发团队意识到了TPS的重要性
在区块链行业应用中,除了TPS吞吐率,系统响应时间RT(Response Time)也是一个重要指标,直接影响用户的体验。TPS吞吐率影响系统响应时间RT。当系统不是满负荷运载时,即单位出块时间内的所有事务(交易)都可以被打包在一个区块内时,系统响应时间等于区块的出块时间。但系统超负荷运载时,即单位出块时间内的所有事务(交易)无法被打包在同一个区块内时,系统响应时间就会随着所需要生成的新区块数量而成倍增长。
系统确认时间是另外一个相关指标,简单而言,就是等待交易确认的时间。以网上支付为例,系统响应时间往往是发起扣款交易所需要的时间。系统确认时间是扣款完成、交易确认所需要的时间。在POW系统中,交易需要等待6个区块才得到最终确认。有的交易系统为了提升用户体验,在小额交易时,允许2个区块的交易确认,也是在用户体验和交易最终性间取得平衡。
尽管TPS在联盟链应用中已经引起了行业从业人员的关注,然而影响面相对有限,并没有引发大范围的关注。2017年,ICO兴起,一个热门的项目,往往会吸引全球成千上万用户的关注。以2017年Status众筹,引发了以太坊3天的拥堵。人们无法忍受交易迟迟无法确认的体验。区块链TPS瓶颈再度成为行业关注的热点。
2018年,若干个公有链项目也应声出发,其重要目的之一就是提升TPS,让大规模区块链应用成为可能。转眼2018已过大半EOS横空出世,从开始号称的百万级TPS到实际落地的3000+TPS。TPS无用论再度抬头,论据之一是EOS的TPS基本处于闲置,平时用到的也就是几十,在当前大家找不到应用场景的情况下,TPS是一个伪需求。事实真是如此吗?其实恰恰相反,区块链应用创新层出不穷,如果没有强大的TPS做支持,任何大规模的全球应用都只能是梦想。TPS的瓶颈限制了区块链应用创新的步伐。正如我们永远需要一台更高性能的计算机一样,人类社会信息化和资产数字化的脚步永远无法停止下来。
3. 我们说的是同一个TPS吗?
与TPS无用论相对应的是百万TPS的声明层出不穷。各个项目的粉丝也往往会拿着这个项目的TPS与那个项目的TPS进行比较。可是我们在说的TPS是同一个TPS吗?
首先,我们讲TPS不可以忽略区块链网络构成与节点软、硬件配置的差异。TPS的比较只能建立在相同网络和节点硬件环境因素之下。构成区块链的网络因素包括,系统中的节点数量是几十,几百,几千还是几万。这些网络节点中有多少参与系统共识,系统中不参与共识的节点无法对系统去中心化程度做出贡献。这些网络节点的地理分布如何?是在同一个地方的局域网内,还是分布在一个城市,在一个省,在一个国家,几个国家,是否跨洲,是否全球节点分布。区块链节点的软硬件配置如何,包括网络带宽,内存容量,磁盘是否是SSD,磁盘IO速度,磁盘容量,CPU频率,CPU内核数量,操作系统等。简单而言,在一个有限的局域网内所统计出来的高TPS,往往在全球的广域网下难以重现,因为网络延迟往往使得TPS会大打折扣甚至无法形成共识,稳定出块。
其次,测试用的事务集(事务Tx的集合)是怎样的。是人工生成的数据集还是真实的交易集?事务集合是怎样的?包括Tx的数量,Tx的复杂程度,持续的时间(是几分钟,几小时,几天,几个月还是几年)。Tx的复杂程度,包括简单的转账,智能合约的调到,是否跨链调用,是否跨分片调用等。
最后,TPS是如何统计计算的。在相同的网络,软硬件与测试集环境下,TPS的统计方法不同也会导致不同的TPS测试结果。TPS的计算分类简单来说可以划分为如下几类:
1) 递增时间窗口N:随着测试进行,不断增加窗口的长度N。用当前系统处理的所有事务数量除以当前的窗口长度。TPS = Sum(Tx) / N。
2) 分段窗口w:将时间轴按窗口长度为w进行分段。分段统计各个w窗口内所处理的事务数量,再除以w时间窗口。 TPS = Sum (Tx in window w) / w。
3) 滑动窗口sw:将时间轴按窗口长度为w进行滑动。分段统计各个滑动的w窗口内所处理的事务数量,再除以w时间窗口。 TPS = Sum (Tx in sliding window w) / w。
对于同一个时间窗口的设定,我们可以连续的获得各种不同的TPS,并可以在此基础上进一步统计出平均TPS与峰值TPS。
以上图为例,假设一个点代表100个事务Tx。
1) 递增时间窗口(以长度为8进行递增)的各个TPS观察值分别是
500/8=62.5 | 900/16=56.25 | 1600/24=66.67 | 2400/32=75 |
---|
在此基础上,可进一步得出,平均TPS为(62.5+56.25+66.67+75)/4 = 65.105,峰值TPS为75。
2) 长度为8的分段窗口的各个TPS观察值分别是
500/8=62.5 | 400/8=50 | 700/8=87.5 | 800/8=100 |
---|
在此基础上,可进一步得出,平均TPS为(62.5+50+87.5+100)/4 = 75,峰值TPS为100。
3) 长度为8的滑动窗口的各个TPS观察值分别是
(0-7): 500/8=62.5 | (1-8):500/8=62.5 | (2-9):500/8=62.5 | (3-10):500/8=62.5 |
---|---|---|---|
(4-11):600/8=75 | (5-12):600/8=75 | (6-13):600/8=75 | (7-14):500/8=62.5 |
(8-15):400/8=50 | (9-16):300/8=37.5 | (10-17):300/8=37.5 | (11-18): 300/8=37.5 |
(12-19): 300/8=37.5 | (13-20): 400/8=50 | (14-21): 500/8=62.5 | (15-22): 600/8=75 |
(16-23): 700/8=87.5 | (17-24): 800/8=100 | (18-25): 800/8=100 | (19-26): 800/8=100 |
(20-27): 800/8=100 | (21-28): 800/8=100 | (22-29): 800/8=100 | (23-30): 800/8=100 |
(24-31): 800/8=100 |
在此基础上,可进一步得出,平均TPS为(62.5+62.5+62.5+62.5+75+75+75+62.5+50+37.5+37.5+37.5+37.5+50+62.5+75+87.5+100+100+100+100+100+100+100+100)/25 = 72.5,峰值TPS为100。
显然,不同类型的时间窗口统计出来的平均TPS与峰值TPS都不相同。
平均TPS | 峰值TPS | |
---|---|---|
递增窗口 | 65.105 | 75 |
分段窗口 | 75 | 100 |
滑动窗口 | 72.5 | 100 |
容易进一步推断,不同长度的时间窗口统计出来的TPS也会略有不同。
4. 提高TPS的方法
目前提升TPS成为各个公有链系统的当务之急,大家都在积极地研发各种算法来提升系统的TPS。常见的方法分为如下几类:
5 展望
区块链TPS技术的发展将伴随区块链重构整个人类社会各行各业的进程而不断提升。随着更快、更稳定的区块链3.0系统的出现,我们将迎来区块链价值互联网与地球村的新蓝图。
文章声明:本文为火星财经专栏作者作品,不代表火星财经观点,版权归作者所有,如需转载,请提前联系作者或注明出处。