• Solidity智能合约开发 — 4.2-合约的fallback和函数重载


    1.fallback 函数

    每个智能合约有且仅有一个未命名的函数,称为fallback函数,没有参数且没有返回值,可见性必须是 external,且可以是 virtual的(即可以被重载),也可以有修改器 modifier。

    fallback执行条件:

    1. 如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配时(或没有提供调用数据),fallback函数会被执行;
    2. 当合约收到以太时,fallback函数会被执行。

    执行条件1:如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配时(或没有提供调用数据),fallback函数会被执行

    1. // SPDX-License-Identifier: MIT
    2. pragma solidity ^0.8.7;
    3. //基合约实现
    4. contract TestFallback {
    5. string message;
    6. //构造函数,初始化状态变量message
    7. constructor() {
    8. message = "hello";
    9. }
    10. fallback() external {
    11. message = "fallback";
    12. }
    13. //调用此合约中不存在的函数
    14. function testFallback() external returns (bytes memory) {
    15. // 调用不存在的函数getMsgNew()
    16. bytes memory method = abi.encodeWithSignature("getMsgNew()");
    17. (bool success, bytes memory returnData) = address(this).call(method);
    18. require(success, "get fail");
    19. return returnData;
    20. }
    21. //调用此合约中已存在函数,但是没有传递参数
    22. function testFallbackWithNoParam() external returns (bytes memory) {
    23. // 调用已存在的函数setMsg(),未传递参数
    24. bytes memory method = abi.encodeWithSignature("setMsg()");
    25. (bool success, bytes memory returnData) = address(this).call(method);
    26. require(success, "set fail");
    27. return returnData;
    28. }
    29. function getMsg() external view returns (string memory) {
    30. return message;
    31. }
    32. function setMsg(string memory _message) external {
    33. message = _message;
    34. }
    35. }

    上面状态,查看状态变量已修改fallback函数中设置的"fallback"了

    执行条件2:当合约收到以太时,fallback函数会被执行,为了接收以太,fallback 函数必须标记为 payable。 如果不存在这样的函数(如下代码片段),则合约不能通过常规交易接收以太。

    1. fallback() external payable {
    2. }
    1. // SPDX-License-Identifier: MIT
    2. pragma solidity ^0.8.7;
    3. // 包含fallback函数的合约,合约账户能够接收到其它合约转的以太
    4. contract TestFallback {
    5. string message;
    6. //构造函数,初始化状态变量message,同时可向合约账户存款
    7. constructor() payable {
    8. message = "hello";
    9. }
    10. //回退函数,能够为此合约账户接收以太
    11. fallback() external payable {
    12. }
    13. //存款,若部署时忘记存款,可直接调用此函数向合约账户存款
    14. function deposit() external payable {
    15. }
    16. //发送以太
    17. function sendEther(address _addr) external {
    18. bool result = payable(_addr).send(2);
    19. require(result, "send fail");
    20. }
    21. //查看合约账户余额
    22. function getContractBalance() external view returns (uint256) {
    23. return address(this).balance;
    24. }
    25. }
    26. // 不包含fallback函数的合约
    27. contract TestWithoutFallback {
    28. //构造函数,初始化时可向合约账户存款
    29. constructor() payable{
    30. }
    31. //存款,若部署时忘记存款,可直接调用此函数向合约账户存款
    32. function deposit() external payable {
    33. }
    34. //发送以太
    35. function sendEther(address _addr) external returns (bool) {
    36. bool result = payable(_addr).send(2);
    37. return result;
    38. }
    39. //查看合约账户余额
    40. function getContractBalance() external view returns (uint256) {
    41. return address(this).balance;
    42. }
    43. }

    使用未含fallback合约函数向有fallback合约发送以太(转账成功), 使用含fallback合约函数向未含fallback合约发送以太(转账失败)

     2. 函数重载

    智能合约可以具有多个不同参数(类型,数量)的同名函数。这也使用于继承函数。

    1. pragma solidity ^0.4.16
    2. contract A{
    3. // fun1编译有问题
    4. function fun1() returns(uint){
    5. }
    6. function fun1() returns(string){
    7. }
    8. // fun2编译没问题
    9. function fun2(uint name){
    10. }
    11. function fun2(){
    12. }
    13. // fun3编译没问题
    14. function fun3(uint name){
    15. }
    16. function fun3(uint8 name){
    17. }
    18. }

    需要注意的是,返回参数不作为重载解析的依据。

  • 相关阅读:
    使用spark-submit工具提交Spark作业
    算法随想录第八天打卡|344.反转字符串,541. 反转字符串II, 卡码网:54.替换数字, 151.翻转字符串里的单词,卡码网:55.右旋转字符串
    深度学习到智能小车(1)深度学习框架
    jvm学习
    神州三层交换机DHCPv6中继服务配置
    计算机毕业设计(42)java小程序毕设作品之小说电子书阅读小程序系统
    PCB线路板塞孔工艺的那些事儿~
    网关概念及java项目中用使用网关场景
    Docker的常用命令||Docker是个流行的容器化平台,它允许你打包、分发和运行应用程序。
    C语言——1.入门须知
  • 原文地址:https://blog.csdn.net/qincheng168/article/details/128070744