Solidity——抽象合约和接口详解

🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。


Solidity中的抽象合约和接口详解

目录

  1. 什么是抽象合约?
  2. 抽象合约的语法
  3. 接口(Interface)的定义
  4. 接口的语法与使用
  5. 抽象合约与接口的最佳实践
  6. 完整示例:基于抽象合约和接口的支付系统
  7. 总结

在这里插入图片描述

1、什么是抽象合约?

抽象合约是包含至少一个未实现函数的合约。这些未实现的函数只定义了函数签名,但没有实际的函数体。这意味着抽象合约不能被实例化,必须由子合约实现其未实现的函数。

1.1、特点

  • 抽象合约作为一种蓝图,提供了一种定义共同行为的方式。
  • 通常用于定义通用接口或框架,实际逻辑留给具体实现。

1.2、使用场景

  • 当需要为一组合约提供统一接口或基本结构,但具体实现会有所不同时,可以使用抽象合约。

1.3、抽象合约的语法

// 定义一个抽象合约
abstract contract Animal {// 定义一个抽象函数function makeSound() public virtual;
}

1.4、抽象函数

抽象函数只声明函数签名,使用 virtual 关键字声明以便在子合约中实现。

1.5、继承抽象合约

contract Dog is Animal {function makeSound() public override {// 实现抽象函数emit Sound("Woof");}
}

2、接口(Interface)的定义

接口类似于抽象合约,定义函数签名但不提供具体实现。与抽象合约不同,接口不能有任何状态变量、构造函数或函数修饰符。

2.1、特点

  • 接口完全抽象,只能定义函数签名,不能包含任何实现。
  • 任何合约只要实现接口中的所有函数,即视为实现了该接口。

2.2、接口的语法与使用

// 定义一个接口
interface ICalculator {function add(uint a, uint b) external returns (uint);function subtract(uint a, uint b) external returns (uint);
}

2.3、接口与继承

实现接口时,合约必须实现接口中声明的所有函数。

contract Calculator is ICalculator {function add(uint a, uint b) external override returns (uint) {return a + b;}function subtract(uint a, uint b) external override returns (uint) {return a - b;}
}

2.4、抽象合约与接口的最佳实践

  • 抽象合约:当有部分函数需要实现时使用。
  • 接口:当希望完全解耦实现时使用。
  • 设计模式:使用接口编程可以帮助合约保持模块化、灵活性和可扩展性。

3、完整示例:基于抽象合约和接口的支付系统

3.1、系统架构

  • 抽象合约:定义支付相关的通用逻辑,如转账和验证。
  • 接口:定义具体支付方式(如加密货币或法币支付)的接口。
// 抽象合约
abstract contract PaymentProcessor {function processPayment(uint amount) public virtual;
}// 接口
interface ICryptoPayment {function payInCrypto(uint amount) external;
}// 具体实现
contract CryptoPayment is PaymentProcessor, ICryptoPayment {function processPayment(uint amount) public override {// 处理加密货币支付payInCrypto(amount);}function payInCrypto(uint amount) external override {// 支付逻辑emit Payment("Crypto payment processed");}
}

4、总结

抽象合约和接口提供了灵活的方式来设计和组织Solidity合约。在开发复杂的DApp时,合理使用抽象合约和接口能够提高代码的可读性、可维护性和扩展性。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL_插入、更新和删除数据

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目,并安装依赖项 npm install 等待完成后, 安装electron npm install --save-dev electron 等待完成后, 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众号 &…

油气田可视化管理:精准监测与高效生产

通过图扑可视化技术实时监测油气田运行数据,优化生产流程,提高资源利用率和安全性,实现精准化管理。

如何在谷歌浏览器上玩大型多人在线游戏

在如今的数字时代,谷歌浏览器已经成为了许多人上网冲浪的首选工具。除了浏览网页、观看视频之外,你还可以在谷歌浏览器上畅玩各种大型多人在线游戏。本文将为你详细介绍如何在谷歌浏览器上玩大型多人在线游戏的步骤。 (本文由https://chrome…

AWS Network Firewall - 配置只应许白名单域名出入站

参考链接 https://repost.aws/zh-Hans/knowledge-center/network-firewall-configure-domain-ruleshttps://aws.amazon.com/cn/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/ 1. 创建防火墙 选择防火墙的归属子网(选择公有…

WinForm程序嵌入Web网页

文章目录 前言一、三方库或控件的选择测试二、Microsoft Edge WebView2安装、使用步骤1.安装2.使用 前言 由于此项目需要winform客户端嵌入web网页并于JAVA端交互数据,所以研究了一下嵌入web网页这部分,趟了一遍雷,这里做下记录。 一、三方库…

C# 委托(Delegate)二

一.委托的多播(Multicasting of a Delegate): 委托对象,使用 "" 运算符进行合并,一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注:只有相同类型…

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上,为微服务开发调试工作提供便利 请求报文难模拟:可以直接在测试环境页面上操作,流量直接打到本地IDEA进行debug请求链路较长:本地开发无需启动所有服务&#xf…

[附源码]网上订餐系统+SpringBoot+前后端分离

今天带来一款优秀的项目:网上订餐系统源码 。 系统采用的流行的前后端分离结构,包含了“管理端”,“商家管理端”,“用户购买端” 如果您有任何问题,也请联系小编,小编是经验丰富的程序员! 一.…

【Python语言初识(五)】

一、文件和异常 在Python中实现文件的读写操作其实非常简单,通过Python内置的open函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件&#…

SpringSecurity -- 入门使用

文章目录 什么是 SpringSesurity ?细节使用方法 什么是 SpringSesurity ? 在我们的开发中,安全还是有些必要的 用 拦截器 和 过滤器 写代码还是比较麻烦。 SpringSecurity 是 SpringBoot 的底层安全默认选型。一般我们需要认证和授权&#xf…

程序编译的四个阶段

程序编译的四个阶段 #include <stdio.h>int main(){printf("Hello World~");return 0; } hello.c程序的生命周期从一个高级C语言程序开始&#xff0c;这种形式容易被人读懂。 但这无法直接被计算机读懂。为了在系统上运行hello.c程序&#xff0c;每条C语言都…

mysql数据库的基本管理

目录 一.数据库的介绍 二.mariadb的安装 三.软件基本信息 四.数据库开启 五.数据库的安全初始化 六.数据库的基本管理 七.数据密码管理 八.用户授权 九.数据库的备份 十.web控制器 一.数据库的介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracl…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 论文信息 Title: Recent Advancement of Emotion Cognition in Large Language Models Authors: Yuyan Chen, Yanghua Xiao https://arxiv.org/abs/2409.13354 情感认知在大型语言模型中的近期进展 《Recent A…

JVM 垃圾回收算法细节

目录 前言 GC Root 可达性分析 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并行的可达性分析 前言 学习了几种垃圾收集算法之后&#xff0c; 我们再来看看它们在具体实现上有什么细节之处&#xff0c;我们所能看到的理论很简单&#xff0c;但是实现起来那…

如何把PDF样本册转换为网址链接

​随着互联网的普及&#xff0c;将纸质或PDF格式的样本册转化为网址链接&#xff0c;以便于在线浏览和分享&#xff0c;变得越来越重要。本文将为您详细讲解如何将PDF样本册转换为网址链接&#xff0c;让您轻松实现线上展示和分享。 一、了解PDF样本册与网址链接 1. PDF样本册…

详解电力物联网通常使用哪些通信规约?

在电力物联网行业中&#xff0c;通信规约是关键的技术之一&#xff0c;用于实现电网设备与控制中心之间的数据通信和信息管理。本篇就为大家简单说明电力物联网通常使用哪些通信规约。 1、IEC 60870-5-101/104 这是由国际电工委员会&#xff08;IEC&#xff09;制定的一系列标…

99%的人都不知道的AI绘图变现赚钱秘诀,都在这里了!

AI绘画发展至今&#xff0c;已经有很多实际落地的应用场景&#xff0c;这里介绍几种AI绘图热门变现方式 AI儿童绘本 各大平台上故事绘本、幼儿园儿歌、英文绘本、古诗词&#xff0c;从下图里&#xff0c;可以看出需求量很大 AI儿童绘本 实现方式 \1. gpt\2. leonardo.ai\3.…

Arduino的wifi连接,如何关闭低功耗模式?

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…