实用指南:合约收款方式,转账与问题安全
合约收款方式
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() |
---|