Capstone凯石资讯:EIP-3529减少gas返还

Capstone凯石资讯Capstone凯石资讯:EIP-3529减少gas返还  Capstone凯石资讯报道:  简单总结  移除SELFDESTRUCT的gas返还,减少SSTORE的gas返还到一个较低水平,使得

 Capstone凯石资讯报道:

简单总结

自毁的回气去掉,SSTORE的回气降低到一个较低的水平,这样回气量还是挺大的,但是不会像现在能用的那么高。

原因

最初,引入SSTORE和SELFDESTRUCT的气体返回是为了鼓励应用程序开发人员在编写应用程序时实践“良好健康”,并清理不必要的存储槽和合同。但结果表明,这种技术带来的效率远低于预期,气体的回流也带来了许多意想不到的有害后果:

气体回流导致气体的出现。GasToken有利于将气体空间从低成本阶段转移到高成本阶段,但对网络也有不利之处,特别是加剧了状态规模的膨胀(因为状态槽被有效地用作“电池”来积累气体),低效地阻碍了区块链气体的使用。

气体回流加剧了块体尺寸的变化。一个区块实际消耗的气体量的理论最大值接近名义气体极限(因为返回将增加同一区块中后续交易的气体空间,尽管返回的气体最多是该交易消耗的气体的50%)。这不是致命的,但影响仍然相当糟糕,特别是回报可以用来维持一个更长的高峰期比EIP-1559使用两倍的气体限制。

对于block.numbergt=FORK_BLOCK,需要进行以下更改。

1.移除自毁装置

2.将sstore _ clears _ schedule(由EIP-2200定义)替换为sstore _ reset _ gas access _ list _ storage _ key _ cost(EIP-2929 EIP-2930下4,800 gas)

3.将交易后返还的最大燃气量减少到燃气_已用//新_最大_退款_额度

原理阐释

EIP-2200推出了三种回归案例:

1.如果原始值不为零,而新值为零,则将SSTORE_CLEARS_SCHEDULE的气体量(当前为15,000)添加到返回计算器中

2.如果原始值为零,当前值非零,新值为零,则将SSTORE_SET_GAS-SLOAD_GAS(当前为19,900)的气量加到返回计算器上

3.如果原始值为非零,当前值为不同的非零值,并且新值等于原始值,则将SSTORE_RESET_GAS-SLOAD_GAS(当前为4,900)添加到返回计算器中

在这三种情况下,只有(1)将激活加密锁,并在执行过程中允许区块消耗超过区块气体限制的气体。(2)它没有这个特点,因为要得到19900的回气,同一储罐之前必须从零换成非零,这样要消耗20000的气。无法从一个储存罐获取气体并用于编辑另一个储存罐,这意味着它不能用作气体令牌。另外,为了获得返回,需要恢复存储的写入和扩展,这样返回的气体就不会增加客户端处理块的工作量。(3)类似:4900气只有在同一个储罐之前已经消耗了5000气的情况下才能返回。

这个EIP处理第一种情况。我们可以使用类似的“配对”参数来确定gastoken在什么条件下不可用(例如,您在存储槽中不能获得比您的输入更多的汽油),并将每个返回映射到同一事务的同一存储槽中的先前支出。当存储插槽的原始值为非零值时,如果更改为0,有两种可能性:

1.这可能是第一次将存储插槽设置为零。在这种情况下,我们可以将此时间与s store _ reset _ gas access _ list _ storage _ key _ cost的最小开销配对,以首次读取和编辑存储槽。

2.这可能是存储插槽第二次设置为零或设置为零后的情况。在这种情况下,我们可以将此事件与最后一个参数配对,该参数的值从零更改为另一个值,并且其SSTORE_CLEARS_SCHEDULE的气体从返回中移除。

不管第二次或以后SSTORE_CLEARS_SCHEDULE的值是多少,因为该气体大小的返回与相同大小的返回相匹配。这只剩下第一种情况。为了确保储罐上消耗的气体总量为正,我们需要SSTORE _ CLEARS _ SCHEDULElt=SSTORE _ RESET _ GAS _ ACCESS _ LIST _ STORAGE _ KEY _ COST .因此,这个EIP只能将存储_清除_计划减少到这两个成本的总和。

