solidity: fallbak和receive的作用
在Solidity中,fallback
和receive
是特殊的函数,用于处理合约接收以太币的情况。
-
Fallback 函数 (
fallback()
):- 当合约接收到以太币时,如果没有匹配的函数调用或无效的调用,就会触发回退函数。
- 回退函数是合约的默认函数,没有函数名,且不接受任何参数。
- 回退函数通常用于接收以太币、记录日志或执行其他必要的操作。
- 如果合约没有定义回退函数,或者没有匹配的函数调用,发送以太币的交易将被拒绝。
-
Receive 函数 (
receive()
):- Solidity 0.6.0 版本引入了
receive
函数作为接收以太币的标准函数。 receive
函数是一个可选函数,用于接收以太币支付,没有函数名,且不接受任何参数。- 如果合约定义了
receive
函数,它将作为接收以太币的入口点,而不是回退函数。 - 只有在合约没有匹配的函数调用时,才会触发
receive
函数。 - 如果合约没有定义
receive
函数,则会触发回退函数,如果也没有回退函数,则交易将被拒绝。
- Solidity 0.6.0 版本引入了
这些特殊函数的使用场景如下:
- 使用回退函数和接收函数时,合约可以接收以太币支付,并在这些函数内部处理相关逻辑,如更新合约状态、触发事件或与其他合约进行交互。
- 回退函数通常用于处理未知函数调用或在没有匹配函数时接收以太币。
- 接收函数用于规范化合约接收以太币的方式,并提供一个入口点来处理以太币支付。
需要注意的是:
- 在同一个合约中,只能有一个回退函数,但可以有多个接收函数(每个合约只能有一个
receive
函数)。 - 接收函数和回退函数不能接受任何参数。
- 在 Solidity 0.8.0 版本之前,没有
receive
函数,以太币支付仍然通过回退函数处理。
总而言之,fallback
和receive
函数是用于接收以太币支付的特殊函数,使合约能够处理接收以太币时的逻辑,并提供一个标准化的入口点来接收以太币。
写一个测试合约:
contract FallbackLogContract {
event Basiya(string funName, address from, uint256 value, bytes data);
// 通过balance属性来查看余额
function getBalance() external view returns (uint256) {
return address(this).balance;
}
fallback() external payable {
emit Basiya("fallback", msg.sender, msg.value, msg.data);
}
receive() external payable {
emit Basiya("receive", msg.sender, msg.value, "");
}
}
这里定义了recevie和fallbak函数
如果只有fallback函数也能接受以太币,但是会有警告提示需要加上receive,所以其实统一采用receive来接受以太币就好了
如果只有recevie函数,没有fallback函数,是可以的。
转账试试:
总结,recevie/fallback可以接收通过CALLDATA方式的转账