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

这篇具有很好参考价值的文章主要介绍了Solidity智能合约开发 — 3.2-合约的fallback和函数重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.fallback 函数

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

fallback执行条件:

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

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
 
//基合约实现
contract TestFallback {
    string message;
 
    //构造函数,初始化状态变量message
    constructor() {
        message = "hello";
    }
 
    fallback() external {
        message = "fallback"; 
    }
 
    //调用此合约中不存在的函数
    function testFallback() external returns (bytes memory) {
 
        // 调用不存在的函数getMsgNew()
        bytes memory method = abi.encodeWithSignature("getMsgNew()");
        (bool success, bytes memory returnData) = address(this).call(method);
 
        require(success, "get fail");
        return returnData;
    }
 
    //调用此合约中已存在函数,但是没有传递参数
    function testFallbackWithNoParam() external returns (bytes memory) {
 
        // 调用已存在的函数setMsg(),未传递参数
        bytes memory method = abi.encodeWithSignature("setMsg()");
        (bool success, bytes memory returnData) = address(this).call(method);
 
        require(success, "set fail");
        return returnData;
    }
 
    function getMsg() external view returns (string memory) {
        return message;
    }
 
    function setMsg(string memory _message) external {
        message = _message;
    }
}

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

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

fallback() external payable {
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
 
// 包含fallback函数的合约,合约账户能够接收到其它合约转的以太
contract TestFallback {
    string message;
 
    //构造函数,初始化状态变量message,同时可向合约账户存款
    constructor() payable {
        message = "hello";
    }
 
    //回退函数,能够为此合约账户接收以太
    fallback() external payable {
    }
 
    //存款,若部署时忘记存款,可直接调用此函数向合约账户存款
    function deposit() external payable {
    }
 
    //发送以太
    function sendEther(address _addr) external {
        bool result = payable(_addr).send(2);
        require(result, "send fail");
    }
    
    //查看合约账户余额
    function getContractBalance() external view returns (uint256) {
        return address(this).balance;
    }
}
 
// 不包含fallback函数的合约
contract TestWithoutFallback {
 
    //构造函数,初始化时可向合约账户存款
    constructor() payable{
    }
 
    //存款,若部署时忘记存款,可直接调用此函数向合约账户存款
    function deposit() external payable {
    }
 
    //发送以太
    function sendEther(address _addr) external returns (bool) {
        bool result = payable(_addr).send(2);
        return result;
    }
 
    //查看合约账户余额
    function getContractBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

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

 2. 函数重载

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

pragma solidity ^0.4.16

contract A{
     //  fun1编译有问题
    function fun1() returns(uint){
        
    }
    function fun1() returns(string){
        
    }
    
    
    //  fun2编译没问题
    function fun2(uint name){
        
    }
    function fun2(){
        
    }
    
    //  fun3编译没问题
    function fun3(uint name){
        
    }
    function fun3(uint8 name){
        
    }

}

需要注意的是,返回参数不作为重载解析的依据。文章来源地址https://www.toymoban.com/news/detail-486902.html

到了这里,关于Solidity智能合约开发 — 3.2-合约的fallback和函数重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(33)
  • solidity开发智能合约

    起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity文档:区块链技术-智能合约Solidity编程语言 solidity官方文档: https://solidity-cn.readthedocs.io/

    2023年04月08日
    浏览(67)
  • solidity中的receive(接收)函数和fallback(回退函数)

    目录 前言 1、接收函数(Receive Function) 2、回退函数(Fallback Function) 二、代码示例 1.接收函数(Receive Function) 2.回退函数(Fallback Function) 总结 在Solidity中,接收函数(receive function)和回退函数(fallback function)是两种特殊类型的函数,用于处理合约接收到以太币时的操作

    2024年04月15日
    浏览(25)
  • 区块链2——Solidity智能合约开发

    区块链 索引目录 智能合约是一种以代码形式编写的自动执行合约,它们运行在区块链上。这些合约定义了在特定条件下发生的事件以及相应的行为。 1.1 智能合约结构 版本声明(Version Declaration): 智能合约通常以声明版本开始,指定合约应该使用的Solidity编译器版本。例如

    2024年02月05日
    浏览(45)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(39)
  • solidity智能合约实例开发(2)(解释+注释)——食品溯源

    项目总要求 创建三个角色生产者,分销商,零售商,并分别通过三个角色对产品的生产,分销,零售上链,并且能够分别查出上链的全信息。包括每次交易的时间戳,每次交易的交易名称,每次交易的交易地址,每次交易的食品质量,食品的名称,当前交易的名称,当前交易

    2024年02月06日
    浏览(30)
  • Solidity-在vscode上开发智能合约、本地环境部署

     随后我们需要到该插件的设置中进行相关配置说明  点击进入得到如下界面 这里填写solcjs文件的路径位置,注意包含文件本身的名称 关于solcjs文件需要 nodejs 作为前置 nodejs可以在官网直接进行下载 ,安装很简单直接next到底便可 Node.js (nodejs.org) 安装完成后在cmd小黑窗中使用

    2024年02月06日
    浏览(46)
  • 基于以太坊的智能合约开发Solidity(基础篇)

    参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili (1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意, 合约一旦部署,就会永久存在于区块链上,且不可篡改 ,不过可以销毁) (2)执行完成后,可以得到以

    2024年02月04日
    浏览(45)
  • 以太坊智能合约开发:Solidity语言中的映射

    本文我们介绍Solidity语言中的映射,包括映射的基本定义、语法、映射的变量声明和基本读写操作。并且通过两个智能合约例子演示了映射的定义与基本操作。 Solidity中关于映射的一些定义: 映射以键-值对(key = value)的形式存储数据; 键可以是任何内置数据类型,包括字节

    2024年02月05日
    浏览(40)
  • 基于以太坊的智能合约开发Solidity(事件&日志篇)

    (1)事件用于记录在区块链上的特定活动,“emit ValueChanged(newValue);”语句的作用是触发ValueChanged事件(首先需要声明事件)。 ①触发事件后会生成相应日志,上图黄框就是“emit ValueChanged(newValue);”语句产生的日志,其中“form”指的是触发事件的合约账户。 ②事件主要是供

    2024年02月04日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包