Contract-Design

合約可以代替消息發送者支付gas嗎?

  • October 24, 2019

契約是否有可能支付因契約被呼叫而產生的 gas 費用(或部分費用)?或者消息的發送者無論如何都要支付由此產生的gas費用?

目前發起交易的使用者必須支付費用。然而,Serenity 可能會啟用“契約支付”計劃。(請參閱此處的 Vitalik 部落格文章)一種可能的解決方法是退還發件人的契約,但這仍然需要使用者持有一些 Ether,並且可能允許惡意方反複呼叫契約以耗盡其資金。

不,零乙太幣的發送者不能“要求”合約支付 gas 費用。 零乙太幣的發件人甚至無法發送交易。

更多細節:交易的發送者必須有足夠的氣體來支付交易的執行。甚至在合約被呼叫之前就需要這種氣體。一旦滿足 gas 要求(這樣交易就可以完全執行而不會耗盡 gas),被呼叫的合約可以向發送者發送合約持有的任何數量的資金:最終的行為是發送者最終可以獲得比他們更多的乙太幣開始,但這與支付gas的契約不同。

這就像你可以開車去銀行取錢,但你需要先加油才能開車去銀行:銀行不能在你開車去銀行之前給你發加油錢。

這裡正在討論可以改變這種行為的未來版本(Serenity)。


Solidity 具有gas()語法,如下面的答案之一所述:

contract Gracious {
 function runMe() {
   this.realWork.gas(1000000)();
 }
}

gas()並不意味著使用合約的乙太幣來支付gas。 限制子呼叫 ( ) 獲得gas()的氣體量。realWork如果runMe提供 3,000,000 gas,那麼realWork最多會消耗 1,000,000 gas,這樣任何函式呼叫runMe完成後,都會保證有 2,000,000 gas。如果realWork消耗超過 1,000,000 gas,則立即產生異常,將 3,000,000 gas 全部支付給礦工,並恢復交易。

引用自:https://ethereum.stackexchange.com/questions/144