首页 > 解决方案 > 为什么我的提现功能会消耗无限的气体?这是一个相当简单的功能

问题描述

这是我的第一个 Solidity 合约,我不知道为什么我的提款功能会消耗无限的气体。当我编译合同时,它会发出警告。

函数 Faucet.withdraw(uint256) 的气体需求高:无限。 如果一个函数的gas需求高于block gas limit,它就不能被执行。请避免在修改大面积存储的函数或操作中出现循环(这包括清除或复制存储中的数组)”

pragma solidity ^0.5.11;

//Our First Contract is a Faucet
contract Faucet
{

//Deposits ethers
 function deposit(uint256 amount) payable public {
     require(msg.value == amount);
    // nothing to do!
}


//Give out ether to anyone who asks
function withdraw(uint256 withdraw_amount) public
{
    if(withdraw_amount <= address(this).balance)
    {
        //Send  the amount to address which requested it
        msg.sender.transfer(withdraw_amount);

    }

}

}

注意:我已经成功部署了合约,但是交易失败了,因为它们的 gas 用完了。是因为这个警告吗?

标签: ethereumsolidityremixmetamask

解决方案


更新

如果你想在不调用任何函数的情况下将以太币发送到合约,则需要在该合约中有一个后备函数。

在合约中添加这个函数:

function () external payable {}

代码看起来不错。

实际运行您的代码时,我也没有遇到任何问题。有时错误消息并不准确。也许你用价值来调用withdraw?

您可以使用remix来测试它。


推荐阅读