本篇文章将剖析 eth 1.0 存在的各项问题,并介绍 Ethereum Foundation 提出的 eth 1.x 升级相关改动能如何改善当前以太坊的困境。 什么是 eth 1.x 以太坊2.0 的研究行之有年,迄今距离全面启动仍需要2–3 年的时间,并且eth 2.0 将被部署为由信标链(Beacon Chain)与多条分片链( Shard Chains)构成的独立区块链,而eth 1.0 需要经过改动与升级方能成为eth 2.0 中的其中一条分片链。这意味着现在运行的以太坊 1.0 区块链需要进行改动,并且在未来的 5到10 年保持运作,持续发展。而 eth 1.x 即为以太坊 1.0 升级版本的代称。eth 1.x 的首要目标旨在解决现在区块链日益增长的资料负担,在区块链大小持续增长的情况下保持 eth 1.0 网路的弹性。以太坊 1.0 的弊端与问题 在开始介绍以太坊 1.x 之前,必须先认知到目前以太坊存在的问题,才能充分了解 eth 1.x 被提出的背景与旨在解决的痛点。 问题 (A):网路趋于中心化
自2020/05 以来,Gas Price 的节节攀升导致开发者与高频率使用者叫苦连天,其背后原因除了以太坊用户数量的增加,也是由于耗费大量Gas 的智慧合约互动行为比例提升,而单纯转帐ETH的占比被稀释,使得以太坊网路持续拥堵。
面对这样的情景,矿工社群于 2020/6/19 UTC 投票通过,将每个区块的 Gas Limit 从 10,000,000 提升到 12,000,000。
截至06月30日,尽管每个区块的Gas Limit 提升至12,000,000,合约交易占比的提升依旧让每个区块所能容纳的交易数十分有限,在Etherscan 上可以查看到以太坊的TPS(Transactions Per Second)在Gas Limit 提升前平均落在12 左右(低于号称的15 TPS);在Gas Limit 扩增后,TPS 亦没有出现明显的提升。
可能有些人会想说既然 12,000,000 Gas Limit 依旧拥堵,那怎么不再往上提升?原因是 Gas Limit 的提升将导致每个区块的处理时间变长,进而造成
Uncle Block数量增加,使得网路的共识机制变不健康,矿工必须耗费大量额外运算来进行处理。 此外,由于独立节点与小型矿池更容易挖到 Uncle Block,长期下来出块奖励的期望值降低将导致部分节点入不敷出,进而离开网路。如此将让以太坊网路变得更加中心化,更向大型矿池集中,危害了网路的长期健康与安全性。
问题(B):状态爆炸 随着越来越多的智慧合约被部署,以及大量的合约互动行为,导致以太坊网路需要储存的状态大小正以等比级数增长。状态的增长即反映在节点的储存空间大小上。
在 2019 年年底,全节点的每月增长大小小于 20 GB;到了 2020/06,随着 Gas Limit 的提升,全节点的每月增长大小逼近 40 GB。状态不断加速增长的结果会对以太坊网路的性能带来衰退与网路健康的损害。未来全节点的运行将会变得更加艰难,可能导致网路变得越来越中心化。 此外,区块验证的难度将随之提升,导致整体网路的延迟与 TPS 的进一步下降。尽管这个过程如同温水煮青蛙,在数年之后才会导致以太坊网路出现巨大的安全性问题,然而为了避免走到那步田地,早在数年前便开始以太坊2.0 的相关研究与开发。
以太坊的未来 Vitalik 于3月19日 在推特上分享了他对于以太坊未来 5至10 年发展观点的路线图,主要由以下四个部分构成: eth 1.x other eth 1.x statelessness(无状态性) eth 2 phase 0 prep(核心路径,聚焦于 eth 1 ? eth 2 合并,移除PoW) eth 2 phase 2 and beyond
图中间的横轴代表时间线,沿着时间轴是一个从 Phase 0 启动,到 Phase 1,再到「eth1 ? eth2 合并」的「核心路径」。要完成合并有三个先备条件:
eth 2 phase 1 eth1 ? eth2 合并的规范与实现 eth 1.x statelessness(无状态性)
其中,「eth 1.x statelessness(无状态性)」可说是对于 eth1 ? eth2 合并最至关重要的一个条件。
状态爆炸对以太坊网路的影响 由于以太坊区块链的本质是一台依靠矿工维护的去中心化大型状态机,随着区块数量的增加更迭状态,不断向前移动。以太坊的完整状态包含所有个人帐户和余额的当前状态,以及在 EVM 中部署和运行的所有智慧合约的整体记忆体。 以太坊网路在每个区块高度都只有唯一一个获得全网所有节点共识的状态,这个状态在每一个新区块会产生变动并随着区块接至区块链上。
矿工在执行交易运算时,必须依据交易内容至节点内以「Merkle-Patricia Trie 」资料结构组成的状态树中更改相关的状态值,再重新计算出每个树状节点的hash 值,算出新的「Merkle Root」,生成新的状态树。
截至 2020年6月,当前的以太坊网路中约有 5 亿个状态值,总状态大小约为 10 GB,状态会随着网路上的帐户与智慧合约数量增加而按比例增长。因此,如果以太坊继续获得主流采纳,状态可能会在未来数年持续爆发性增长。不断扩大的状态主要会对节点造成两大影响: 节点读取状态耗时增加,交易处理速度变慢
目前每个新区块矿工大约需要添加或修改 3000到6000 个状态值。由于矿工处理每一笔交易时都必须要读取节点资料库中状态的相关资讯,当状态数量持续增长,在状态树中查询到指定状态值的耗费时间就越长。
建构新的状态树耗时更长,区块验证速度减慢
当矿工将交易处理完时,必须建构一个由新的状态组成的 Trie 结构状态树,当中涉及大量的 hash 值运算。计算完 Root Hash 方能建构出新的 Block Header,打包出新区块。
小结 综合来说,持续增大的状态与节点大小将导致新的全节点启动成本大幅提升:对于储存空间的需求与同步时间的增加可能会进一步导致网路中全节点数量的减少。 此外,以太坊网路的整体性能下降也在所难免。以太坊随着状态树查询与运算耗时的增加以及越来越多的合约交易,TPS 可能会进一步下降,导致网路变得更加拥堵,迎来更高的 Gas Price 竞逐。
eth 1.x 的提出 对于以太坊1.0 升级的相关研究最早可以溯及到2018年10月,在捷克布拉格召开的Devcon IV,会议谈论到以太坊2.0 无法在未来3到5 年内完全取到以太坊1.0 的所有功能,因此eth 1.0 仍必须保持安全稳定运行,于是无数的核心开发人员开始研究一系列延长eth 1.0 寿命以及与eth 2.0 介接的解决方案。 既然状态的持续增大对于以太坊网路的健康带来重大影响,解决方案之一便是消除以太坊网路对状态的需求。细看 Vitalik 于 2020年3月19日发布的以太坊未来路线图中即可看到一系列的解决方案:
上述的路线图是较为精要的版本,以太坊研究员Griffin Ichiba Hotchkiss 于2020年4月2日在Ethereum Blog 分享了他对于目前eth 1.x 研究开发方向的理解,整理出下图的技能树 :
2020年4月2日更新的 eth 1.x 科技树 eth 1.x 的目的 简而言之,eth 1.x 的核心目的有两个: (A) 延长 eth 1.0 的寿命 在区块持续增长的情况下维持 eth 1.0 区块链的安全、稳定与弹性,让人们可以选择仅下载部分的状态,在较便宜的硬体上运行节点。
(B) 与 eth 2.0 介接 由于 eth 2.0 中的分片(shards)将是无状态的,因此无状态将是参与 eth 2.0 区块验证的先决条件。 eth 1.0 要与 eth 2.0 相容的话,势必得支援无状态运作,方能顺利过度,与 eth 2.0 介接。
为了达成这两个目的,在技能树图最右侧的终点我们可以看到无状态以太坊 Stateless Ethereum。然而,无状态的以太坊这个词可能有些不够精确,因为整个以太坊网路就是基于状态而存在的。 具体来说,是找到一种方式让以太坊网路中的部分节点可以将保留整个以太坊状态的副本。这件事变为一个选项,而非必须。因此,要让现行的以太坊网路能够支援没有保存完整全网状态的轻量级节点:无状态节点参与到网路中的新区块验证。
而为了让无状态节点能够进行验证,以太坊 1.x 提出了以下三项主要改动,我们将逐一来进行介绍: (1) 区块见证机制 (2) EVM 改动 (3) 资料结构转换为二进位制(Binary)
(1) 区块见证机制 无状态节点如何参与验证。简单来说作法是:拥有全网状态资讯的完整状态节点Full State Node在打包新区块时会一并产生区块见证Block Witness,让没有保存全网状态的无状态节点能由区块见证提供的资讯对新区块进行验证。 什么是区块见证 Block Witness?
前面提到,以太坊的资料结构是由约 5 亿个状态值所构成的 Merkle-Patricia Trie。然而,其中大约只有 0.1% 状态值(约 50 万个)会随着区块高度产生变化,如:个人帐户的 ETH 余额、合约底下记载的每个地址持有代币数量。 99.9% 的状态值如:智慧合约的程式码、Uniswap 手续费 0.3% 的参数等资讯一但智慧合约部署完成便不会再进行更动。 由于一个新的区块(目前为 1,200 万 Gas Limit)至多只能容纳 571 笔交易,其涉及的状态值更改是十分有限的。那么一个没有储存所有状态值的无状态节点只要向拥有完整状态的节点请求涉及交易的相关状态值与未涉及到的 hash 值其实即可算出 Merkle Root 进行验证。
如下图所示,假设底层的14 个菱形代表以太坊网路中所有的状态值,而新区块中仅有一笔交易,针对绿色的状态值进行更改,那么无状态节点其实只需要1 个绿色的原状态值以及紫色的Hash 值与其它未变动的6 个Hash 值资讯即能透过4 次Hash 值计算,算出新的Root Hash(Merkle Root),而不需要拥有所有的14 个状态值来进行9次Hash 值计算。
图片来自https://blog.ethereum.org/ 这些为了完成Root Hash 计算所需要向拥有全网状态资讯的完整状态节点(全节点),请求的最小资讯量即为区块见证Block Witness,包含了状态Trie 中不涉及变动的部分Hash 值与涉及变动的原状态值。如此一来,没有保存完整全网状态的无状态节点 Stateless Client将可以藉由请求而来的区块见证资讯计算出新的 Root Hash。 为了便于让无状态节点参与验证,目前的最新研究方向是区块见证将可能成为区块标头Block Header的一部分,随着新挖出的区块一并广播给全网节点,让无状态节点不用再发起额外的「区块见证请求」即能进行验证区块的动作。
透过这样的方式,无状态节点即能参与以太坊网路中新区块的验证。
(2) EVM 改动 状态值的更改和运算都是在 EVM 中进行,同理,区块见证也必须经由全节点的 EVM 透过运算来生成。 EVM 的改动目标与成本和激励机制息息相关,主要包含耗费 Gas 的估算以及如何降低对节点间广播延迟的影响。
区块见证 Gas 计算(Witness Gas Accounting)
由于区块见证必须由全节点花费额外的算力来运算生成,因此会产生相应的 Gas 成本,而这个成本目前比较可行的方式是由交易的发起者来进行负担。至于如何让交易发起者在发送交易时即能准确估算额外的 Gas,以设定精确的 Gas Limit,目前仍在研究中,尚未产生明确的定案。
另外,考虑到在同个区块中可能有一个状态值被不止一笔交易进行更改,因而产生重复支付 Gas 的情形,这部分可能会成为矿工额外的奖励费用。
智慧合约程式码分块(Code Merkleization)
区块见证的目的是为了让无状态节点能够进行新区块的验证,其中必定包含了智慧合约相关的运算。然而,无状态节点没有储存包含智慧合约程式码在内的状态,所以当无状态节点要进行一笔智慧合约交易的状态运算时,便需要一并拥有包含智慧合约程式码的在内区块见证。
这时会有另外一个问题,智慧合约洋洋洒洒的程式码中可能只有其中的一小片段是与该交易运算相关联的,因此程式码分块的概念被提出。
程式码分块是一种拆分智慧合约位元组码(Bytecode)的方式,将智慧合约中与涉及交易相关的程式码拆出,作为区块见证中的一部分,一并提供给无状态节点让其做运算验证之用。
其目的便是避免调用到不必要的程式码,免于生成庞大的区块链见证导致运算时间的增加及节点间传递沟通的延迟。
(3) 资料结构转换为二进位制(Binary) 根据以太坊研究员Igor Mandrigen 进行的实验(Binary Tries Experiment),若将以太坊资料结构从目前的十六进位制(Hex)更改为二进位制(Binary),每个区块的区块见证大小将能从800。
3,400 kB 缩小至300到1,400 kB,如此将大幅减低区块见证在网路中传播的延迟时间,让区块见证机制能够运行得更加理想。然而从 Hex 转换为 Binary 具体的实作方式以及过度策略目前仍未有完全的定论。
无状态以太坊 Stateless Ethereum 介绍至此,透过引入区块见证机制、对EVM进行必要的改动,以及将资料结构转换为二进位制,已能勾勒出 eth 1.x 的大致样貌。 支援无状态节点的 1.x 网路,将能够对以太坊 1.0 的区块链网路产生下方几点关键影响:
1.对新加入节点更加友善 随着全网状态的膨胀与区块高度的提升,启动一个新节点的同步时间会变得越来越长(截至2020年6月,启动一个新全节点需要同步至少一周的时间,超长耗时的原因是因为全节点的同步必须从创世区块开始对每一个区块进行验证与同步的动作,而验证区块必须要拥有该区块高度的全网状态,因此在每一个区块同步状态是目前同步节点的极大瓶颈。
无状态节点时代的到来将能够大幅改善同步区块的痛苦过程,未来仅需凭借区块标头与区块见证即能完成区块的验证,同步节点体验的改善将能让更多人有意愿且能够负担运行节点的成本(时间与硬体资源)。
2.轻节点得以自力更生
在现行的以太坊网路中,轻节点不具备独立验证新区块与验证交易的能力,因为轻节点没有保存验证交易需要的merkle proof 资讯,因而必须向邻近全节点发出p2p请求进行请求,但轻节点现在愿意提供支援的佛心全节点变得越来越少。
无状态机制将能帮助轻节点依靠自己维护的部分状态(自己帐户与合约的余额等资讯),以区块标头和区块见证独立进行验证,不求于人。
3.节点网路安全性提升
由于区块链网路的安全性取决于能参与新区块验证的节点总数量,对网路的攻击成本将随着节点总数量的增加而提高,能有效地低系统被击溃的风险。
随着新节点启动成本的降低以及大量的轻节点投入到新区块的验证中,将让网路的整体安全性大幅提升。
4.连接 eth 2.0 最后一点也是最核心的一点,前面提到 eth 2.0 将会是由核心的信标链与多条分片链构成,全网的状态将被多个分片分开储存。由于每条分片各自拥有不同的状态,并且没有保存其它分片的状态资讯。因此对每条分片来说,其它条分片都像是无状态节点。
为了能够在多条分片链间有效验证与同步,必须依靠无状态的验证机制。因此现在的 eth 1.0 未来要能顺利成为 eth 2.0 的其中一条分片链,升级为无状态的 eth 1.x 是至关重要的一个步骤。
结论 透过以上介绍,相信读者们应该对于现行的 eth 1.0 升级到 eth 1.x 需要进行的改动,以及改动完成后的未来有更清晰的认识。 在 eth 1.x 升级完成后,人们将能用便宜的硬件运行自己的无状态节点(轻节点),更多能够参与验证的轻节点可以进一步维护全网的安全性。
拥有无状态验证机制的eth 1.x 方能顺利和eth 2.0 的信标链与其它分片链介接,正式让以太坊网路进入由无状态验证机制与分片技术构筑成的轻量化eth 2.0 未来。
原文链接:Introduction to eth 1.x and stateless nodes
—-
编译者/作者:洁sir
玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。
|