solidity第九课——事件与继承

这篇具有很好参考价值的文章主要介绍了solidity第九课——事件与继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来到基础课程中的难点与重点课,事件与继承。

一,事件

事件是合约区块链通讯的一种机制。应用“监听”某些事件,并作出反应。solidity中的事件具有两个特点:

1.响应,应用程序(ether.js)可以通过RPC接口订阅和监听这些事件,并在前端做出反应。

2.经济,事件是EVM上比较经济的存储数据的方式。

以代币ERC20合约实例一般格式为:

event Transfer(address indexed from, address indexed to, uint256 value);

我们可以看到,Transfer事件共记录了3个变量fromtovalue,分别对应代币的转账地址,接收地址和转账数量。同时fromto前面带着indexed关键字,每个indexed标记的变量可以理解为检索事件的索引“键”,在以太坊上单独作为一个topic进行存储和索引,程序可以轻松的筛选出特定转账地址和接收地址的转账事件。每个事件最多有3个带indexed的变量。每个 indexed 变量的大小为固定的256比特。事件的哈希以及这三个带indexed的变量在EVM日志中通常被存储为topic。其中topic[0]是此事件的keccak256哈希,topic[1]topic[3]存储了带indexed变量的keccak256哈希。

value 不带 indexed 关键字,会存储在事件的 data 部分中,可以理解为事件的“值”。data 部分的变量不能被直接检索,但可以存储任意大小的数据。因此一般 data 部分可以用来存储复杂的数据结构,例如数组和字符串等等,因为这些数据超过了256比特,即使存储在事件的 topic 部分中,也是以哈希的方式存储。另外,data 部分的变量在存储上消耗的gas相比于 topic 更少。我们可以在函数里释放事件。在下面的例子中,每次用_transfer()函数进行转账操作的时候,都会释放Transfer事件,并记录相应的变量。

    // 定义_transfer函数,执行转账逻辑
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) external {

        _balances[from] = 10000000; // 给转账地址一些初始代币

        _balances[from] -=  amount; // from地址减去转账数量
        _balances[to] += amount; // to地址加上转账数量

        // 释放事件
        emit Transfer(from, to, amount);
    }

二,继承

这里介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰关键词(modifier)和构造函数(constructor)的继承。继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的语言可以继承。

virtual:父合约里的函数,如果希望子合约重写,需要加上virtual关键字。

override:子合约重写了父合约中的函数,需要加上override关键字。

来看一串代码吧!

contract Doge{
    function catchphrase() public returns(String){
        return "So Wow cryptoDoge";
        }
}

contract BabyDoge is Doge{
    function anotherCatchphrase() public returns(String){
        return "Such Moon BabyDoge";
    }
}

由于BabyDoge是从Doge那里继承来的。意味着当你编译和部署了BabyDoge,它将可以访问catchphrase()和anotherCatchphrase()和其他我们在Doge中的其他公共函数,用继承逻辑表达子类。

solidity中的modifier同样可以继承,用法和函数继承类似,在相应的地方加virtual和override关键字即可。

contract Base1 {
    modifier exactDividedBy2And3(uint _a) virtual {
        require(_a % 2 == 0 && _a % 3 == 0);
        _;
    }
}

contract Identifier is Base1 {

    //计算一个数分别被2除和被3除的值,但是传入的参数必须是2和3的倍数
    function getExactDividedBy2And3(uint _dividend) public exactDividedBy2And3(_dividend) pure returns(uint, uint) {
        return getExactDividedBy2And3WithoutModifier(_dividend);
    }

    //计算一个数分别被2除和被3除的值
    function getExactDividedBy2And3WithoutModifier(uint _dividend) public pure returns(uint, uint){
        uint div2 = _dividend / 2;
        uint div3 = _dividend / 3;
        return (div2, div3);
    }
}

构造函数的继承:

子合约有两种方法继承父合约的构造函数。举个简单的例子,父合约A里面有一个状态变量a,并由构造函数的参数来确定:

// 构造函数的继承
abstract contract A {
    uint public a;

    constructor(uint _a) {
        a = _a;
    }
}

1.在继承时声明父构造函数的参数,例如:contract B is A(1)

2.在子合约的构造函数中声明构造函数的参数,例如:

