对于区块链处理速度无法满足商用这个难点,业内早已达成共识, 大家也都因为以太坊虚拟猫造成的以太坊拥堵事件是耳熟能详。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(数据来源:https://www.bitcoinplus.org/blog/block-size-and-transactions-second):
那么平均每个区块的交易数量 = 1 * 1024 * 1024 bytes / 495 = 2118
区块产生时间约为10min,那么TPS = 2118 /(10 * 60) = 3.53
对以太坊来讲,以太坊每个区块包含的交易记录数量不固定,而是根据gas limit来决定。区块交易数量波动较大,从几十到一两百不等,区块产生时间也波动较大。我们在etherscan粗略统计ETH平均每秒交易记录,计算得出每秒产生约十余个交易记录。
那么,区块是如何产生的呢:
>> Step1: 节点运行共识: 节点不断监听系统,并开始运行共识算法,例如PoW共识算法是根据区块头和nonce进行哈希运算。
>> Step2: 广播并验证的时间:当一个节点完成计算后,提交给网络中的peers,验证后加入到区块链上,继续广播,直到网络中的节点均达成共识。比如一个班的人想达成共识,老师率先作出答案,把答案传递给第一排的同学,第一排的同学验证完毕传递给第二排的同学….直到最后一排的同学也验证完毕才算达成共识。
>> Step3: x个confirmation之后被认为是安全的:为了防止区块链被攻击,通常在数个甚至数十个confirmation之后才可以动用转入的token,例如一些交易所要求12个confirmation。这里的x,confirmation数量是指从包含目标交易的区块开始往后数,相继有x个区块依次挂到区块链上。x越大,表明区块链越长,越难被攻击者更改。
这三步是有前后次序的,不能并发。事实上,区块产生的时间仅为第一步与第二步,第三步是前两步的循环往复,用于确认系统的安全。所以,TPS的计算公式为:
TPS = 一个区块内包含的交易数量 / 区块产生时间
= 一个区块内包含的交易数量 / (共识算法运行的时间 + 广播并验证的时间 )
根据上述推论和公式,我们认为提升区块链TPS,可以从以下几方面入手:
1. 增大一个区块内包含的交易数量(或连续出块)
前文讲过,区块容量相当于是并发数,区块容量越大, 越容易形成中心化的系统,一旦系统被恶意攻击,受到的损伤也越大。
所以可以适当的增加容量,但不能为了追求TPS而盲目扩容。因为这相当于少数节点埋头计算,间隔很久才和其他节点交流一次,不安全。
▼
典型代表:比特币扩容和Genaro的混合共识机制。但比特币的扩容,更多是不是技术层面,而是应用层面的争论。
而Genaro的SPoR+PoS混合共识机制,利用SPoR来筛选可信节点,这些可信节点可以同时处理更多的交易,让被选举的共识节点连续出块来提升Genaro公链的性能。
2. 减少共识算法的复杂度
算法时间复杂度越低,相同硬件条件完成算法的时间越短。
▼
典型代表:Genaro使用SPoR来代替PoW。SPoR是数据可检索性证明,并不需要消耗大量算力,且不随时间而递增。详情见第一篇文章《设计可持续发展的共识算法》中对SPoR的介绍。
“在Genaro系统中每天都会对存储节点进行challenge”,存储节点通过运行SPoR算法表明数据是可被取回的。
这种证明的难度不会随着时间的推移而增加。证明一个文件可取回,今天的计算量和明年是几乎一致的。且SPoR是云存储领域中本身就被验证为可靠的算法,不会对系统带来隐患,同时是在做有价值的计算。
3. 减少广播的目标节点
以太坊是全节点达成共识,目前以太坊的节点数量为16750个。全节点达成共识,不仅受最慢节点的短板效应的影响,也因为不断的广播,在网络传播中耗费大量时间。
而如果只选取部分节点,仅在这部分节点中广播,相当于只让班里最聪明的人来计算并相互验证即可,可以有效减少传播节点和广播时间。
▼
典型代表:EOS的DPoS通过21个超级节点完成验证,EOS采用的是DPoS(委托权益证明)共识机制,它是由被社区选举的可信帐户(受托人,得票数排行前21位)来创建区块。 21个超级节点相比于以太坊现有的16750个节点,21个节点在速度上将有更大的优势。减少广播时间,极大的提高TPS,让EOS对外的宣传上,敢对标ETH,说自己最高达到百万TPS。
但问题在于,只选取部分节点达成共识,更容易被攻击。黑客不需要进行51%攻击,只需攻击那些特定的节点。此外,选取制度不完善或有漏洞,系统很容易被操控,例如贿选,这也是EOS选举超级节点的一个争论。
Genaro的部分PoS ,也减少了广播的目标节点,来提高TPS。Genaro采用混合共识机制,先由SPoR进行信用筛选,然后选取101个节点出块,既保证安全性,又增加了速度。
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的海量用户均可以链下完成交易。
Genaro团队也在进行跨链/链上链下协议的研发,我们会在后续文章中进行跟多的分享。
通过对于以上提升TPS方法论的研究,我们会发现:提升TPS的就是靠放宽Verify,牺牲安全性或者去中心化程度。如果盲目增加TPS,会使得区块链完全牺牲了去中心化,同时对矿工的机器配置要求极高,如果跟不上上传的交易,越多没有被验证的交易,后面的隐患越大 。EOS虽然使用21个超级节点达到高效,但同时牺牲了去中心化与安全,引入了ddos等潜在风险。这就是著名的不可能三角:效率,安全性与去中心化不可兼得。请记住,提升任意一个指标,必然会牺牲其他两个指标,如果有一个项目声称打破了不可能三角,那99.9%是不靠谱的。
如果选择去中心化和高效低能耗,则要牺牲安全性,在金融领域,这个方案几乎可以一票否决;如果选择去中心化和安全,舍弃高效低能耗,必然导致交易模式和场景的极大压缩,几乎是在所有商业主流业务上的全面撤退;最后,如果选择高效低能耗与安全性,又破坏了“去中心化”的愿景。为了走出这个困局,其实每个项目需要思考的不是如何盲目兼顾三个点,而是其面临的市场需求可以允许牺牲哪个点。
本文的标题是“兼得安全性的高TPS”。笔者认为,在当前公有链的技术体系与应用场景中结合来看,三个因素当中可以一定程度牺牲的是“去中心化”。
这个结论可能令人一下难以接受,毕竟区块链在人们心中就等于去中心化。比特币作为第一个区块链应用,去中心化的设计目的在于:不需要信任任何一个节点,通过共识机制的巧妙设计来信任整个系统,同时防止被攻击。总结一下,去中心化的目的在于:让系统可信且安全。
所以,去中心化不是目的,而是手段,高效低能耗和安全才是目的。
Genaro通过把存储网络引入共识机制来达到同样的目的。虽然不是全节点共识,但Genaro的存储网络+公有链的双底层结构,是对全节点进行筛选,前101名贡献最大的节点作为委员会节点进行出块,整个网络都参与进了全程的不同阶段。
在比特币的PoW共识中,历史表现不能代表未来对于网络的贡献,每次出块时所有节点都必须在同一起跑线进行PoW运算,而Genaro增加了一个存储的维度,存储贡献是一个对网络连贯的贡献,可以根据历史表现来“预判”其未来的可信度。首先,Genaro存储网络中设立了极为严格的惩罚措施,如果经常掉线,其Stake的GNX将被减扣,从而确保大节点的可信度;此外,Genaro公链是不会被分叉的,因为分叉链无论如何都掌握不到存储网络的全部数据,除非有一个人攻占了全部存储节点。从而,可以在一定程度牺牲去中心化的情况下,依然保持了系统的安全性、可信度,同时提升了效率。
最后补充一点,不可能三角虽然不能被打破,但是可以随着技术日新月异的进步对于系统整体提升。打个比方,短跑与长跑不可兼得,短跑运动员都很强壮,长跑运动员都很纤瘦,一个运动员短跑越强,长跑一定会变弱。但普通上班族和博尔特比长跑,大概率是赢不了的,就是因为博尔特整体能力都相比普通人类进行了提升。现在的互联网技术无论是安全性还是效率都远高于90年代,有理由相信随着软硬件的不断提升,不可能三角限制将逐渐弱化,行业将迎来总体性能的提升。
我预计2018年TPS的问题即可被解决,而另外的一些难题则要更为困难。
【往期回顾】
并期待下篇:《公有链的七大超级难题之连接现实世界与区块链》
公有链的七大超级难题,是公有链绕不开的关键。七大难题环环相扣,需要一个从宏观到微观的深度认知,不仅涉及到技术领域,同时,经济、营销、市场、社会等领域都需要深入考虑,Genaro Network点对点存储和公有链的通证经济的体系设计,不仅是未知领域的探索,更是一场艺术之旅,大家请继续关注系列文章《公有链七大超级难题》和我们一起踏上未来旅程,迎接区块链的挑战与变革。