Solidity语言中关于回退函数的定义:

  • 回退函数是一个不接受任何参数也不返回任何值的特殊函数;
  • 如果在对合约的调用中,没有其它函数与给定的函数标识符匹配时,回退函数会被调用;
  • 每当合约接收到以太币,且没有 receive 函数时,回退函数会被调用;
  • 一个合约中最多可以有一个回退函数。

Receive函数

Receive是一个接收以太币函数,一个合约中最多可以有一个 receive 函数。在对合约转账时会执行 receive 函数,例如通过 transfer()send()call()。如果 receive 函数不存在,那么 fallback 回退函数会被调用。receive 函数的声明语法如下:

receive () external payable { ... }

Receive函数没有 function 关键字,没有参数也没有返回值,且必须是 external 可见性(允许外部合约调用)并具有 payable 可支付属性。

Fallback函数

回退函数的声明语法如下:

fallback () external [payable]

其中:

  • 回退函数没有 function 关键字;
  • 回退函数必须是 external 可见性,即允许被外部合约调用;
  • 如果回退函数需要接收以太币,则必须标记为 payable 关键字。

Fallback函数与Receive函数的区别是:Receive函数只在合约转账时调用,而Fallback函数除了可以在合约转账时调用外,在合约没有函数匹配或需要向合约发送附加数据时,也调用Fallback函数。

合约例子

下面是一个合约例子,用来演示回退函数的声明与用法。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;// 回退函数调用合约
contract Test {uint public x;// 发送到这个合约的所有消息都会调用此函数(因为该合约没有其它函数)。// 向这个合约发送以太币会导致异常,因为 fallback 函数没有 `payable` 修饰符fallback () external { x = 1; }
}// 这个合约会保留所有发给他的以太币,无法返还
contract TestPayable {uint public x;uint public y;// receive函数// 纯转账调用这个函数receive () external payable { x = 1; y = msg.value; }// fallback函数// 除纯转账外所有调用都调用这个函数fallback () external payable { x = 2; y = msg.value; }// 取合约余额function getBalance() public view returns(uint) {return address(this).balance;}
}// 调用合约
contract Caller {// call Testfunction callTest(Test test) public {// 函数调用(bool success, ) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));require(success);// 以太币转账(交易会失败)payable(address(test)).transfer(1 ether);}// call TestPayablefunction callTestPayable(TestPayable test) public payable {bool success;// 以太币转账 test.x = 1, test.y = 1(success, ) = payable(address(test)).call{value: msg.value}("");require(success);// 函数调用 test.x = 2, test.y = 0(success, ) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));require(success);// 以太币转账+函数调用 test.x = 2, test.y = 1(success, ) = address(test).call{value: msg.value}(abi.encodeWithSignature("nonExistingFunction()"));require(success);}
}

合约执行

我们在Remix中编译、部署和运行这个合约例子。

1. 执行callTest()函数:

调用一个不存在的函数,输出结果如下图:

2. 执行callTestPayable()函数:

调用以太币转账,输出结果如下图:

调用一个不存在的函数,输出结果如下图:

调用一个不存在的函数并附加以太币转账,输出结果如下图:

以太坊Solidity语言的Receive函数和Fallback回退函数详解相关推荐

  1. 以太坊solidity智能合约-生成随机数

    Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...

  2. 【重磅推荐】基于truffle-contract库实现的以太坊solidity合约调用案例(注:web3.js切勿和truffle-contract库同时使用,否则报错,无法修复!)

    1.一个基于truffle-contract库实现的以太坊solidity智能合约调用案例! 2. 注意:truffle-contract库和web3.js使用nodej或import同时导入转码的时 ...

  3. 【区块链】以太坊Solidity编程:合约调用与web3.js

    以太坊Solidity编程:合约调用与Web3.js 合约部署方法 合约的编译 使用浏览器编译器Remix 使用truffle编译,目前是最常用的编译方式 Solc或者Web3.js编译合约,使用相对 ...

  4. 以太坊solidity迁移flow cadence指南11 ---NFT盲盒应用

    NIST Warning:阅读本文,需要至少幼儿园中班数学水平,要能数到10!对那些只会1以内加法的码农,请在有经验的码农陪同下观看本文. 背景知识 本节主要介绍cadence随机数在盲盒中的应用. ...

  5. 以太坊Solidity发布0.8.3版本

    官方消息,以太坊Solidity发布0.8.3版本.官方表示,一个错误修复版本,修复了优化器如何处理Keccak256操作码的一个重要错误.此外,它还包括对优化器的两个改进. 文章链接:https:/ ...

  6. 【区块链 | Solidity】以太坊Solidity如何实现海量空投代币?

    以太坊Solidity如何实现海量空投代币? 1. 摘要 通证token项目启动时,短期内繁荣生态,要舍得给粉丝们打币,把利益分出去.本文聚焦在技术层面,实现如何快速完成TOKEN海量空投,既要节约时 ...

  7. 区块链用哪种语言 Java_区块链开发用什么语言呢?区块链与编程语言的关系详解...

    原标题:区块链开发用什么语言呢?区块链与编程语言的关系详解 区块链的概念就随着比特币的大热开始逐渐进入公众视野,比特币的拥有者为了使其创造更高的财富,开始疯狂炒作,因而引发购买比特币大浪潮.然而等到比 ...

  8. time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解

    今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...

  9. C语言0长度数组(可变数组/柔性数组)详解

    CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

最新文章

  1. llinux基本操作
  2. 程序员的算法课(15)-分治法获取文件中出现频次最高100词
  3. Bootstrap 警告框插件Alert
  4. 5G(2)---NR协议栈及功能1 - 总体架构与物理层
  5. Android开发相关操作
  6. [知乎] 端游、手游服务端架构演变
  7. redis 判断存在性_一口气说出四种幂等性解决方案,面试官露出了姨母笑~
  8. GB18030:蒙文字符方向为什么转了90度
  9. Qt 局域网聊天工具
  10. wincc嵌入式excel报表 该报表系统能够读取WINCC中历史归档数据,产生出EXCEL报表文件,同时在画面中EXCEL控件实时显示
  11. python空气质量等级判断_空气质量等级的判定
  12. 【蓝桥杯选拔赛真题13】Scratch接苹果游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
  13. linux右箭头符号,Linux Shell编程(1) - Bash 的基本功能:别名、快捷键、历史命令、输出重定向、管道符、Shell中特殊符号......
  14. 明天(10分)C语言
  15. setTimeout的隐藏小知识
  16. Android字体加粗
  17. Halcon 3D点云和深度图的相互转化
  18. 软件测试有哪些常用的测试方法?
  19. 2021-10-02
  20. 爬取东方财富网站股票信息每天运行都是同步网站更新的

热门文章

  1. android id变化,命令行修改Android id
  2. c语言斐波纳契数列判断素数,求斐波那契数列和素数
  3. VxWorks下一种解决Telnet 23端口的挂住方法
  4. 214. 最短回文串
  5. 日本瑞萨电子考虑暂时停产以应对半导体需求波动
  6. JavaScript + DOM
  7. 软文怎么写比较吸引人?写软文应注意什么
  8. Java中List初始化
  9. 1.goldeye百个靶机渗透(精写-思路为主)
  10. sql timestep 秒数后6位_被央视批评后仍不悔改?如今带6位助理30个保镖出门!网友:气派...