Ethereum 效能瓶颈与改善方案

本文将介绍Ethereum 的效能瓶颈以及将交易执行从共识中拆分出去如何能提升效能。

先备知识包含

  • TPS、Gas Limit
  • 区块链(Bitcoin、Ethereum)的运作:节点、网络、区块、EVM
  • 知道Sharding 和Rollup 的概念

Ethereum 的效能?

大家对区块链比较熟悉的效能指标是每秒交易数量,Transactions Per Second(TPS),例如Bitcoin 的TPS 是7,平均每秒处理7 笔交易。如果把这个指标套用到Ethereum 上,会以当前的Gas Limit(30m)、单纯转帐的Gas Cost(21k)、区块时间12 秒来计算:30m/21k/12 ≈ 119 TPS,平均每秒处理119 笔转帐。但Ethereum 会单纯用来转帐吗?随着在Ethereum 上开发的应用越来越多,绝大多数的交易不是单纯的转帐,因此这也是为什么TPS 不适合用来当作Ethereum 的效能指标。

不过今天的重点不会放在区块链该用哪一个效能指标,而是介绍Ethereum 效能的瓶颈及如何突破这个瓶颈。所以我们姑且继续用TPS 来衡量Ethereum 的效能。

调整协议参数来增加TPS?

在往下介绍瓶颈和解决方法之前,要先介绍一下在设计解决方法时需要考虑的一个重点(尤其是对Ethereum 来说) — 中心化程度。

很多人会有疑问,为什么不把Gas Limit 往上调就好了,这样每个区块不就可以收入更多交易了吗?或是为什么不把区块时间缩短?网络有这么慢吗?需要12 秒的时间来确保新的区块有足够时间被送到网络的各个角落?

你可以不断去上调Gas Limit,让你的链能处理更多交易,但随着交易越来越多,节点同步区块会耗时越来越久,最后能跟上的节点会越来越少,节点也就越来越中心化。

同样的道理也适用在缩短区块时间上,把区块时间缩短成5 秒、3 秒,最后留下来的都是网络速度快的,甚至是地缘近的节点群组。

除了普通人自己运行的节点跟不上的影响外,Solo 的矿工也会越来越少,因为负担不起更快的网络、处理速度更快的机器,最终收益下滑导致他离开网络或加入矿池,同样也造成节点中心化。

Ethereum 的效能瓶颈

一条区块链由很多元件组成:共识、网络、交易验证,也因此有很多影响效能的因素。是达成共识的速度太慢?还是网络传输的速度太慢?还是交易验证的速度太慢?对Ethereum 来说,最大的效能瓶颈不是达成共识的速度,也不是网络传输的速度,而是交易验证的速度。

注:这个瓶颈也适用其他「EVM 兼容链」,不论你今天共识演算法有多厉害、每秒可以达成多少TPS,只要你交易验证包含EVM 执行,你的整体效能就一定快不过EVM 执行的速度。

如果不能调整协议参数,不如调整节点规格?

前面段落有提到协议参数设定的依据,并不是调整协议参数就能无后顾之忧地增加TPS。那不如反过来调整节点规格?

如果今天瓶颈是网络速度,那直觉就是假设节点网络速度要够快就好了;如果今天瓶颈是硬碟读取速度,那就假设节点都有够大够快的硬碟不就好了?但它们的代价都是一样的:越来越少节点能够符合规格,网络的节点就会越来越少、越来越中心化。

注:当然这还是看人取舍,你可以说你的网络只要有21 个节点就够去中心化了、你可以说硬体升级的速度会比节点负载上升的速度还快,所以不用担心超负荷,但Ethereum 一路走来一直都是以追求最大化地去中心化为目标,如果要让越多节点能顺利同步区块,就不能随意拉高节点性能的假设。

接下来要进入正题,介绍提升效能的其中一个方法:将交易执行从共识拆分出去。

将交易执行从共识拆分出去

为什么效能会被交易验证速度绑住?因为我们要亲自执行过每一笔交易,确认交易是合法的、别人的执行结果和我的执行结果是一样的,才收入这笔交易、这个区块,才达成共识。也就是共识和交易执行是绑在一起的。这就导致了即便你的共识演算法一秒可以对1000 笔交易达成共识,你实际上TPS 却只有100,因为你节点一秒就只能执行、验证100 笔交易。

验证者要执行、验证过每一笔交易

注:在意识到瓶颈出在EVM 的效能后,当然最先想到的就是要换一个更快的VM,也就是几年前还经常听到的EWASM — Ethereum + WebAssembly,但后来研究方向已经转往其他地方。

