1014 large

浅谈 Call Gas 价格增加对合约的影响

toya · 于 发布 · 814 次阅读

原文: https://www.reddit.com/r/ethereum/comments/57p0bv/a_quick_note_on_how_the_call_gas_cost_increase/

EIP150的一个特点是将每一种类型的调用需要花费的gas从40提升至700。此项gas花费是在内存gas花费以及提供给子合约gas花费基础之上的;例如,你现在用300gas调用一个合约,这时子合约会得到300gas而母合约则需支付340gas(假设没有内存gas花费),分叉之后子合约还是会得到300gas但是这时母合约需要支付1000gas。因此需要提供700gas以下的合约调用没有被影响(除非子合约需要用到一个gas价格被大大增加了的opcode,但是这样的情况特别罕见。)

现在的合约一般使用msg.gas-40来确定给子合约发送多少gas;因为现在调用本身花费40gas,msg.gas-40基本上意味着“给子合约发送尽可能多的gas”。但是,补订之后,msg.gas-40+700 = msg.gas+660 因此母合约全部都会试着给子合约发送过多的gas,不过子合约只是会得到它能得到gas的最大值而不会失败。因此,如果你的应用凭50000gas调用一个合约并且你一直习惯发送一个包含50001gas的交易,现在花费增加到50660,那么你只需要把你交易中的gas向上微调,合约即可再次正常工作。

非线性很糟
有些人问为什么我们要线性的增加gas花费,为什么我们不可以通过二次曲线花费(N个调用支付N二次方的价格)或者给每次交易调用以及自杀的次数设定硬性上限。答案是这是一个非常糟糕的主意,因为它会给一些新类型的攻击打开敞口,会增加合约开发者必须要担心和考虑的
问题的数量。比如,可能会出现调用栈深度极限攻击(这个在EIP 150 63/64法则之后不会再出现)平行类型的攻击,这里攻击者会调用99次,然后把第100个调用发送给受害者的合约,致使受害者的合约意外失败。内存gas花费已经遵从二次曲线,这个已经很烦了因为它意味着无法用一定数量的预算去增加一定数量的内存。我们实际上已经在想办法摆脱奇怪的非线性限制。

  • 暂无回复。