Solidity

如果交易失敗,Gas Fee 會退還嗎?

  • May 9, 2021

當呼叫者進行交易時,我混淆了支付汽油費的規則。

進行交易時需要 gas 費,我知道 require() 是把所有 gas 費返回給呼叫者的保護函式。

智能合約中功能中的所有操作後是否支付了gas費?

那麼,如果 require() 函式放在函式的開頭,並且程式碼根本沒有操作,那是否意味著不需要 gas 費呢?

如果該 require() 語句中的值是假條件,交易因此失敗怎麼辦?

Gas 費是 100% 退還給呼叫者,還是呼叫者在函式中的某些操作生效後需要支付剩餘的 Gas 費?

可以退還來電者所有的gas嗎?

function burn(uint256 _value) public returns (bool success) {
   require(balances[msg.sender] >= _value);
   balances[msg.sender] = balances[msg.sender].sub(_value);
   totalSupply = totalSupply.sub(_value);
   Burn(msg.sender, _value);
   return true;
}

如果在程式碼執行後必須支付gas費,如果caller(msg.sender)在require()條件通過後由於呼叫者賬戶沒有餘額而無法支付gas費怎麼辦?

我懷疑我知道的是否正確。

氣體必須與簽署的交易一起提供。除非提供氣體,否則無法呼叫合約函式。沒有辦法透支帳戶。這就像你車裡的燃料。你需要一些開始,如果有足夠的,你會到達目的地。如果不夠,一切都會停止。

原始碼被編譯成彙編程式碼,任何時候發生任何事情,都會使用 OPCODES。使用 OPCODES 時,gas 是收費的,所以即使第一行是 arequire()和 it’s false,仍然需要大量的 OPCODES 來解包交易數據並評估require()- 所以一些 gas 被燒掉了。

如果gas返回給簽名者,它就是剩餘的gas。這就像給你的油箱加滿油,然後中止你的旅行。您可能在引擎執行時燒毀了一些,但您仍然擁有大部分。

如果在還原所有內容的中止操作之前展開大量處理,則可能大部分氣體已用完。

希望能幫助到你。

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