函数定义、合约与面向对象(以太坊solidity合约)

news2024/11/15 13:48:51

函数定义、合约与面向对象(以太坊solidity合约)

  • 1-函数定义、构造与多态
  • 2-事件日志
  • 3-面向对象特征

1-函数定义、构造与多态

创建合约就是创建类,部署合约就是实例化

合约的方法还支持多态

还能使用第三方的库进行开发

整个合约部署后,函数就是代码的执行单元

https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#structure-functions

函数也是一种类型是值类型

pragma solidity >=0.6.1 <0.7.0;

// function (<parameter types>) {public private internal(默认)|external} [view|pure] [payable] [returns (<return types>)]
// 合约的函数支持多态(函数名称相同,参数类型或者数量不同)
contract FnDemo{
    
    string _name;  // 引用类型 + storage
    uint _age; // 值类型不存在Data Location
    
// 构造函数,合约在部署时自动调用,一般用来初始化状态变量
//deploy部署时,需要输入两个参数
    constructor(string memory name,uint age) public{
        _name = name;
        _age =age;
    }
   
    // private 仅仅在合约内部使用(所以合约部署后无法显示进行调用)
    // constant 0.4的版本使用,没有修改状态变量时可以设置,0.5版本使用View,Pure代替
    // view: 对状态变量(storage),只读但是不能写(状态变量部署会在账本,消耗gas)
    function getAll() private view returns (string storage,uint){
        return (_name,_age);
    }
    
// public: 公共函数(当前、其它、继承的子合约都能调用), 如果参数引用类型必须设置内存变量memory
//从理论上将每个智能合约只能修改自己的状态变量,而不能修改别人的,即自己的storage不能让别人修改,所以设置为memory 
// pure: 对状态变量不可读也不可写,在此函数中既没有操作状态变量,也没有读取

    function getAll(string memory name,uint age) public pure returns (string memory,uint){
         return (name,age+1);
    }
    
    // internal 受保护的函数,只能当前合约或者子合约调用
    // payable: 说明此方法有转账的操作,后面金额转账的操作比较多
    function getAll(string storage name) internal{
         getAll();  // 调用自己的private合约
    }
    
}

在这里插入图片描述

2-事件日志

Solidity无打印功能,调试不便

使用事件event和log日志

https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#event

通过事件写入日志

间接使用事件实现打印的功能

pragma solidity >=0.6.1 <0.7.0;

// solidity没有print,console.log方法,因此增加了调试的难度 ==> event + log来解决

contract LogTest{
    // 事件名称采用驼峰命名法
    event LogData(string,uint);
    
    event LogData(string,string);
    
    function show(string memory name,uint age) public{
        age = age + 1;// 此处实现业务操作
        emit LogData(name,age);
    }
    
    function show(string memory name,string memory age) public{
        emit LogData(name,age);
    }
}

在这里插入图片描述

这些日志也会随着合约的调用存储到分布式账本

如支付宝转账有备注,此日志也具有此功能,后续进行调用转账函数的时候,可以写日志的,一旦交易成功会跟随数据一起写入分布式账本中,交易往来

单机一个区块
有交易,合约交易(合约的创建、调用、销毁(以后合约不能再使用))
https://cn.etherscan.com/txsInternal?block=12548200

一般众筹完毕不再接受新的众筹金币,合约就会销毁

在这里插入图片描述
在这里插入图片描述

只要每笔交易确认,当前交易日志就会写到分布式账本(测试时解决打印难题)

3-面向对象特征

https://learnblockchain.cn/docs/solidity/contracts.html

Solidity多继承,python单继承

抽象合约,函数只有声明没有实现,交给自合约实现,抽象合约无法编译

https://learnblockchain.cn/docs/solidity/contracts.html#abstract-contract

库在后续课程实战调用第三方的库

好的需求,可维护,设计

pragma solidity >=0.6.0 <0.7.0;

// 手机OOP实现

// 每个手机都有一样的开机与关机功能

