ODE:EIP-3855 如何让合约更精简

前言

本文将深入介绍EthereumOpcode的最新成员:PUSH0

在过去,我们只能使用PUSH10x00来达成将数值0存入EVM的Stack中,而上海升级中包含诸多EIP之一的EIP-3855提案则引入了PUSH0这项新的Opcode来达成相同的效果。透过节省1Byte的指令空间,减少了智能合约编译后的Bytecode大小,进一步降低智能合约部署的成本。

而本文将会快速地带到EVM、Bytecode与Opcode的基本概念,并一步一步地带你了解PUSH0的核心意义和对现有合约的影响。

文章会从EVM、Opcode到PUSH0详细说明,若您为区块链开发人员,我们可用一句话函盖整篇文章:

EIP-3855引入新Opcode:PUSH0来取代PUSH10x00,因减少1Byte指令空间,所以减少了部署智能合约的200Gas,所有合约加总一年大约可省1,362.23ETH。

以太坊牧猫人项目管理人员:伴随对冰河期进行修复,希望没有EIP-1559的矿工将无法进行简单的链分叉:3月6日消息,以太坊牧猫人项目管理人员、以太坊生态系统贡献者Edson Ayllon表示,EIP-1559将在以太坊伦敦网络升级中启动,同时将对即将到来的冰河期(Ice Age)进行修复。希望没有EIP-1559的矿工将无法进行简单的链分叉,但需要在冰河期(Ice Age)取消后分配新客户端。

此前2月11日消息,随着以太坊逐渐进入冰河期(Ice age)使得挖矿难度不断加大,每日新挖出的以太坊总量已经从20000个减少到了13000个,下降了近一半,降至历史最低点。

据悉,以太坊的冰河期(Ice Age)是以太坊的PoW机制对难度(difficulty)的调整策略。以太坊里PoW对难度的调整将根据区块高度不断增加,而这个增加是指数级的,算力发展的速度将远跟不上难度增加的速度。以太坊是不能进入冰河期的,进入冰河期意味着以太坊将失去功能。以太坊设置冰河期是为了表明其要转向PoS的态度和决心。[2021/3/7 18:22:48]

EVM与Opcode概念

去中心化借贷平台Dharma支持以太坊实施EIP1559:去中心化借贷平台Dharma联合创始人Brendan Forster发推称,“EIP1559是对以太坊的巨大改进。我支持其实施。”Dharma官方账户转发并表示,“在Dharma,我们相信EIP1559将是一个重要步骤,使以太坊更易用,因此更有用。我们支持其实施。”[2021/2/15 19:48:39]

在介绍EIP-3855之前,我们先来简单了解Ethereum中最重要的EVM概念!

EVM

我们为了让智能合约在独立且安全的环境中执行,而从Ethereum节点中会切出一块具有储存、执行等功能的运算环境,我们将之称之为EVM虚拟机。

而这个EVM具备执行智能合约所需的堆叠、记忆体、纪录Gas费用及储存下一行指令位址等各种必要元件,以便完成开发人员要求的各种计算。

Bytecode与Opcode

以太坊EIP 1559提案进展:Besu和Geth两客户端已执行提案实现:9月23日,以太坊开发者Tim Beiko发推更新以太坊EIP 1559提案发展进程。具体内容包括:

1.Besu和Geth两个客户端都有针对EIP-1559的实现。多实现可帮助发现Bug,随着逐步测试更复杂的场景,将添加更多客户端实现。

2.以太坊基金会鲁棒性激励小组一直在进行基于代理的模拟。模拟主要是为分析EIP 1559在一系列不同的使用模式下如何响应。

3.机制设计研究人员Tim Roughgarden已签约对EIP 1559提出的收费市场机制进行评估,并将对其他方案(如自动扶梯收费方案)进行比较。

4.Ethereum Cat社区成员已开始接触各种项目,以向社区外寻求对EIP 1559提案的意见。

最后针对该提案下一步计划,Tim Beiko提到,社区将于10月8日举行下个实施者会议,根据与不同利益者会话,将为提案制定主网准备清单,以及更多潜在的客户端进行提案实现。[2020/9/23]

我们用Solidity等语言所撰写的智能合约,要先编译成一连串EVMOpcode,这一连串Opcode称为Bytecode。我们接着来进行一段简单的操作就会比较清楚!

Gitcoin资助报告:EIP 1559社区基金已获得35578美元捐款:7月21日,V神在其个人网站发布《Gitcoin资助第6轮回顾》报告。报告显示,Gitcoin资助第6轮中,筹集资金共包括来自1,526个捐赠者的227,847美元捐款,以及695个项目中的配对资金175,000美元。与此同时,报告指出,EIP 1559社区基金是本轮资助的最大赢家。此前很多社区成员对EIP 1559提案感到兴奋,但其开发资金非常少。在捐款中,有很多大额捐款,包括V神本人和EthHub联合创始人Eric Conner早期捐赠的约2400美元。本轮筹资初期,尽管单笔捐款数额较大,但EIP 1559提案配对资金总量很小,捐款均来自少数较富裕的捐赠者。随后有社交媒体宣传此笔捐款后,吸引了大量小额捐款跟进。当前捐款额已达到35578美元。此前6月底消息,以太坊开发人员正在为改进提案EIP 1559向社区寻求资金,开源软件资助平台Gitcoin启动社区基金,为参与以太坊改进提案EIP 1559的测试者提供奖金和激励。[2020/7/23]

有兴趣的读者可以透过EtherVM了解更多关于Opocde的介绍。

