solidity中的receive()函数和fallback()函数
1、Receive Ether Function---以太币收发函数
声明方式如下:
receive() external payable {
}
功能:通过合约接收和转发以太币
特点:
(1) 一个合约至多含有一个receive()函数
(2) 没有function关键字
(3) 必须含有payable关键字
(4) 没有参数,没有返回值
(5) 可见性必须声明为external
(6) 允许使用modifier修改器
(7) 该函数通过.send()和.transfer()转发以太币
(8) 若想要让你的contract(即合约账户)接收以太币,在未定义fallback() external payable{}函数时,需实现receive()函数
(9) 在gasLimit允许范围内可执行复杂操作
solidity代码示例如下:
pragma solidity >=0.6.0 <0.9.0;
contract Sink {
event Received(address, uint);
receive() external payable {
emit Received(msg.sender, msg.value);
}
}
2、Fallback Function---回退函数
声明方式如下:
fallback () external [payable]{
}
//或
fallback (bytes calldata input) external [payable] returns (bytes memory output){
}
功能:当合约中没有任何匹配的函数可调用时,调用fallback()函数
特点:
(1) 一个合约至多含有一个fallback()函数
(2) 没有function关键字
(3) payable关键字是可选项,取决于该函数是否需要接收以太币
(4) 该函数可代替receive()函数以实现合约接受转发以太币的功能
(5) 可见性必须声明为external
(6) 允许使用modifier修改器
(7) 在gasLimit允许范围内可执行复杂操作
solidity代码示例如下:
pragma solidity >=0.6.2 <0.9.0;
contract Test {
uint x;
//该合约的fallback函数未定义为payable类型,当遇到转账操作时会发生异常
fallback() external {
x = 1;
}
}
contract TestPayable {
uint x;
uint y;
//回退函数
fallback() external payable {
x = 1;
y = msg.value;
}
//以太币收发函数
receive() external payable {
x = 2;
y = msg.value;
}
}
contract Caller {
function callTest(Test test) public returns (bool) {
(bool success,) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));
require(success);
//结果为:test.x = 1.
// address(test)无法调用.send()函数发送以太币
//因为Test合约中不含有payable类型的fallback函数
address payable testPayable = payable(address(test));
return testPayable.send(2 ether);//此处返回值为false
}
function callTestPayable(TestPayable test) public returns (bool) {
(bool success,) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));
require(success);
//结果为:test.x = 1 , test.y = 0.
(success,) = address(test).call{value: 1}(abi.encodeWithSignature("nonExistingFunction()"));
require(success);
//结果为:test.x = 1 , test.y = 1.
//此处address(test)可以调用.send()函数和.transfer()函数
//因为TestPayable合约中有payable类型的receive()和fallback()函数
(success,) = address(test).call{value: 2 ether}("");
require(success);
// 结果为:test.x = 2 , test.y = 2 .
return true;
}
}
来源(solidity官方英文文档0.8.13):https://docs.soliditylang.org/en/v0.8.13/contracts.html#special-functions

浙公网安备 33010602011771号