// 每个手机都有闹钟功能,但不同品牌的手机闹钟设计不同

// 品牌手机实现Wifi与BlueTooth,但有些老年机只实现Wifi或者BlueTooth.

interface Wifi{
    // external 说明当前函数只能被外界调用
    function wifi() external returns (string memory);
}

interface BlueTooth{
    // external 说明当前函数只能被外界调用
    function blue() external returns (string memory);
}


abstract contract Phone{  // 手机的父类(完成开机关机子)

    event ShowCall(string);//事件方式调用手机开机功能
    
    function start() internal{
        emit ShowCall('调用手机开机功能');
    }
    
    function close() internal{
        emit ShowCall('调用手机关机功能');
    }
    
    function alarm() virtual internal;//只有声明无实现(闹钟函数只能设计成抽象,每台手机对闹钟的实现各有不同,virtual 代表函数为抽象函数,solidity6)
}

继承抽象合约phone
contract Mi is Phone,Wifi{
    
//internal 不能被外界访问
    function alarm() internal override(Phone){
        emit ShowCall('小米实现闹钟功能');
    }
    
    function wifi() external override(Wifi) returns (string memory){
        return "小米实现wifi功能";
    }
}

contract Iphone is Phone,Wifi,BlueTooth{
    
    function alarm() internal override(Phone){
        emit ShowCall('华为实现闹钟功能');
    }
    
    function wifi() external override(Wifi) returns (string memory){
        return "华为实现wifi功能";
    }
    
    function blue() external override(BlueTooth) returns (string memory){
        return "华为实现blueTooth功能";
    }
    
    function callAlarm() public{
        alarm();
    }
}

在这里插入图片描述

需要再回来好好的看看

返回华为实现了wifi功能

接口、抽象函数、抽象方法、乃至于实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1932189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AAD Connect自定义同步用户上云

使用场景&#xff1a;我想同步本地AD域的那些用户信息、账号上云端做SSO登录和权限管控&#xff0c;但是不希望使用快速上传一股脑传上去&#xff0c;所以使用自定义同步功能上传&#xff0c;这是一篇对AAD CONNECT这个应用的详解和配置步骤推荐 AD Connect如何自定义配置&…

百分点科技签约潍坊市数据产业发展战略合作

近日&#xff0c;潍坊市数据产业发展战略合作签约仪式举行&#xff0c;潍坊市人民政府副市长张震生&#xff0c;潍坊市财政局党组书记、局长王金祥&#xff0c;潍坊市大数据局党组书记陈强出席大会并致辞。百分点科技受邀进行战略合作签约&#xff0c;共同见证潍坊市数据要素市…

Python和C++骨髓细胞进化解析数学模型

&#x1f3af;要点 &#x1f3af; 数学模型邻接矩阵及其相关的转移概率 | &#x1f3af;蒙特卡罗模拟进化动力学 | &#x1f3af;细胞进化交叉图族概率 | &#x1f3af;进化图模型及其数学因子 | &#x1f3af;混合图模式对进化概率的影响 | &#x1f3af;造血干细胞群体的空间…

【异步爬虫:利用异步协程抓取一部电影】

利用异步协程抓取一部电影 我们把目光转向wbdy. 目前该案例还是可以用的. 我们想要抓取网上的视频资源就必须要了解我们的视频网站是如何工作的. 这里我用91看剧来做举例. 其他网站的原理是一样的. 1.视频网站是如何工作的 假设, 你现在想要做一个视频网站. 也有很多的UP猪…

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算&#xff0c;对区域进行离散化处理&#xff0c;采用隐式差分格式进行离散计算。隐式差分格式如图&#xff1a; 每层材料内部 对第 j j j层材料: 其中&#xff0c; λ j \lambda_j λj​表示第 j j j层的热扩散率&#xff0c; c j c_j cj​表示第 j j j层的比热容…

IntelliJ IDEA 2024.1 最新变化 附问卷调查 AI

