Solidity
當方法不存在時呼叫的回退函式的氣體限制是多少?
根據文件,不匹配的函式標識符將觸發回退函式。那麼,如果有人使用“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