关于以太坊性能优化的思路

叁叁肆2018-12-07 15:43

此文已由作者苏州授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验


1.区块链系统长期的痛

众所周知,吞吐量一直是区块链的一个痛点。比特币的底层设计仅支持每秒7笔交易,还不及传统支付工具Visa每秒8000笔交易的一个零头,更别说支付宝在去年双十一创造的每秒25.6万笔的记录。这严重制约了去中心化应用的发展。去年以太猫风靡全球,造成了以太坊的大堵塞,以至于人们戏称用是否造成区块链堵塞来评价去中心化应用的热度。关于区块链系统的性能提升也是业界当前研究的一个主流方向,那么接下来就由本人来说说区块链系统的性能瓶颈在哪?区块链系统性能可以提升到多少?区块链系统适不适合高并发场景下的应用呢?

本文主要从联盟链的角度出发进度性能优化角度的提升,主要考虑是因为在实际项目实践中多以联盟链为主,而且联盟链相比公链来说,基于联盟链的特点系统提升的空间将会更大些。


2.区块链的性能瓶颈在哪

首先,我们来说说区块链的性能瓶颈在哪?知道性能瓶颈才可以针对性的下药嘛。根据本人对于以太访的实践和学习,总结了以太访中的性能瓶颈要点,部分要点已经成为了业界的共识。

1)共识算法

共识算法是区块链系统的核心,也是区块链系统公平公正性的保障。本人认为区块链系统的最大的创新在于其共识机制。首先,来说说以太访公链POW算法,简单来说POW算法就是通过选取网络中“最聪明”节点的算法,该算法能够很好的保证公平性,但是该算法存在能源浪费严重,出块效率低的问题。当然除了POW算法外,像其他的POS、DPOS、PBFT等等共识算法,都存在一个瓶颈,就是共识算法在某单点的时间上都只有一个节点且某块,在出块方面永远都是串行的,无法并行出块。区块链系统的TPS性能和区块的出块速度有着直接的关系,也是本人认为在做项目中首要考虑的因素。

(特别想强调下,有很多人认为只有POW是去中心化的,本人认为没有真正意义上的去中心化的说法,POW也是会被算力强的部分节点中心后,80%的出块权力掌握在20%的节点手中,而且在实际做项目中我们也不要被去中心化给带偏)。

2)P2P网络

 以支付宝以及双十一的TPS的并发量来推演区块链领域。d为交易大小,TPS是35万笔每秒,P是需要转发的交易数,D是每秒需要处理的数据总量,Td是每秒钟网络接收和数据发送的总量。如果区块链要达到这样的一个性能指标的话,每秒钟需要处理的数据传输,网络传输至少是50M,也就是每秒钟节点之间数据传输需要达到50M/每秒。对于一些好机房来说可以实现,但是对于一般网络挑战就非常大了。(本人比较懒,就引用了汪晓明《如何通过软硬件结合打破区块链性能瓶颈》的说法)

3)交易执行

说起交易执行,就要说说区块链系统的特点,简单来说区块链系统其实是一个“很笨的状态机”,干着一件“所有节点都在做同样的事”的特点,看似区块链有成千上万个分布节点,干着却是单机一样的事,可以肯定的说“区块链是一个零并发系统”。为什么说“零并发”,因为交易顺序执行、交易指令顺序执行、所有交易都是单机执行。

4)签名验证

签名验证主要是从单机执行的角度出发,根据本人的实际测试验证签名在单机交易执行时间上的占比1/3左右。从市场上来说,已经有很多的关于区块链加解密的硬件出来,也充分说明了签名验证对于区块链系统性能的影响。

5)数据存储

下载过以太访或者比特币的同学就知道,等把全链数据下载完你的磁盘空间就基本没剩下多少了。另一方面,如果在大并发情况下,对于数据的读写性能要求也会更加。


3.那么如何提升区块链的性能呢?

性能提升的思路简单一句话概况为“模块拆分、数据并发、业务剥离、网络分组”。以太访源码(EthereumJ,本文都是以Java版本为前提说的,本人本人主要对GO语言不是很熟悉)为单个工程项目,包含账户管理、共识、网络、数据存储、P2P、RPC模块等。

1)模块进行拆分
模块拆分是第一步性能提升需要做的事,需将以太访单个项目工程拆分为账户管理、挖矿共识、P2P网络、数据存储、RPC、交易执行、EVM微服务,将各个模块的服务通过Dubbo+ZK(或者其他方式)方式进行调用,单个工程拆分为微服务工程这里就不细说了。模块拆分的好处,可以实现系统横向扩展、提升节点的稳定性、模块职责界面清晰等优点。
2)数据并发
数据并发可以从三个方面提升区块链的并发性,一是出块并发,出块并发至在某个时间点情况下,实现并发出块,这个实现需要共识算法的支持,例如通过实现DPOS算法,同时调整某个出块节点可以同时出N块的方式,实现块并发;二是交易并发,交易并发的难点在于识别哪些交易是可以并发的,特别在有智能合约调用的情况下会更麻烦。以太访的交易并发,可以通过与执行识别交易依赖的地址(如果设计合约,包括合约执行相关的任意账户和合约地址),将是否冲突的交易进行分组,并进行分发执行,注意有可能分发执行后还好存在冲突,可能需要再分组执行的情况;三是EVM执行并发,这个有点像编译器优化的工作,通过编译后的二进制代码,识别可以并发操作的指令,将EVM的执行进行并发。以上只是提了提思路,本人在实践过程中发现,数据并发是最复杂的,而且并发需要针对实际业务场景进行调研分析,明确消息调用的类别分布。
3)业务剥离
这点在做实际项目时是需要好好考虑的,一般公司的业务情况都会比较复杂,而区块链系统并不适合解决复杂业务场景的系统,区块链系统擅长的是存证,所以在项目的设计过程中,可以考虑增加辅助的业务系统,或者把区块链定位为辅助的存证系统是比较妥当的做法。通过对业务的剥离,实现轻量化的区块链可以很好的提升系统性能。
4)网络分组
网络分层就是将以太访的网络进行分组,首先将整个P2P网络进行划分,划分为N个子网络,每个子网络由一个或多个节点保持对其他网络分组的P2P通讯,对于单个分组内部,本人推荐使用MQ消息队列进行组内的消息广播(如果可以的话本人推荐直接用MQ将P2P网络进行替换,可以大大降低网络中消息的重复传递)。网络分组方式不适合公链的模式,因为网络的分组会比较难以管理,而且利用MQ会降低用户的对系统的信任。在联盟链的情况下,网络分组还是一个比较不错的方案。


免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击