当前位置: 首页 > news >正文

Solidity 金融和支付 2| Fallback

在 Solidity 中,fallback函数是一个特殊的、无名称的函数,用于处理两种特定情况:

  1. 调用合约中不存在的函数;
  2. 直接向合约发送以太币(且没有receive函数时)。

正确理解和使用 fallback 函数对于开发安全、功能完备的智能合约至关重要。

1. Fallback 函数的基本语法

fallback() external [payable] { // 自定义逻辑 }
  • external:必须声明为external,因为 fallback 只能由外部调用触发。
  • payable:(可选):如果希望合约在接收以太币时触发 fallback,需要加上payable关键字;否则,若向该合约发送以太币(且无receive函数),交易会失败。

2. Receive 函数与 Fallback 的关系

Solidity 0.6.0 引入了专门的receive函数,用于纯以太币转账(即调用数据为空)。二者共同构成了合约接收以太币的机制。

Receive 函数

receive() external payable { // 处理纯以太币转账 }
  • 仅在调用数据为空(msg.data长度为 0)时执行。
  • 必须是payable
  • 优先级高于 fallback:如果定义了receive,那么纯以太币转账会调用receive,而不是 fallback。

Fallback 函数

  • 当调用数据不为空且没有匹配的函数时触发。
  • 当调用数据为空且没有receive函数时触发(此时 fallback 必须为payable)。

执行流程总结

  1. 交易带有数据(msg.data.length > 0):
    • 如果数据匹配某个函数 → 执行该函数。
    • 否则 → 执行 fallback(如果存在)。
  2. 交易无数据(msg.data.length == 0,纯以太币转账):
    • 如果存在receive→ 执行receive
    • 否则如果存在payable的 fallback → 执行 fallback。
    • 否则 → 交易失败(revert)。

3. Fallback 的典型用途

  • 代理合约:在代理模式中,fallback 将调用委托给另一个逻辑合约。
  • 接收以太币并记录日志:当合约需要接收以太币时,可在 fallback 中触发事件。
  • 防止意外调用:在不希望合约接收以太币或调用不存在函数时,可以定义一个回退的 fallback(通常直接revert)。
  • 实现钱包或支付合约:允许用户直接向合约转账,触发特定逻辑。

4. 完整示例

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract FallbackExample { event Log(string func, address sender, uint value, bytes data); // 纯以太币转账触发 receive receive() external payable { emit Log("receive", msg.sender, msg.value, ""); } // 调用不存在函数或调用数据非空且无匹配函数时触发 fallback fallback() external payable { emit Log("fallback", msg.sender, msg.value, msg.data); } // 一个普通函数 function foo() external payable { emit Log("foo", msg.sender, msg.value, ""); } }

总结

函数类型触发条件是否必须 payable(若需接收ETH)
receive调用数据为空
fallback调用数据不为空且无匹配函数,或数据为空且无 receive若需接收ETH则必须为 payable

理解 fallback 和 receive 是编写灵活且安全的智能合约的基础,尤其在涉及代理、钱包和接收以太币的场景中。

http://www.jsqmd.com/news/440499/

相关文章:

  • 2026 年旺旺发展前景:食品主业稳盘,渠道升级与产品创新打开增长新空间 - Top品牌推荐官
  • 纳米抗体赋能肿瘤诊疗一体化:开启精准纳米免疫治疗新时代
  • 2026年眼镜批发平台十大推荐|多维度专业测评|客观指南助您优选 - 企业推荐师
  • Java 程序员学习 AI 开发路线图
  • 2026年 钢管厂家推荐排行榜:无缝钢管/A106/镀锌钢管/铸铁钢管/衬塑钢管/滤水钢管/螺旋钢管/焊接钢管/方形钢管,坚固耐用的工业管道专家精选 - 品牌企业推荐师(官方)
  • 2026年3月苏州噪声治理厂家最新推荐榜单:工业降噪、设备隔音、机房减振、空调机组噪声治理、车间设备噪声治理、隔音降噪隔音房优选指南 - 海棠依旧大
  • 园区管理系统推荐|2026趋势洞察:智能管控与高效运维如何选对服务商
  • 【大数据毕设源码分享】基于springboot+Hadoop的宁波旅游推荐周边商城实现与设计(程序+文档+代码讲解+一条龙定制)
  • 2026年角钢厂家推荐排行榜:镀锌角钢/S355J0/AH36/Q355B/5#角钢/S275/Q420/电钢角钢/欧标日标角钢,实力源头工厂精准供应 - 品牌企业推荐师(官方)
  • 【大数据毕设全套源码+文档】基于Hadoop+springboot的宁波旅游推荐周边商城实现与设计(丰富项目+远程调试+讲解+定制)
  • 2026年 钢板厂家推荐排行榜:S355J0/预埋/锰钢/镀锌/冷轧薄板/DC03/深冲/Dc01/dc06/碳钢板,实力源头工厂精选指南 - 品牌企业推荐师(官方)
  • 深入解析:《算法笔记》学习记录-第二章 C/C++快速入门
  • 搜维尔科技:Ti5机器人-建模速度提升30%,Xsens运动控制成功率提升40%以上
  • MAUI项目在Android平台通过U盘实现软件更新
  • Flutter 三方库 cryptography_plus 的鸿蒙化适配指南 - 掌控高保真加密协议、安全脱敏实战、鸿蒙级精密防御专家
  • 省选前突击Linux
  • AI Agent框架探秘:拆解 OpenHands(11)--- Runtime主要组件
  • QPSK调制在AWGN和Rayleigh信道下的误码率和误比特率性能对比(源码+lw+部署文档+讲解等)
  • 深入解析:Linux网络---网络层
  • B4451 [GESP202512 四级] 建造
  • day1-5德语英语b2
  • 逆向工程与二次开发:从一个 Java 大作业项目的改造之旅
  • 基于Simulink模块搭建下4-DPSK通过AWGN下的误码率和误比特率仿真(源码+lw+部署文档+讲解等)
  • 提示工程架构师的AI上下文工程长短期记忆机制设计秘籍大公开
  • 对使用的屏幕的整理
  • 多径衰落信道下OFDM传输信道估计算法误码率比较(源码+lw+部署文档+讲解等)
  • 搜维尔科技:Manus数据手套登录人工智能大会-构建下一代远程操控基础
  • ollama本地模型使用
  • 探索大数据领域数据产品的发展前景
  • BISHI92 【模板】前缀函数(kmp)