实用指南:合约收款方式,转账与问题安全

合约收款方式

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()
posted @ 2025-08-09 12:28  wzzkaifa  阅读(7)  评论(0)    收藏  举报