为啥我不能使用这个 transferEther 函数将 Ether 发送到智能合约?
Posted
技术标签:
【中文标题】为啥我不能使用这个 transferEther 函数将 Ether 发送到智能合约?【英文标题】:Why can't I use this transferEther function to send Ether to the smart contract?为什么我不能使用这个 transferEther 函数将 Ether 发送到智能合约? 【发布时间】:2021-08-28 20:52:49 【问题描述】:我将这段代码输入到 Remix IDE 中,作为 ReceivedEther.sol,一个独立的智能合约。
我已经使用 MetaMask 将 0.02 Ether 转移到智能合约。
当我检查智能合约的余额时,它返回 200000000000000000,正如预期的那样。
但是,如果我尝试使用 transferEther 函数并输入一个小于此值的数字(例如,0.005 ETH 或 50000000000000000 作为金额),则无法使用 MetaMask。
当 MetaMask 提示我时,它从来没有那个数量。这是 0 ETH 和 0.00322 汽油费(或任何汽油)。基本上它总是将 ETH 的数量设置为 0,并且只收取费用。
为什么我不能在带有 MetaMask 的 Remix IDE 中使用此功能转移一定数量的 ETH?
pragma solidity ^0.8.0;
contract ReceivedEther
function transferEther(address payable _recipient, uint _amount) external returns (bool)
require(address(this).balance >= _amount, 'Not enough Ether in contract!');
_recipient.transfer(_amount);
return true;
/**
* @return contract balance
*/
function contractBalance() external view returns (uint)
return address(this).balance;
【问题讨论】:
【参考方案1】:您的代码将 ETH(在 _amount
变量中声明)从智能合约发送到 _recipient
。所以它不需要发送任何 ETH 来执行transferEther()
函数。
如果你想让你的合约接受 ETH,接受它的函数(或一般的fallback()
或receive()
函数)需要标记为payable
。
例子:
pragma solidity ^0.8.0;
contract ReceivedEther
receive() external payable // note the `payable` keyword
// rest of your implementation
然后你可以将任意数量的 ETH 发送到智能合约地址(无需指定要执行的任何函数)。
在https://docs.soliditylang.org/en/v0.8.5/contracts.html#receive-ether-function查看更多信息
如果您想从 Remix IDE 中预填充 MetaMask 中的金额,您可以使用“部署和运行事务”选项卡中的“值”输入。
【讨论】:
以上是关于为啥我不能使用这个 transferEther 函数将 Ether 发送到智能合约?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能使用 jquery 访问 ajax 拉取的内容 [重复]
为啥数组会引起nvlink警告:入口函数的堆栈大小不能静态确定