Transactions

交易能否成功結束(即不恢復狀態)但其中的一些“痕跡”耗盡了氣體?

  • March 24, 2018

這筆交易:https ://etherscan.io/tx/0xfcf6acee992a6562aeb641fe830b93a6e6c3be9080eb3842909137824d6a7881有一條奇怪的消息,我今天首先註意到:

Although one or more errors occurred [Out of gas] contract execution completed

如果我使用 EtherScan 的 API 檢索交易,EtherScan 不會將其報告為錯誤交易(而且,我認為這不是錯誤交易)。如果我通過從本地節點拉取交易痕跡來查看交易痕跡,許多痕跡會報告“氣體不足”。

我的印像是,如果交易的任何部分用完了 gas,整個交易都會恢復。

**問:**這怎麼可能?這裡發生了什麼?這很常見嗎?

**注意:**如果您提供簡單的 Solidity 範例來說明這種情況如何發生,我將更有可能接受答案。

CALL是的,如果對另一份契約作出a,就會發生這種情況。只有一部分gas被轉發,因此該呼叫可能會耗盡gas。如果“父級”在失敗時沒有恢復CALL,則主事務可以成功,而由於氣體不足錯誤導致呼叫失敗。

這是如何發生的一個例子。(打電話A.forward(addressOfB)。)

pragma solidity ^0.4.21;

contract A {
   function forward(address to) public payable {
       to.send(msg.value); // only forwards 2300 gas
                           // returns false due to out of gas error
   }
}

contract B {
   uint256 foo;

   function () public payable {
       foo = 3; // not enough gas to SSTORE
   }
}

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