传说中的百万TPS真的可行吗?

转载
2335 天前
17692
比特评级

火讯财经注:安全性、稳定性和可扩展性三者不可兼得,被称为区块链不可能之三角,TPS对于网络交易速度的提升,同时也部分牺牲了区块链的安全性或稳定性。从现实应用来看,百万TPS的处理速度在现有环境中的应用价值并不是那么必须,并且区块链技术不能仅仅依赖TPS的提升去解决所有的问题。


作者 | 震荡箱体

来源 | 比特评级

对于区块链处理速度无法满足商用这个难点,业内早已达成共识, 大家也都因为以太坊虚拟猫造成的以太坊拥堵事件是耳熟能详。因此Sharding成为了2017-2018最火的技术。但是要知道,区块链的诞生并不是为了盲目的高性能,有太多人走向极端,过度宣扬TPS的重要性,动辄上万,甚至十万百万。这就走向了另外一个极端,好比在一个小村镇建一个16车道,且不论可行性,即便造出来,也没有这么多车来开。

以下是一些主流公链或者项目的TPS与用户量的指标:

我们能看出,用户量和TPS并没有特别大的关系,而是和市场需求有关。

首先,技术发展和基础设施(节点等)需要一定的时间。不单单是TPS一项指标,区块链的其他技术也有待突破。系统的吞吐量和TPS其实是两码事。区块链作为一个系统,最终量化性能的其实是吞吐量,也即单位时间内成功传输数据的数量,对CPU的消耗、外部接口、IO等等紧密关联。区块链的网络节点更为分散,性能不如中心化服务器的带宽,区块链的TPS很可能不是速度处理的瓶颈。以网速来举一个例子, 一般个人用户的网络速度为数千KB每秒,(很少可以达到带宽上限),假设一个交易记录所用容量为0.5 – 1KB,加上不同节点所需的传输步骤,千级别的TPS基本就不是效率的瓶颈。

其次,从使用量角度分析:假设有x为每天的交易记录数,所需的TPS是y。我们以简单的二八原则来考虑:x笔交易记录80%在20%的时间完成,y需要满足高峰期的要求。那么:

y1  = x * 80% /(24h * 20%)* 3600 ) = x / 21600

如果节点完备,用户发展良好,可以进一步假设用户平均分布,那么:

y2 = x / (24h * 3600) = x / 86400

由上表可见,即便是公链每天进行1亿次交易,千级别的TPS也足以应对。目前区块链从发展到猛增阶段过渡,我们拿以太坊做一个参考,目前峰值大约为每天1250k笔交易,即1.25million,下一阶段的工作为做好百级别的TPS,以及探索千级别的解决方案。

当然,如果公链需要支撑DAPP的集中市场营销就另当别论了,例如双十一抢购,全天完成14.8亿笔交易,峰值18万/秒。除非你认为区块链上面的用户可以持续保持双十一抢购的狂热,不然不需要进行十万级别的处理速度。而话又说回来,真正的点对点经济模型如果可以建立,是不太可能出现如此集中的交易的。

需要注意的是,上述是对于交易记录数量的分析,是指使用区块链进行token transafer或者部署智能合约的用户 。可以粗略估算一下,假设一个公链有很多DAPP,共有千万级别用户,每个用户每天使用不同的DAPP消费10次(大部分人平均每天没这么多消费,实际使用中,并不是每个DAPP的用户的每项操作都需要进行Token Transfer。假设有一个基于区块链的淘宝,用户平常更多的是浏览商品,编辑购物车,与买家讨价还价等操作,真正下单的操作占比很少。

事实上,不同的应用的用户数,PV(page view)与TPS都存在 一定的函数关系。这需要根据市场需求来具体建模),系统TPS达到千级别也是足够承载的。2C用户突然大规模来使用区块链产品并不现实,真正从可转化为的用户量全球保守估计为一千万

最后,需要注意的是单机测试的TPS并不是最终的TPS,有的项目方为了刷高TPS,购买数百万的设备在一个实验室内进行测试只是起到PR效果或者自娱自乐,没有大规模被使用的公链讨论TPS是没有意义的。

所以,在公链性能上,并不是TPS越高越好,它是根据市场需求而定的。按照现在的情况,TPS过千,已经能满足大部分商业需求。过高的TPS,必然会降低安全性,也可能会导致性能过剩,所以,TPS的速度,并不是一个公链最终的目的。