出现这种EIP现象的另一个原因是,在清除未读数据(通常是“无用”数据)后不会有净回报,但在清除已读数据(通常是“有用”数据)后会继续有净回报。

向后兼容性

Return当前仅在事务执行后应用,因此在执行过程中不会影响任何特定的可用调用框架。因此,清除它们不会破坏任何代码的执行,尽管这将使一些应用程序在经济上不可行。

气令牌会变得不值钱。如今,DeFi套利机器人经常使用现有的燃气令牌方案或对其进行定制,以减少链条上的开销,这要归功于重写它们的代码来清除那些不再有用的代码

的gas存储机制的调用。

  然而,完全保留在new=original=0!=current里的返还,以及保留在其他nonzero->zero情况里的一些返还能确保一些接收(和值得)更好的gas开销待遇的关键用例能持续获益。例如,zero->nonzero->zero的存储设置模式保持只需消耗大约100 gas。这些模式包括两个重要实例:

  ➤反重入锁(通常在一个子调用开始前从0变为1,当子调用结束时再变回0)

  ➤ERC20授权与发送(当代币转移得到授权,"授权值"会从零变成非零,然后在代币转移过程中恢复到零)

  对清除存储激励的影响

  对之前关于移除返还的EIP(EIP-3298和EIP-3403)的批评是这些EIP完全消除了把一个值设为零的激励,相当于鼓励用户不要完全清除一个存储槽(即使他们想这么做),哪怕他们想再次使用该存储槽的几率是最小的。

  举一个例子,如果你有一个单位的ERC20代币,且你要送出或卖出你的所有余额,你可以只给出0.999999个单位,把剩余的留下。如果你想在未来重新放入更多该种代币到同一个账户,你仅需要为SSTORE支付5,000 gas(2,100用于读取2,900用于非零变为非零的设置)而不是22,100(20,000用于零到非零值的设置)。今天,这部分的gas会被清除存储获得的15,000 gas返还所抵消,因此,如果你有超过15000/17100=87.7%的把握会再使用这个存储槽,你才会有动力这样做;按照EIP 3298或EIP 3403的设定,抵消激励这部分是不存在的,因此,如果你再次使用该存储槽的可能性是大于0的,设为非零值会更好。

  对于剩下的4,800 gas返还,如果你觉得再次使用某个存储槽的几率大于4800/17100=28.1%,你才有保持该存储槽为非零的动力。这并不是完美的,但它可能高于一般人在清除了他们的全部余额后在同一个地址重新获得同一代币的几率。

  gas返还的上限是所消耗gas量的1/5,这意味着这种返还仅够用于增加处理一个区块所需的存储写入操作量最多为25%,限制了利用这个机制进行以存储写入为重点的拒绝服务攻击。

  测试用例

  EIP-2929的gas开销

  注意,“热”和“冷”存储槽之间是有区别的。这个表展示了EIP-2929下的值,假定所有变动过的存储槽都已经是“热”状态(区别是一次性消耗2,100 gas)。

Capstone凯石资讯:EIP-3529减少gas返还

  减少了的返还后

  如果通过把SSTORE_CLEARS_SCHEDULE从15,000变为4,800(以及去除selfdestruct的返还),减少了部分的返还,下面是是一个对比表。

  安全考虑

  返还对于事务执行时不可见的,因此这不会对事务执行逻辑产生任何影响。

  如果我们不计算后来重置回零的零到非零的SSTORE,在一个区块里执行的最大gas消耗量受到gas limit的限制。不计算这些事可以的,因为如果这样的SSTORE被重置了,存储不会被扩展,客户端实际上不需要调整默克尔树;gas消耗是可以返还的,但客户端对这些操作码的处理通常也会被取消。如果new_value=original_value,客户端应该保证不会进行存储写入;这是自以太坊创世以来的一次谨慎优化,但它现在变得更重要了。

  以上是Capstone凯石资讯的详细报道如需了解更多可在评论区下方留言。

本文内容仅代表作者观点,不代表本站立场,如若转载,请注明出处:https://www.fx220.com/whpt/52960.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注