Solidity

當方法不存在時呼叫的回退函式的氣體限制是多少?

  • November 15, 2020

根據文件,不匹配的函式標識符將觸發回退函式。那麼,如果有人使用“thisMethodDoesntExist()”呼叫我的合約會發生什麼,回退是否會像使用send/觸發時一樣具有 2300 的限制transfer,或者它是否會通過呼叫方法(例如)產生氣體.call.value

令人驚訝的是,沒有,官方文件確實對此也不清楚。

因此,這裡有一個簡短的測試,用於列印回退功能開始時剩餘的氣體:

Solidity 合約:

pragma solidity 0.6.12;

interface Interface0 {
   function thisMethodDoesntExist() external;
}

contract Contract1 {
   // note that prior to solidity 0.6.0, you need to replace `fallback` with `function`
   fallback() external payable {
       string memory message;
       uint256 x = gasleft();
       while (x > 0) {
           message = string(abi.encodePacked(uint8(x % 10 + 48), message));
           x /= 10;
       }
       revert(message);
   }
}

contract Contract2 {
   function test(Interface0 contract1) external {
       contract1.thisMethodDoesntExist();
   }
}

松露 5.x 測試:

const Contract1 = artifacts.require("Contract1");
const Contract2 = artifacts.require("Contract2");

contract("test", (accounts) => {
   it("test", async () => {
       contract1 = await Contract1.new();
       contract2 = await Contract2.new();
       try {
           await contract2.test(contract1.address);
       }
       catch (error) {
           console.log(error.message);
       }
   });
});

該測試的列印輸出是:

VM Exception while processing transaction: revert 9328773 -- Reason given: 9328773

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