繁体   English   中英

Solidity Fallback Function Gas 限制

[英]Solidity Fallback Function Gas Limit

我对使用 Remix IDE 的 Solidity 中的回退 function 有点困惑,据我所知,回退 function 仅限于 2300 gas。 但是,当我使用 Remix 中的“交易”按钮调用回退 function 时,即使它使用了超过 2300 gas,它也不会失败。

// let anyone send ether to the contract
fallback() external payable { 
    require(msg.data.length == 0);
}

我是否误解了回退函数的工作原理,以及当我希望用户能够将 Ether 发送到合约时,我的回退实现是否安全? 我还检查了数据的长度,以确保 function 没有被用于其他目的。

在最坏的情况下,如果 payable fallback function 也被用来代替 receive function,它只能依赖 2300 gas 可用(请参阅 receive Ether function 以获得对此含义的简要描述)。

资料来源: https://docs.soliditylang.org/en/v0.8.17/contracts.html#fallback-function

回退 function 本身没有限制。 但如果它是通过transfer()本机 function 从另一个合约调用的,则应用该限制。

示例:如果您直接调用fallback() ,即使它消耗了超过 2300 gas,它也会成功。 如果您通过transfer() function 调用它,它会失败并出现“gas 不足”错误,因为它只提供了 2300 个 gas 单位。 注释掉number = 1并且它也将在transfer()中起作用(因为空回退使用少于 2300 gas)。

pragma solidity ^0.8;

contract MyContract {
  uint256 number;

  fallback() external payable {
    number = 1;
  }
}

contract Sender {
  address myContract;

  constructor(address _myContract) {
    myContract = _myContract;
  }

  function invokeFallback() external {
    payable(myContract).transfer(0);
  } 
}

EVM 在这 2 个条件下调用fallback function

  • 合同中不存在的 function 被调用,因为 function 不存在合同正在回退到回fallback function

  • 当合约收到ether币时(如果你在以太币上,只有以太币是本机代币,任何其他代币都不算数) fallback被调用。 这就是为什么我们有payable修饰符。

EVM 提供 2300 gas。 如果fallback被 EVM 调用但它花费超过 2300 gas,则 function 调用将抛出异常并且任何 state 更改将被还原。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM