ethereum - 为什么我的提现功能会消耗无限的气体?这是一个相当简单的功能
问题描述
这是我的第一个 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 用完了。是因为这个警告吗?
解决方案
更新
如果你想在不调用任何函数的情况下将以太币发送到合约,则需要在该合约中有一个后备函数。
在合约中添加这个函数:
function () external payable {}
代码看起来不错。
实际运行您的代码时,我也没有遇到任何问题。有时错误消息并不准确。也许你用价值来调用withdraw?
您可以使用remix来测试它。
推荐阅读
- swift - DocumentId 包装器无法正常工作
- regex - 带有动态热字串模块的自动热键变量分配
- google-analytics-api - Google Analytics 4 (GA4) - Analytics Data API - When will this be out of Alpha, Beta?
- javascript - CSP error while serving with express (with helmet) an app created with create-react-app
- r - R : How can I remove singletons within tidyverse groups across all columns of my dataframe?
- google-sheets - 尝试创建共享特定信息的自定义流程
- python - pyinstaller 制作的 exe 在调用 matplotlib 时崩溃
- javascript - 删除物品购物车角度
- tabulator - 将 2 个昏暗数组中的数据加载到制表器中?
- c# - 尝试 Web API Dynamics 365 CRM - 403-禁止错误