GAS:无版本区别的EVM(以太坊智能合约虚拟机)

编者注:本文为Parity开发者WeiTang写作的,关于如何增强EVM后向兼容性的文章,改进Gas机制的方案堪称大胆。

如果我们有机会可以重新设计EVM、提升其后向兼容性、让它对功能升级更为友好,而且可以完全不必考虑我们现有的历史包袱,我们该怎么做呢?

在这篇文章中,我会探究这个问题,并记录下由此演化出来的技术说明和设计哲学。

目标

Web是没有版本区别的,而且已经存在了几十年。因此我在此假设,我们想做一个同样没有版本区别的EVM。

我们同样希望保证,这种虚拟机具备良好的后向兼容性。也就是说,至少能良好兼容我们现有的合约,而且,也可以轻松加入新功能。

Nic Carter:白宫关于加密挖矿气候影响的报告存在九大错误:9月19日消息,CoinMetrics联合创始人Nic Carter近日发文指出,白宫科技政策办公室(OSTP)发布的研究报告《美国加密资产的气候和能源影响》存在9个关键错误,具体如下:几乎没有新数据;忽略业内专家的贡献;依赖De Vries/Digiconomist相关文章;依赖Gallersd?rfer、Klaa?en和Stoll相关文章;

引用Mora等人2018年发表的垃圾论文;在自己轻率使用数据的同时,敦促谨慎使用数据;对使用可再生能源的矿工所做的努力置若罔闻;拒绝预测比特币的能源消耗轨迹。提出愚蠢且适得其反的建议。[2022/9/19 7:06:49]

无效操作码

声音 | BM回应关于ICO的问题:B1只是以市场价格销售一种产品 其到现在已经增值50%:据MEET.ONE 5月27日消息,BM在电报群与社区成员交流:1. 有成员说(B1)ICO 的资金是为了开发EOS.IO生态系统,而不是为了在二级市场拉盘,或者投机比特币。BM表示:没有ICO,没有筹资。我们只是以市场价格销售了一种产品,而这个产品到现在已经增值50%了; 2. 有成员问BM如何看待基于用户活跃的URI?会不会使新用户抛弃EOS而且忘了这个平台?BM:像Steem那样?[2019/5/27]

要设计一个永续的EVM,最简单可能也最重要的改动便是为合约部署添加一个验证过程。并非所有的字节序列都是有效的EVM代码,任何无效的操作码都不应该被部署到链上,因为在未来,这些代码可能会被分配以一个新的操作码,有不一样的功能。

BM回应关于“买入/卖出RAM”的问题,解释采用当前市场价格的原因:据金色财经合作媒体IMEOS报道:BM在Medium上发布DAWN4.0, 有网友对RAM的买入/卖出感到困惑。BM针对网友的问题给出回复:“买入RAM”是指“拥有RAM的资源”,社区有两个方案可以选择:

1. “释放RAM资源”--按此前买入RAM时的价格,退还相关费用;

2. “售卖RAM”--按当前市场RAM的价格,退还相关费用。

如果是方案一的模型,对于那些早期以便宜价格买入RAM的人来说,没有经济动机释放内存。而人们可能在早期买入超过他们需要的内存。

如果是方案二按市场供需“买入/卖出”RAM的模型,我们支持“RAM的准备金机制”,在100%储备金的机制下,将使价格远低于EOS的1%购买1%RAM的价格。这让市场自然设定价格并管理稀缺性。

关于RAM市场的投机交易,以及BM针对内存投机行为的机制,IMEOS将会详细解读。[2018/5/8]

此种检查的技术详述初次成文化是在EIP-1712中。简要来说,在执行合约创建的状态转变函数之前,执行下列检查:

遍历代码的字节码

如果代码是一个PUSH(n)操作码,则跳过接下来n个字节

如果字节码是一个有效的操作码,或者指定了无效指令,继续

否则,捕捉到错误

上述检查有点类似于jumpdestination检查。注意,对于例外情形,我们在这里使用的是“trap”,下文我们会详细解释。

功能调查

如果EVM要消弭掉版本的差别,基于EVM的代码执行应有能力调查出底层环境是否支持一种特定的功能。给定EVM所承担的角色,我们总是希望一个已经定义好的操作码的功能可以保持不变,并且还可以引入新的操作码来添加功能。而一些合约可能在引入某些特定功能之前就已经部署上去了。这些合约可以安排一个备用的子程序,在EVM不支持某功能的时候就运行子程序,而一旦硬分叉激活后就立即开始使用新功能。功能调查组件就像这里要用到的跳转器。因此,我们正式地定义一种新的操作码HAS_FEATURE。

该操作码接收一个堆栈参数。它会检查该参数是否位于0到2^8之间,如果不是,就捕捉错误

如果参数不受支持,就把0x0推回栈中;否则就推入0x1

例外与捕捉

在EVM的运行过程中,可能有很多因素会导致执行失败。单个交易可能因为耗尽Gas而失败;调用栈中的每一层都可能单独失败,而其错误必须被父调用框架明确处理。这些特性给了我们一定的弹性,但对于要运行在区块链上的合约来说,并不必然就是好事。这里,我们想重新定义一下,任何EVM本身发出的异常,都可以有trap行为,作为对fail的替代。也就是说,所有调用框架的所有执行过程中、消耗任意gas的时候、甚至被当前的状态函数回滚变更的时候,都可以有trap。合约接下来就被会鼓励使用返回值,在它们想跟父调用者交流非致命错误的时候。

Gas消耗量

过去的经验已经证明,我们总是想调整Gas消耗量。因为我们要这样做,我们不希望合约开发者对交易的Gas消耗量甚至是任何操作码的Gas消耗量作任何假设。要实现这一点,只需将EVM内所有关于Gas消耗量的公开信息都移除。这样Gas消耗量就成了一个外在于EVM、被隐藏起来的“实现上的细节”,只需在区块层执行中妥善处理。正式地移除0x5a的Gas操作码。此外,重新定义CALL、CALLCODE和DELEGATECALL,不再使用gas栈参数,而是采取现有执行框架中所有可用的Gas。

原文链接:

https://that.world/~essay/nevm/

作者:WeiTang

翻译:阿剑

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

链链资讯

[0:46ms0-2:831ms