为什么 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
作为已接受答案的补充,以下是您应该如何定义未命名的 fallback 和 receive 函数来解决此错误:
contract MyContract {
fallback() external payable {
// custom function code
}
receive() external payable {
// custom function code
}
}
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
作为已接受答案的补充,以下是您应该如何定义未命名的 fallback 和 receive 函数来解决此错误:
contract MyContract {
fallback() external payable {
// custom function code
}
receive() external payable {
// custom function code
}
}