TPS:Transactions Per Section,系统每秒钟处理的事务。根据定义,TPS计算方法是:TPS = 并发数/平均响应时间

对于区块链系统而言,TPS就是每秒钟新产生的交易记录。矿工将区块打包提交到网络,每个区块链包含一定数量的交易记录,这个“一定数量”就是是并发数(为了增加一定程度的并发,提高TPS,中本聪创造BTC的时候,使用的是“区块链”的数据结构,来代替“链”式数据结构,)。所以在区块链系统中我们也可以这样计算TPS:TPS = 一个区块内包含的交易数量 / 区块产生时间

以中本聪设计的比特币为例,一个区块大小为1mb,每笔交易记录平均大小为495bytes,那么平均每个区块的交易数量 = 1 * 1024 * 1024 bytes / 495 = 2118,区块产生时间约为10min,那么TPS = 2118 /(10 * 60) = 3.53

对以太坊来讲,以太坊每个区块包含的交易记录数量不固定,而是根据gas limit来决定。区块交易数量波动较大,从几十到一两百不等,区块产生时间也波动较大。我们在etherscan粗略统计ETH平均每秒交易记录,计算得出每秒产生约十余个交易记录。

那么,区块是如何产生的呢

  • 节点运行共识: 节点不断监听系统,并开始运行共识算法,例如PoW共识算法是根据区块头和nonce进行哈希运算。
  •  广播并验证的时间:当一个节点完成计算后,提交给网络中的peers,验证后加入到区块链上,继续广播,直到网络中的节点均达成共识。比如一个班的人想达成共识,老师率先作出答案,把答案传递给第一排的同学,第一排的同学验证完毕传递给第二排的同学….直到最后一排的同学也验证完毕才算达成共识。
  •  x个confirmation之后被认为是安全的:为了防止区块链被攻击,通常在数个甚至数十个confirmation之后才可以动用转入的token,例如一些交易所要求12个confirmation。这里的x,confirmation数量是指从包含目标交易的区块开始往后数,相继有x个区块依次挂到区块链上。x越大,表明区块链越长,越难被攻击者更改。

这三步是有前后次序的,不能并发。事实上,区块产生的时间仅为第一步与第二步,第三步是前两步的循环往复,用于确认系统的安全。所以,TPS的计算公式为:TPS =  一个区块内包含的交易数量 / 区块产生时间 = 一个区块内包含的交易数量 / (共识算法运行的时间 + 广播并验证的时间 )

根据上述推论和公式,我们认为提升区块链TPS,可以从以下几方面入手

1. 增大一个区块内包含的交易数量或连续出块

前文讲过,区块容量相当于是并发数,区块容量越大, 越容易形成中心化的系统,一旦系统被恶意攻击,受到的损伤也越大。所以可以适当的增加容量,但不能为了追求TPS而盲目扩容。因为这相当于少数节点埋头计算,间隔很久才和其他节点交流一次,不安全。

2. 减少共识算法的复杂度

算法时间复杂度越低,相同硬件条件完成算法的时间越短。

3. 减少广播的目标节点

以太坊是全节点达成共识,目前以太坊的节点数量为16750个。全节点达成共识,不仅受最慢节点的短板效应的影响,也因为不断的广播,在网络传播中耗费大量时间。而如果只选取部分节点,仅在这部分节点中广播,相当于只让班里最聪明的人来计算并相互验证即可,可以有效减少传播节点和广播时间。

典型代表:EOS的DPoS通过21个超级节点完成验证,EOS采用的是DPoS(委托权益证明)共识机制,它是由被社区选举的可信帐户(受托人,得票数排行前21位)来创建区块。 21个超级节点相比于以太坊现有的16750个节点,21个节点在速度上将有更大的优势。减少广播时间,极大的提高TPS,让EOS对外的宣传上,敢对标ETH,说自己最高达到百万TPS。

但问题在于,只选取部分节点达成共识,更容易被攻击。黑客不需要进行51%攻击,只需攻击那些特定的节点。此外,选取制度不完善或有漏洞,系统很容易被操控,例如贿选,这也是EOS选举超级节点的一个争论。