contract C is A {
    constructor(uint _c) A(_c * _c) {
    }
}

调用父合约的函数

子合约有两种方式调用父合约的函数,直接调用和利用super关键字。

1.直接调用:格式为父合约.函数名()

2.super关键字:子合约可以利用super.函数名()来调用最近的父合约函数。solidity继承关系按声明时从右到左的顺序。文章来源地址https://www.toymoban.com/news/detail-565990.html

function catchphraseSuper() public{
    super.__()
}
        

到了这里,关于solidity第九课——事件与继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Chatgpt4 教学】 NLP(自然语言处理)第九课 朴素贝叶斯分类器的工作原理 机器学习算法

    我在起,点更新NLP自然语言处理==》《 王老师带我成为救世主 》 为啥为它单独开章,因为它值得,它成功的让我断了一更,让我实践了自上而下找能够理解的知识点,然后自下而上的学习给自己的知识升级,将自己提升到能够解决当前遇到的问题的水平。 (1)--------------

    2023年04月15日
    浏览(35)
  • Solidity极简入门#13. 继承

    这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor)的继承。 继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的编程,也支持继承。 规则

    2024年02月13日
    浏览(18)
  • C++从入门到精通 第九章(继承和多态)【下】

    (1)一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同的对象服务,这就是多态性。 (2)在C++中,多态性可分为编译时的多态性(静态多态)和运行时的多态性(动态多态),编译时的多态性是通过函数重载和模板体现的,运行时的多态性是

    2024年02月21日
    浏览(30)
  • 【SQL 必知必会】- 第九课 汇总数据

    目录 聚集函数          AVG()函数         只用于单个列         COUNT()函数         COUNT()函数有两种使用方式:         MAX()函数         对非数值数据使用MAX()         MIN()函数         对非数值数据使用MIN()         SUM()函数         在多

    2023年04月09日
    浏览(40)
  • C语言第九课------------------数组----------------C中之将

            作者前言                    作者介绍 :           作者id: 老秦包你会 , 简单介绍:              喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨                                 个人主页::小小

    2024年02月15日
    浏览(30)
  • 从零实战SLAM-第九课(后端优化)

     在七月算法报的班,老师讲的蛮好。好记性不如烂笔头,关键内容还是记录一下吧,课程入口,感兴趣的同学可以学习一下。 ------------------------------------------------------------------------------------------------------------------------------- 后端的目标:从带噪声的数据估计内在状态——状

    2024年02月12日
    浏览(29)
  • 图解==>渗透测试KAILI系统的基本操作(第九课)

    渗透测试KAILI系统的安装环境(第八课)-CSDN博客 第一部分  认识KAILI操作系统的使用 以2022年版本为例

    2024年02月07日
    浏览(29)
  • 高效的敏捷测试第九课 ATDD、需求分析、需求评审和设计评审

    第20讲:没有 ATDD,就没有用户故事的可测试性 从这一讲开始,我们就进入了第 4 部分的学习: 测试左移更体现敏捷测试的价值 。因为敏捷更提倡团队对质量负责、预防缺陷胜于发现缺陷,这两点就意味着我们要构建出高质量的产品,把质量构建推向源头——需求,把测试活

    2023年04月23日
    浏览(72)
  • 孩子都能学会的FPGA:第九课——多字节数据的发送和接收

    (原创声明:该文是 作者的原创 ,面向对象是 FPGA入门者 ,后续会有进阶的高级教程。宗旨是 让每个想做FPGA的人轻松入门 , 作者不光让大家知其然,还要让大家知其所以然 !每个工程作者都搭建了全自动化的仿真环境,只需要双击 top_tb.bat 文件就可以完成整个的仿真(前

    2024年02月04日
    浏览(44)
  • 区块链入门系列文章—solidity中的HelloWord

    本系列教程将从零开始记入笔者学习区块链的过程,欢迎批评指正。 Solidity 的代码都涵盖在智能合约里面. 一个智能合约就是以太坊应用的最小单元, 所有的变量和函数都属于一个智能合约, 它是你所有应用的起点。 代码如下(示例): pragma solidity ^0.4.19; 0.4.19代表的是你使

    2024年02月02日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包