Contract-Design
合約可以代替消息發送者支付gas嗎?
契約是否有可能支付因契約被呼叫而產生的 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 全部支付給礦工,並恢復交易。