Gas-Price
交易失敗是否退還所有Gas Fee?
function burn(uint256 _value) public returns (bool success) { balances[msg.sender] = balances[msg.sender].sub(_value); totalSupply = totalSupply.sub(_value); Burn(msg.sender, _value); require(balances[msg.sender] >= _value); // fail tx return true; }
執行上述burn函式後,如果最後require()失敗,之前執行程式碼的gas費會全額退還嗎?
氣體消耗是這樣的。分三種情況:
- 假設您將 gas 限制設置為 30 000(這是您在發送交易時預付的最大 gas 量)。假設交易成本為 5000 gas。交易成功。執行所需的 gas 將從您發送的 30 000 gas 中扣除。您將獲得 25 000 汽油。
- 您已將您的 gas 限制再次設置為 30 000。交易成本為 35000 gas。在這種情況下,您發送的全部 30 000 gas 將從您的帳戶中扣除,但交易不會成功,
" Out of gas "
會發生還原。- 你的 gas 限制是 30 000 gas。交易成本也為 30 000 gas,但在函式體的深處有 2 行的需求語句。由於
require()
聲明未得到滿足,事務將恢復。在這種情況下,執行語句之前的所有邏輯所需的gasrequire ()
(相當於10 000 gas)將從您的帳戶中扣除,在這種情況下,僅消耗10 000 gas,剩餘的20 000被發送回到你身邊。在您的特定情況下,
msg.sender
將支付require()
語句之前所有操作的執行費用。如果氣體限制中剩餘的任何額外氣體,該金額將被退還。但是用於計算require()
語句之前的所有邏輯的氣體將被發送到它的礦工並被燒毀。