声音 | Eric Conner:下周将写文章解释关于EIP-1599中矿工小费等问题:EthHub创始人Eric Conner此前提出了EIP-1599,认为这一提案可以 “修复” 当前以太坊手续费市场上的诸多问题。10月24日,Eric Conner发推称,人们似乎对EIP-1599存在一些疑问,尤其是关于矿工的“小费”。下周将写一篇FAQ文章来澄清任何疑惑。据悉,EIP-1559主要由三个部分组成:1. 将区块Gas上限由800万调整到1600万;\u20282. 给每个区块都设定BASEFEE(字面意义为“基本手续费”),在同一区块中打包的交易都以BASEFEE作为Gas Price;并且,BASEFEE会根据此前区块的GAS利用率动态调整,如果利用率低于50%,则降低手续费,如果利用率高于50%,则提高手续费;然而,这些手续费并不会交给矿工,而是会被协议销毁掉;\u20283. 除了由BASEFEE确定的手续费以外,用户还可以自定义给矿工的小费(tip)。\u2028据Eric解释,把手续费燃烧掉是为了防止矿工通过发交易来操控BASEFEE。[2019/10/25]

首先,我们先在Remix上编译下方这份简易的加法智能合约,编译完成后就可从artifacts资料夹中看到包含此智能合约Bytecode与Opcode的Json资讯档。

智能合约在线编译工具Remix

与此同时,这个智能合约也已部署到Goerli测试网中,我们可点选在Etherscan上的钮从Bytecode切换到Opcode观看模式。这时,即可得知一连串Opcode称为Bytecode。

这里就只截取这份合约部份的Opcode。

部份Bytecode与Opcode对照表

现在我们有了EVM、Bytecode、Opcode的概念后,那EIP-3855到底要改进什么问题呢?

前面的例子中,我们了解到若想要将一个零的值推到Stack中,这个动作会被编译成「PUSH0x00」(两个Byte,分别是0x60及0x00,其中0x00代表零的值,所以0x6000整整占了2个Byte的Storage空间!

1ByteBytecode空间需要支付200Gas的费用。

另外,执行1个PUSH1的操作需支付3Gas,而PUSH0也是,所以PUSH0主要是减少编译后的程序码大小,但实际上执行时的Gas消耗和PUSH1是一样的。

我们来看一下以下关于Push10x00指令在2020年的统计数据:

Push10x00指令占了2020年全年度智能合约Bytecode的4.57%之多,它被如此常用,以致于几乎所有的智能合约中都可看到它的身影!

这时,如果我们新增一个Opcode来做和PUSH10x00完全一样的事,是否就可以再减少1个200Gas的空间消耗?

答案是可以的!EIP-3855即将会在这一次的上海升级中在Opcode中引入一条PUSH0新指令,而这个新指令的编号是0x5F!

会选择0x5F做为PUSH0的原因,除了0x5F在上海升级前没有被使用外,而且它也刚好是在PUSH1指令的前一个编号!是一个连续且有意义的指令空间。

0x5F及0x60的Opcode指令编号,图片来源:https://ethervm.io/

EIP-3855带来的改变

将0x6000指令瘦身至0x5F有一个最重要的改变,就是部署合约时的Gas费用变便宜了!程式码中每个使用到PUSH10x00的地方都可以因为这个改变而省下200Gas!

那我们一样以2020全年度使用340,557,331次0x6000指令来计算,大约需耗费340,557,331x200Gas=68,111,466,200Gas。接着若以1Gas需支付20GWei来计算,也就是可以为整个网路省下整整约1,362.23ETH,而且各个Ethereum节点也可省下不少储存空间。

此外,对于开发人员来说,也可减少使用一些特殊优化手段来减少PUSH10x00的200Gas开销,例如使用DUP指令等。使用0x5F代表着可减少开发人员进行各种优化成本与风险,也利于估算智能合约的Gas费用。

结论

带来的改变有以下两点。

EIP-3855将减少部署智能合约时的Bytecode大小此外,EIP-3855也可减少过去开发人员在进行各种优化上的成本与风险本文介绍了Ethereum的EVM及Opcode的概念,并且深入探讨了EIP-3855改进的重要意义与影响。一旦这次的上海升级完成,就可减少开发人员部署合约时所需的储存空间费用,而EIP-3855提案和新的特性,也将吸引更多的开发者加入到以太坊的生态中。感谢您阅读本文!

参考资料

中文以太坊虛擬機https://ethereum.org/zh/developers/docs/evm/英文EIP-3855提案https://eips.ethereum.org/EIPS/eip-3855EIP-3855英文討論區https://ethereum-magicians.org/t/eip-3855-push0-instruction/7014EVMCodes列表https://www.evm.codes/EthereumVirtualMachineOpcodeshttps://ethervm.io/PDF-ethereum-evm-illustratedhttps://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf关于EIP-3855常见问题

1、EIP-3855提案通过后是否可提升TPS?

TPS增长量不大,因为实际在主网上部署合约的交易并不多,假设在一个区块内有10笔部署合约交易的状况,若每个合约部署只「一次性」省约25个PUSH0,所以TPS可提升的有限。

2、一般Solidity开发人员如何应用此EIP-3855提案?

一般Solidity开发人员要等到上海升级完成才能享受到程式码大小变小的好处,EIP-3855主要是让Solidity编译器将所有PUSH10x00改为PUSH0,以节省空间、减少gas等好处。

2020年「PUSH」系列指令數量統計表

此表格参考EIP-3855中作者之一HugoDelacruz所統計的2020全年度EthereumOpcode数量表格,并进行延伸计算。

表格链接:https://mirror.xyz/0x347c9872A2a1dE370D798f9FE96341A9A0E05af8/mmOWhqg5WUkVD54iS210GPcX728x1kz2XZp94mOMtcE

?

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:15ms0-0:789ms