实用指南:合约收款方式,转账与问题安全
合约收款方式
payable修饰符
function funcName() public payable() {
}
receive() 函数
用途
当合约收到纯 ETH 转账(例如 address(this).transfer() 或 address(this).send())且没有调用数据(data为空)时,会调用 receive() 函数。
语法
receive() external payable { // 收款逻辑 }
external:只能被外部调用。payable:允许接收 ETH。不能有参数,也不能返回值。
每个合约只能有一个
receive()函数。
使用场景
contract MyContract {
event Received(address sender, uint amount);
receive() external payable {
emit Received(msg.sender, msg.value);
}
}
fallback() 函数
用途
当调用合约函数时,找不到对应函数签名
或者调用时带有数据,但合约中没有
receive()函数可调用
会触发 fallback() 函数。
语法(两种)
1. 允许收款:
fallback() external payable { // fallback 收款逻辑 }
2. 不收款,仅响应错误调用:
fallback() external { // fallback 非 payable,不能接收 ETH }
使用场景
contract MyContract {
event FallbackCalled(address sender, uint amount, bytes data);
fallback() external payable {
emit FallbackCalled(msg.sender, msg.value, msg.data);
}
}
receive vs fallback 对比总结
| 特性 | receive() | fallback() |
|---|

浙公网安备 33010602011771号