以太坊Solidity语言的Receive函数和Fallback回退函数详解
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回退函数详解相关推荐
- 以太坊solidity智能合约-生成随机数
Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...
- 【重磅推荐】基于truffle-contract库实现的以太坊solidity合约调用案例(注:web3.js切勿和truffle-contract库同时使用,否则报错,无法修复!)
1.一个基于truffle-contract库实现的以太坊solidity智能合约调用案例! 2. 注意:truffle-contract库和web3.js使用nodej或import同时导入转码的时 ...
- 【区块链】以太坊Solidity编程:合约调用与web3.js
以太坊Solidity编程:合约调用与Web3.js 合约部署方法 合约的编译 使用浏览器编译器Remix 使用truffle编译,目前是最常用的编译方式 Solc或者Web3.js编译合约,使用相对 ...
- 以太坊solidity迁移flow cadence指南11 ---NFT盲盒应用
NIST Warning:阅读本文,需要至少幼儿园中班数学水平,要能数到10!对那些只会1以内加法的码农,请在有经验的码农陪同下观看本文. 背景知识 本节主要介绍cadence随机数在盲盒中的应用. ...
- 以太坊Solidity发布0.8.3版本
官方消息,以太坊Solidity发布0.8.3版本.官方表示,一个错误修复版本,修复了优化器如何处理Keccak256操作码的一个重要错误.此外,它还包括对优化器的两个改进. 文章链接:https:/ ...
- 【区块链 | Solidity】以太坊Solidity如何实现海量空投代币?
以太坊Solidity如何实现海量空投代币? 1. 摘要 通证token项目启动时,短期内繁荣生态,要舍得给粉丝们打币,把利益分出去.本文聚焦在技术层面,实现如何快速完成TOKEN海量空投,既要节约时 ...
- 区块链用哪种语言 Java_区块链开发用什么语言呢?区块链与编程语言的关系详解...
原标题:区块链开发用什么语言呢?区块链与编程语言的关系详解 区块链的概念就随着比特币的大热开始逐渐进入公众视野,比特币的拥有者为了使其创造更高的财富,开始疯狂炒作,因而引发购买比特币大浪潮.然而等到比 ...
- time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解
今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...
- C语言0长度数组(可变数组/柔性数组)详解
CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...
最新文章
- llinux基本操作
- 程序员的算法课(15)-分治法获取文件中出现频次最高100词
- Bootstrap 警告框插件Alert
- 5G(2)---NR协议栈及功能1 - 总体架构与物理层
- Android开发相关操作
- [知乎] 端游、手游服务端架构演变
- redis 判断存在性_一口气说出四种幂等性解决方案,面试官露出了姨母笑~
- GB18030:蒙文字符方向为什么转了90度
- Qt 局域网聊天工具
- wincc嵌入式excel报表 该报表系统能够读取WINCC中历史归档数据,产生出EXCEL报表文件,同时在画面中EXCEL控件实时显示
- python空气质量等级判断_空气质量等级的判定
- 【蓝桥杯选拔赛真题13】Scratch接苹果游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
- linux右箭头符号,Linux Shell编程(1) - Bash 的基本功能:别名、快捷键、历史命令、输出重定向、管道符、Shell中特殊符号......
- 明天(10分)C语言
- setTimeout的隐藏小知识
- Android字体加粗
- Halcon 3D点云和深度图的相互转化
- 软件测试有哪些常用的测试方法?
- 2021-10-02
- 爬取东方财富网站股票信息每天运行都是同步网站更新的
热门文章
- android id变化,命令行修改Android id
- c语言斐波纳契数列判断素数,求斐波那契数列和素数
- VxWorks下一种解决Telnet 23端口的挂住方法
- 214. 最短回文串
- 日本瑞萨电子考虑暂时停产以应对半导体需求波动
- JavaScript + DOM
- 软文怎么写比较吸引人?写软文应注意什么
- Java中List初始化
- 1.goldeye百个靶机渗透(精写-思路为主)
- sql timestep 秒数后6位_被央视批评后仍不悔改?如今带6位助理30个保镖出门!网友:气派...