IntelliJ IDEA 2024.1 最新变化 问卷调查项目在线AI IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 AI AssistantAI Assistant 改进 UltimateAI Assistant 中针对 Java 和 Kotlin 的改进代码高亮显示 Ultimate…

第100+16步 ChatGPT学习:R实现Xgboost分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现Xgboost分类 &#xff08…

智能守护校园餐桌:校园阳光食堂视频AI监控智能管理方案

一、背景分析 随着科技的飞速发展&#xff0c;智能化、信息化已成为现代校园管理的重要趋势。校园食堂作为学校重要的服务设施&#xff0c;其食品安全、环境卫生和秩序管理显得尤为重要。作为校园生活中不可或缺的一部分&#xff0c;食堂的管理也急需引入先进技术&#xff0c;…

【Git】(基础篇二)—— Git操作

Git操作 在了解git理论知识之后&#xff0c;本文将结合实践操作为你讲解git的底层逻辑 Git的安装和配置 git官网下载&#xff1a;https://git-scm.com/ 下载后安装时除了选择安装地址外&#xff0c;其余都保持默认下一步即可。 安装好后鼠标右键会出现两个新的选项【Open …

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 下面我们来讲解第一个指令&#xff0c;获取软件版本号命令-0x51. 在BootLoader中获取软件版本号的操作有多个重要的作用&#xff0c;具体如下&#xff1a; 版本管理&#xff1a; 识别当前版本&#xff1a;通过获取软…

Apache Flink 入门

零、概述 Apache Flink 是一个高性能的开源分布式流处理框架&#xff0c;专注于实时数据流的处理。 它设计用于处理无界和有界数据流&#xff0c;在内存级速度下提供高效的有状态计算。 Flink 凭借其独特的Checkpoint机制和Exactly-Once语义&#xff0c;确保数据处理的准确性…

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了&#xff0c; 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层&#xff0c;如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法&#xff1a;查看dmesg日志有报错&#xff1a;k…

大厂面试-基本功

大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…

线程池笔记

笔记梳理 前言.PHONYC标准库头文件C/C通用或C特有头文件mkdirc_str()snprintfvsnprintfumaskopen函数可变参数列表va_startva_endfunctionalstatic_castpthread_cond_init_threads.emplace_backstd::bindstd::placeholdersThreadPool(const ThreadPool<T> &tp) dele…

抢着发布地表最强开源模型,Meta凭什么勇攀AI高峰?

【科技明说 &#xff5c; 科技热点关注】 据外媒可靠消息&#xff0c;扎克伯格的Meta 公司将在7月23日发布开源大模型Llama 3-405B&#xff0c;这是基于现有80亿和700亿参数两个版本之外推出的4050亿参数版本&#xff0c;号称当前地球表面最强大的开源大模型。 Llama 3-405B是…

快速排序及归并排序的实现与排序的稳定性

目录 快速排序 一. 快速排序递归的实现方法 1. 左右指针法 步骤思路 为什么要让end先走&#xff1f; 2. 挖坑法 步骤思路 3. 前后指针法 步骤思路 二. 快速排序的时间和空间复杂度 1. 时间复杂度 2. 空间复杂度 三. 快速排序的优化方法 1. 三数取中优化 2. 小区…

【C++】拷贝构造函数及析构函数

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

超详细信息收集篇

1 域名信息收集 1.1 域名是什么 域名&#xff08;英语&#xff1a;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的 Internet 上某一台 计算机 或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地…

学习分布式事务遇到的小bug

一、介绍Seata 在处理分布式事务时我用到是Seata&#xff0c;Seata的事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…

DockerHub无法拉取镜像怎么办

快速构建企业级AIGC项目 LangChat是Java生态下企业级AIGC项目解决方案&#xff0c;在RBAC权限体系的基础上&#xff0c;集成AIGC大模型功能&#xff0c;帮助企业快速定制知识库、企业机器人。 网站文档&#xff1a;Index – LangChat 后台地址&#xff1a;LangChain Chat 前台…