为什么 Solidity 在我有回退功能时建议我实现接收以太币功能?

Why does Solidity suggest me to implement a receive ether function when I have a fallback function?

Solidity 最近的变化将回退函数格式从 function() 更改为 fallback(),这对于初学者来说非常好理解发生了什么,但我对编译器给出的建议有疑问当我实施这样的回退时。

例如我项目中的一段代码:

pragma solidity ^0.6.1;

contract payment{
    mapping(address => uint) _balance;

    fallback() payable external {
        _balance[msg.sender] += msg.value;
    }
}

一切顺利,但编译器提示:

Warning: This contract has a payable fallback function, but no receive ether function.
Consider adding a receive ether function.

接收以太函数是什么意思?我尝试查找它,我能找到的许多示例只是另一个后备函数。

我使用的是版本 0.6.1+commit.e6f7d5a4

根据 solidity 版本 0.6.0,我们有一个突破性的变化。 通常称为“后备函数”的未命名函数被拆分为一个新的后备函数,该函数使用 fallback 关键字定义,并接收以太函数使用 receive 关键字定义。 如果存在,只要调用数据为空(无论是否接收到以太币),就会调用接收以太币函数。此功能是隐式支付的。 当没有其他函数匹配时,将调用新的回退函数(如果接收以太函数不存在,那么这包括调用空调用数据)。您可以将此功能设为付费或不付费。如果不可支付,则不匹配发送值的任何其他功能的交易将被还原。如果您遵循升级或代理模式,您应该只需要实施新的回退功能。

https://solidity.readthedocs.io/en/v0.6.7/060-breaking-changes.html#semantic-and-syntactic-changes

作为已接受答案的补充,以下是您应该如何定义未命名的 fallbackreceive 函数来解决此错误:

contract MyContract {

    fallback() external payable {
        // custom function code
    }

    receive() external payable {
        // custom function code
    }
}