4. 取消验证步骤      

一个节点运行完共识算法后,提交区块,其他节点不加思考,即可同意,这种方法会节约大量时间,因为相当于无条件信任运行共识算法的节点,若想避免被攻击,只能中心化管理服务器。

5. 减少区块链产生时间:Sharding

Sharding是数据库中的常见方法,也即并行运算。区块链本质上也是存储数据的一种方式,所以用数据库的优化方法是个好主意。互联网数据库的分片是指,将一个数据库(可以想象为一个excel表单)切成多个片,每当运行一些查找等基本操作时,可以在多个片并发进行,从而把链式查找的时间复杂度从o(n)减少到树式查找的o(logn)。

典型代表:Zilliqa,公有链,为高吞吐量的应用程序提供运行平台。在最新的实验中,测试网络达到每秒处理2,400个交易以上。比目前的主流区块链平台快了200多倍。Zilliqa区块链平台致力于支持高吞吐量和数据驱动的分布式应用程序,以满足诸如电子广告、支付、共享经济和产权管理等业务必要的扩容需求。而他的核心是分片技术Sharding。

假设网络存在6000个节点,Zilliqa将自动把网络划分成10组分片(每分片共600节点)。各分片能同时进行交易验证。若1组分片能在一定时间内验证400笔交易,那10组分片便能在同样时间内验证4000笔交易。还有其他很多火热的项目也都是踩到了Sharding的点,例如夸克Quarkchain、ETH、MOCA等。

Sharding只是分片(并行)的一个技术名词,不同项目可能是对区块链的不同部分进行Sharding,例如交易Sharding,共识Sharding,智能合约Sharding等。然而区块链中的Sharding却比普通数据库难的多。互联网数据库大多为无序状态,而区块链是高度有序的状态:新区块一定要在老区块之后诞生。所以无论如何Sharding,都只能是考虑一个区块内的并发,无法做到整个链的并发。

6. 此外,还可以跳出框框来考虑问题:off chain solutions,链外处理方案

链下解决方案将部分交易放到链外,并将这部分的总账与系统结算。比方你经营一家咖啡店,所有的交易都发生在你的咖啡店里,咖啡店的账只跟你结算,但最后你的账会跟全球的金融系统来结算。

典型代表:比较典型的代表有以太坊的Raiden Network(雷电网络),团队宣称已经成功在去中心化应用网络上完成了第一笔链外交易。雷电网络增加了以太坊的可拓展性,同时使代币的链外转移速度更快,费用更加低廉。我们可以形象地以升级游戏举例,游戏中的所有出牌得分都是链外进行,只有最后的结果被记录在了区块链上。

同理,比特币的外链Lighting Network(闪电网络)相当于在比特币主链外设立点对点支付通道,实现多次、高频得实现瞬间确认的支付形式,所有用户的交易可以在这个通道内进行而不被记录在比特币主链上,主链记录的是用户之间最终结算的数据,通过链外处理方式,实现Visa级别的支付速度。

还有我们熟悉的Plasma,所有数据计算可以在链下发生,但最终可在链上强制执行小量的更新。与闪电网络类似,Plasma是一系列的运行于现存区块链之上的智能合约,来强制保证大家可以可以在一个合约状态中持有资金,且能在后面的某个时间在网络上进行清算、取款,以此来增加网络的拓展性。

链下处理内部交易,DAPP的需求非常大。试想这样一种场景,每个DAPP和每个用户部署单笔交易的结算合约,又和公链合理的批量结算,两边通过合理设定保证金、交易规则等来确保系统独立运行。那么公链只需要承载直接用户与各个DAPP即可,DAPP的海量用户均可以链下完成交易。

最后补充一点,不可能三角虽然不能被打破,但是可以随着技术日新月异的进步对于系统整体提升。打个比方,短跑与长跑不可兼得,短跑运动员都很强壮,长跑运动员都很纤瘦,一个运动员短跑越强,长跑一定会变弱。但普通上班族和博尔特比长跑,大概率是赢不了的,就是因为博尔特整体能力都相比普通人类进行了提升。现在的互联网技术无论是安全性还是效率都远高于90年代,有理由相信随着软硬件的不断提升,不可能三角限制将逐渐弱化,行业将迎来总体性能的提升。