为啥我不能使用这个 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警告:入口函数的堆栈大小不能静态确定

为啥聚合函数不能放在where后面?

为啥我不能对这个图像使用 getimagesize PHP? [复制]

Qt 101:为啥我不能使用这个类?

为啥我在使用 STL 列表时不能使用这个回文函数?