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