原文作者:Beosin
以太坊上海升级,也被众多媒体称为 Web3 下一场新的叙事,这也是目前大家讨论最多的一热点。
2023 年 3 月,以太坊将推出预期的上海升级,截止发稿前,本次升级主要包括 EIP-3540、EIP-3651、EIP-3670、EIP-3855、EIP-3860、EIP-4895、EIP-4200、EIP-4750 以及 EIP-5450 。而备受瞩目的 EIP-4844 将推迟到 5 月至 6 月进行更新。
图片:Shutterstock
首先,在以太坊生态中,我们经常听到一个词“EIP”,这个词是什么意思呢?
EIP 全称是Ethereum Improvement Proposal。它是一系列以太坊平台上推荐使用的标准和协议的统称。它所包含的具体标准和协议涉及以太坊的核心协议、客户端 API、智能合约标准等。每一个 EIP 包含对某个标准或协议的定义。
我们先来了解以太坊上海升级将涉及的几个标准。
EIP-3540
该 EIP 主要是针对 EVM 对象格式 (EOF) 合约字节码进行的更新,为 EVM 引入了一种可扩展和版本控制的容器格式。在合约字节码中添加了代码和数据的标记,实现了代码与数据的分离,这种分离对于链上代码验证器特别有利,因为验证器可以区分代码和数据。(详细参考:https://eips.ethereum.org/EIPS/eip-3540 )
EIP-3651
该 EIP 主要目的是将「COINBASE」地址由冷地址变为热地址。目前,COINBASE 直接交易正变得越来越流行,因为它们允许有条件的支付,这提供了如隐式取消交易等好处。但是访问 COINBASE 的价格过高,原因是最初在 EIP-2929 中引入的访问列表框架下 COINBASE 是按冷地址访问成本来进行 gas 计算的,而冷地址访问成本相比于热地址访问成本相对较高。(详细参考:https://eips.ethereum.org/EIPS/eip-3651 )
EIP-3670
该 EIP 主要是配合上述 EIP-3540 合约创建时引入代码验证。拒绝包含截断 PUSH 数据或未定义指令的合约字节码。(详细参考:https://eips.ethereum.org/EIPS/eip-3670 )
EIP-3855
该 EIP 主要是增加了 PUSH 0 指令,作用是将常量 0 压入堆栈。目前只有将 1 字节到 32 字节压入堆栈的 PUSH 1-PUSH 32 指令,而将常量 0 压入堆栈,需要使用 PUSH 1 0 指令进行操作,而该指令在 runtime 中需要消耗 3 gas,并且额外需要消耗 2 字节的存储成本费用 2* 200 gas。目前大约存在 11.5% 的 PUSH 指令压入了一个常量 0 到堆栈,而新增 PUSH 0 指令后,可以节约一定量的 gas 费用。(详细参考:https://eips.ethereum.org/EIPS/eip-3855 )
EIP-3860
该 EIP 主要是对 initcode 的最大值进行了修改。目前 initcode 的最大值在之前 EIP-170 中设置为 MAX_CODE_SIZE: 24576 ,在 EIP-3860 中,新的 initcode 的最大值为 MAX_INITCODE_SIZE = 2 * MAX_CODE_SIZE = 49152 。这使得合约大小的最大值扩展了一倍,合约可以拥有更加丰富的功能。但 initcode 每字节将添加 0.0625 gas 的成本,合约部署 gas 成本微微上涨。(详细参考:https://eips.ethereum.org/EIPS/eip-3860 )
EIP-4895
该 EIP 主要是激活以太坊信标链质押提款的功能。(详细参考:https://eips.ethereum.org/EIPS/eip-4895 )
EIP-4200
该 EIP 引入了三个新的 EVM 静态跳转指令,分别为 RJUMP、RJUMPI 和 RJUMPV,其目的是为了优化网络以及降低成本。目前 EVM 仅拥有动态跳转机制,这虽然能让字节码非常灵活,但是也同样增加了代码分析的复杂程度。这些静态指令的主要好处是降低了 gas 成本(在部署和执行时)以及拥有更好的分析属性。(详细参考:https://eips.ethereum.org/EIPS/eip-4200 )
EIP-4750
该 EIP 主要是对代码的优化。主要是在上述 EOF 格式 (EIP-3540) 的基础上引入了在字节码中包含多个代码段的能力,每个代码段所代表的是一个单独的子程序或函数。在字节码中引入了 CALLF 以及 RETF 两个新操作码来负责调用和返回这种子程序或函数。此外,该 EIP 还引入了 JUMPF 指令来执行跳转到这种子程序或函数的操作。(详细参考:https://eips.ethereum.org/EIPS/eip-4750 )
EIP-5450
该 EIP 主要是改变了代码的验证过程,对网络进行了优化。目前 EVM 对每条执行的指令进行大量的有效性检查,例如溢出、gas 是否充足等,而该 EIP 将使得合约在部署时便进行相关验证,从而减少代码在运行的时候进行的此类验证次数。(详细参考:https://eips.ethereum.org/EIPS/eip-5450 )
1、EVM 细节优化
主要有两个细节改进的 EIP,分别是:EIP-3651 以及 EIP-3860 。
主要是针对现有的细节问题以及优化体验方面进行的细节改动,其中 EIP-3860 能够缓解目前智能合约字节码长度限制导致部分复杂的合约必须拆分成多个合约才能够部署到主网的问题,该 EIP 的引入将会显著增加智能合约功能的丰富性与多样性。
2、信标链提款
主要通过 EIP-4895 进行实现。
目前,信标链上的 ETH 质押数量超 1500 万枚,占以太坊流通总量的近 13% ,本次升级之后,将开放这超 1500 万枚以太坊的提取功能。
本次提取功能将采用“推”的方式将款项从共识层(信标连)推送到执行层(主网),将定义一个分叉时间戳 FORK_TIMESTAMP,从该时间戳开始,执行层便要对提款进行处理。共识层会定义一个负载级对象 withdrawal,该对象会提供包括:index(计数器,记录提款次数)、validator_index(验证者数据)、address(提款目标地址)以及 amount(以太坊数量)的关键信息,会主动推送到执行层。执行层中也将定义一个新字段 withdrawals,该字段保存的是 withdrawal 对象的列表,执行负载获取到一个 withdrawal 对象后,添加到 withdrawals 列表。在经过验证之后,便会对 address 地址增加 amount 数量的以太坊,从而实现以太坊的提取。
3、字节码改进
主要有六个字节码相关改进的 EIP,分别是:EIP-3540、EIP-3670、EIP-3855、EIP-4200、EIP-4750 以及 EIP-5450 。
这类升级主要是增加部分新字节码指令,包括:PUSH 0、RJUMP、RJUMPI、RJUMPV、CALLF、RETF、JUMPF。还对字节码进行了分类,添加字节码的标记用于区分字节码的类型,并对字节码每个类型进行了模块化。另一方面,更新了字节码的验证机制,优化了网络以及使用费用。
这部分升级是本次上海升级的主要内容,将会对以太坊虚拟机系统产生相对较大的影响。Beosin 会将本次上海升级中的所有指令同步纳入 Beosin-VaaS 智能合约代码检测工具中。
另一方面,备受瞩目的 EIP-4844 被推迟到了今年 5 月至 6 月进行更新,其功能是引入一种“携带 blob 的交易”的新交易格式,该格式是为 L2 数据传输所专门设计出的数据类型。
Rollups 是一种扩展解决方案, 在短期、中期甚至可能在长期内,该方案是以太坊唯一的去信任扩展解决方案。近期几个月中,L2 向 L1 传输数据的费用一直高居不下,而 Rollups 很明显的降低了许多以太坊用户的交易费用,其中 Optimism 和 Arbitrum 拥有比以太坊基础层本身低 3-8 倍费用的功能,而 ZK rollups 甚至拥有比以太坊基础层本身低 40-100 倍费用的功能。
然而,即使是这样的费用,对于许多用户来说也太贵。长远看,数据分片是解决 rollups 自身不足的很好的解决方案,可以为使用 rollups 的链的每个区块增加 16 MB 的专用数据空间。但是,数据分片功能的实施和部署需要漫长的时间才能实现。
该 EIP 提供了一个解决方案,通过实现“携带 blob 的交易”这一新的交易类型,该交易类型是为了承载 L2 的原始交易压缩数据,相当于之前的 calldata。由于 L2 的交易压缩数据上传的目的只是为了供其他人下载验证,所以 calldata 其实并不需要被 L1 执行从而产生 gas 费用。新交易类型 blob 便不会像 calldata 那样被 EVM 读取,其会保留在共识层,并在 30 天的延迟之后被删除。简单来讲,就是将之前的 calldata 数据保留到共识层,而不会像之前那样发送到执行层,从而产生高昂的 gas 费用,也正是 Rollup 费用能因此降低的原因。