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

And*_*ndy 7 solidity

Solidity 最近的变化将回退函数格式从只是 function() 更改为 fallback(),这对于初学者来说非常好理解发生了什么,但是我有一个问题是关于编译器在我实现时给我的建议后备。

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

pragma solidity ^0.6.1;

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

    fallback() payable external {
        _balance[msg.sender] += msg.value;
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但编译器建议:

Warning: This contract has a payable fallback function, but no receive ether function.
Consider adding a receive ether function.
Run Code Online (Sandbox Code Playgroud)

接收以太函数是什么意思?我试着查了一下,我能找到的很多例子只是另一个后备函数。

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

Far*_*asi 20

根据 Solidity 0.6.0 版本,我们有一个重大更改。\n通常称为 \xe2\x80\x9cfallback 函数\xe2\x80\x9d 的未命名函数被分成使用 Fallback 关键字定义的新后备函数和使用 receive 关键字定义的接收以太函数。\n如果存在,只要调用数据为空(无论是否接收到以太币),就会调用接收以太币函数。此函数是隐式付费的。\n当没有其他函数匹配时,将调用新的后备函数(如果接收以太函数不存在,则这包括具有空调用数据的调用)。您可以将此功能设为付费或不付费。如果它是不可支付的,那么与发送值的任何其他功能不匹配的交易将被恢复。如果您遵循升级或代理模式,则只需实现新的后备功能。

\n\n

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

\n


Tho*_*ena 11

作为对已接受答案的补充,您应该如何定义未命名的回退接收函数来解决此错误:

contract MyContract {

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

    receive() external payable {
        // custom function code
    }
}
Run Code Online (Sandbox Code Playgroud)