如果我们把共识和交易执行拆开:验证节点在收到一笔交易时不再执行该笔交易,而是单纯检查交易发起人有没有足够的钱来支付把他的交易资料收进区块里的费用。当节点不需执行交易,效能就不再受到交易执行效能的限制,也就是EVM 的限制。在这个模型下,PoW 矿工或PoS 验证者都可以专注在对「交易资料」达成共识,不需烦恼「交易执行」,这时候TPS 就只受限于共识达成的速度或是网络传输的速度。

单纯对「资料」达成共识,而不是对「执行结果」达成共识。

注:什么是把交易资料收进区块里的费用?想像一个区块可以装任意资料:涂鸦或到此一游的讯息都可以,但区块大小不是无上限,而是1 MB,因此每一笔交易都要支付手续费来争取被收进区块的权利,且交易资料越大手续费越高。(不能让任何人都可以零成本地丢资料上去,这不是IPFS。)

只要支付占用区块空间的手续费,交易就可以被收入

你可能会觉得很奇怪,如果节点都不执行交易,谁来告诉我我刚刚拿300 USD 到Uniswap 上去换,到底换到多少ETH?其实这样的模式并不是要套用在目前你熟悉的ETH 1.0 中的。在介绍这样的模式要怎么实现之前,先快速复习一下Sharding 和Rollup。

Sharding

Sharding(ETH 2.0 的其中一部分)中,Beacon Chain(以下简称BC) 的区块会收入各条Shard Chain(以下简称SC)的区块资讯,所以当BC 验证者对BC 的区块达成共识,也就同时对SC 的区块达成共识。

Rollup

Rollup Sequencer 把交易打包送到L1 上,利用L1 的安全性,确保交易的排序。只要L1 没有被攻击、没有re-org,就可以确定交易顺序没有改变。只要确定了交易顺序,任何人都能独自算出当前Rollup 的状态。

假设初始状态是A 有10 元,B 有5 元,C 有0元,你知道目前有三笔交易且交易排序是:
Tx1: A →$5 → C
Tx2: B →$2 →A
Tx3: C →$3 →A
则你一定可以算出最新的状态是A有10 元,B 有3元,C 有2元。

虽然Rollup 并不是真的将共识及执行拆开(Rollup 的Sequencer 还是要执行过交易才会决定要不要把交易收进区块),但有一个相似的地方是:Rollup 的交易对L1 来说是没有意义的。L1 验证者只负责收入Rollup 交易进区块里而不会实际执行它,Rollup 节点才会挑出属于他Rollup 的交易并执行。

Rollup 节点挑出各自的交易并依序执行

Sharding + Rollup

Shard Chain 将会成为放置Rollup 交易资料的链(如同今天Rollup 的交易是放在L1 区块里),再由BC 对SC 区块达成共识,确保SC 区块里的交易排序。Rollup 再从SC 区块中挑出自己的交易来执行。

Execution Environment / Execution Layer

从Sharding 和Rollup 的例子可以看到,BC 或L1 的验证者是针对资料(Data)达成共识,他们不会去解读这些Data,而是交给Rollup 自己去解读。Rollup 的角色在这个模式里就称为Execution Environment 或是Execution Layer:负责解读Data,例如把Data 解读成一笔Uniswap 交易然后执行。

不同Rollup 有各自的协议设计:Optimism 有自己的VM、自己的收费方式,Arbitrum 也是,StarkNet 也是,zkSync 也是,但他们都是透过L1 的安全性来确保交易顺序,再以各自的协议去依序解读Data、执行交易。他们各自的协议就如同不同的Execution Environment。

回到前面提到的问题:谁来告诉我我的300 USD 在Uniswap 上换到多少ETH?答案是Rollup 节点而不是L1 节点或SC 节点,因为在共识和交易执行拆分的设计底下,L1 或SC 只是用来存放资料的。

Celestia

https://celestia.org/

最后想要介绍一个以「共识、执行分开」的概念为核心的链— Celestia。Celestia 验证者对Celestia 区块达成共识,这个区块里面所包含的资料要怎么解读,则交给Execution Layer(就像Rollup 解读L1 或SC 的资料),对一个Execution Layer 来说,一个Celestia 区块里包含的资料可能有意义,也可能没有意义(没意义则忽略它)。

不同EL 对区块里的资料各自进行解读

Celestia 看起来就很像ETH 2.0 里BC + SC + Rollup 的组合,但除了它没有Sharding 的设计之外(Sharding 是好是坏目前还是见仁见智),它还有内建Data Availability 机制,确保区块资料(Data)是可取得的,否则空有Execution Layer 但拿不到Data,还是没办法执行。

本文链接地址:https://www.wwsww.cn/ytf/12116.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。