Solidity面试题更新 2026-08-03

在 Solidity 智能合约中,fallback 函数与 receive 函数在定义、触发条件以及使用场景上有哪些不同之处?

考察说明

考查对 Solidity 特殊函数(fallback 与 receive)的机制理解和应用辨析。

回答思路

  1. 【回答框架 1】receive 函数是 Solidity 0.6.0 引入的专门用于接收纯以太币转账(calldata 为空)的入口,必须使用 receive() external payable 声明,且一个合约最多只能定义一个 receive 函数。
  2. 【回答框架 2】fallback 函数在 Solidity 0.6.0 后也被细化为两种用途:当 calldata 不匹配任何现有函数时触发,或当接收者不是 receive 函数时作为接收以太币的备选入口,声明为 fallback() external [payable]。
  3. 【回答框架 3】核心区别在于触发条件:receive 仅在 calldata 为空且发送的为以太币时触发;fallback 在 calldata 不为空且无匹配函数时触发,或者 calldata 为空但合约未定义 receive 函数时触发。
  4. 【回答框架 4】使用场景上,receive 用于普通转账或 EOA 直接发送以太币的场景;fallback 则用于代理合约中的 delegatecall 转发逻辑,或在 receive 未实现时兼容接收转账。两者都应配合 payable 修饰符并内部实现具体逻辑。
  5. 【回答框架 5】如果合约未定义 receive 且 fallback 也不为 payable,则所有尝试向其发送以太币的交易都会失败,因此需要根据业务需求谨慎设计。
  6. 【关键点 1】receive 仅在 calldata 为空时接收以太币, fallback 处理无匹配函数调用。
  7. 【关键点 2】两者都需要 external payable 修饰,且均不能有返回值或参数。
  8. 【关键点 3】实现时应保持函数简短,避免重入风险和复杂逻辑。
  9. 【关键点 4】代理合约模式中 fallback 用于 delegatecall 转发,receive 用于接收转账。
  10. 【关键点 5】未定义 receive 且 fallback 非 payable 时,合约无法接收以太币。
  11. 【易错点 1】混淆两者触发条件,将 receive 用于非空 calldata 调用是错误的。
  12. 【易错点 2】在 fallback 或 receive 中执行复杂逻辑,增加 gas 消耗和重入风险。
  13. 【易错点 3】只定义 fallback 而忘记 payable 修饰,导致转账失败。