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.mzph.cn/diannao/54891.shtml

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

相关文章

【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码。

【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码 【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码 文章目录 【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码1.Variational Autoencoders (VAE…

3D Gaussian Splatting 学习笔记

目录 突破3DGS泛化和实用壁垒!GS-Net:首个具有跨场景泛化能力的即插即用3DGS模块 升级版 SGD 一问读懂3D Gaussian Splatting 3DGS高斯泼溅技术 系统首先对 SfM 点云进行初始化 代码概要 突破3DGS泛化和实用壁垒!GS-Net:首个…

通过 OBD Demo 体验 OceanBase 4.3 社区版

本文作者:马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构,引入了列存引擎,实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能,同时也确保了TP业务场景…

uniapp云打包

ios打包 没有mac电脑,使用香蕉云编 先登录香蕉云编这个工具,新建csr文件——把csr文件下载到你电脑本地: 然后,登录苹果开发者中心 生成p12证书 1、点击+号创建证书 创建证书的时候一定要选择ios distribution app store and ad hoc类型的证书 2、上传刚才从本站生成的…

C++(学习)2024.9.26

目录 多态 1.概念 2.函数覆盖 3.虚函数的定义 4.多态实现 5.多态原理 6.虚析构函数 7.类型转换 (1)static_cast(静态转换) (2)dynamic_cast(动态转换) (3)const_cast(常量转换) (4)reinterpret_cast()(重解释转换) 抽象类 纯虚析构函数 私有析构函数 多态 1.概…

常用的MySQL日期、时间函数

1、日期/时间获取函数 函数名 描述 实例 CURDATE() 返回当前日期 SELECT CURDATE(); -> 2018-09-19 CURRENT_DATE() 返回当前日期 SELECT CURRENT_DATE(); -> 2018-09-19 CURRENT_TIME 返回当前时间 SELECT CURRENT_TIME(); -> 19:59:02 CURTIME() 返回当…

【设计模式-策略】

定义 策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户端而变化,使得算法的变化不会影响到使用它的客户端…

Java读取YAML文件

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中,我们学习了目标的IP地址,端口,服务,操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用,因为我们可以快速查找系统上运行的服…

计算机网络回顾

计算机网络回顾 说明一般的小型无线局域网如何搭建(以寝室为例) 1.硬件准备 选择一个适合的支持802.11ac或802.11ax标准的无线路由器网线 2.连接路由器并配置 1.无线路由器的接线 power口连接电源WAN口用网线连接外网LAN口连接设备网口 2.配置无线路由器 电脑连接路由器后…

Scrapy框架介绍

一、什么是Scrapy 是一款快速而强大的web爬虫框架,基于Twusted的异步处理框架 Twisted是事件驱动的 Scrapy是由Python实现的爬虫框架 ① 架构清晰 ②可扩展性强 ③可以灵活完成需求 二、核心组件 Scrapy Engine(引擎):Scrapy框架…

乐鑫ESP32-S2高性能选择,家电中控屏联网通信应用,启明云端乐鑫代理商

在21世纪的今天,家电已经不再是简单的功能性产品,它们正在变得智能化,能够与我们的生活方式更加紧密地融合。 家电智能化正在改变我们与家庭环境的互动方式,它们不仅能够提高我们的生活效率,还能为我们带来更加舒适和…

计算机视觉综述

大家好,今天,我们将一起探讨计算机视觉的基本概念、发展历程、关键技术以及未来趋势。计算机视觉是人工智能的一个重要分支,旨在使计算机能够“看”懂图像和视频,从而完成各种复杂的任务。无论你是对这个领域感兴趣的新手&#xf…

【Kubernetes】常见面试题汇总(三十六)

目录 88. Pod 启动失败如何解决以及常见的原因有哪些? 89.简述 K8s 中 label 的几种应用场景。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题…

在 Ubuntu 上构建 Electron 项目时的问题记录和解决方法

文章目录 0. 引言1. 问题一:依赖安装缓慢原因分析解决方案使用国内镜像源使用 nrm 管理 npm 镜像源 2. 问题二:Electron 二进制文件下载缓慢原因分析解决方案设置 Electron 下载的国内镜像源通过 npm 配置 Electron 镜像 3. 问题三:Cannot fi…

【 EXCEL 数据处理 】000003 案列 标记涨跌,保姆级教程。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

【 EXCEL 数据处理 】000003 案列 使用条件格式之大于和小于,标记涨跌,保姆级教程。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。 📚一、直接上案例 📖1.使用条件格式之大于和小…

ElasticSearch安装分词器与整合SpringBoot

ElasticSearch安装分词器与整合SpringBoot 如果还没安装的点击安装ElasticSearch查看怎么安装 分词器 1.分词器 在Elasticsearch中,分词器(Tokenizer)是分析器(Analyzer)的一部分,它的主要职责是将文本输入…

宝塔面板部署雷池社区版教程

宝塔面板部署雷池社区版教程 简单介绍一下宝塔面板,安全高效的服务器运维面板,使用宝塔面板的人非常多 在网站管理上,许多用户都是通过宝塔面板进行管理,宝塔面板的Nginx默认监听端口为80和443,这就导致共存部署时雷池…

K8s Calico替换为Cilium,以及安装Cilium过程(鲁莽版)

迁移CNI插件的3种办法: 1、创建一个新的集群,通过Gitops的方式迁移负载,然而,这可能涉及大量的准备工作和潜在的中断。 2、另一种方法是重新配置/etc/cni/net.d/指向Cilium。但是,现有的pod仍将由旧的…

【锁住精华】MySQL锁机制全攻略:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁

MySQL有哪些锁 1、按照锁的粒度划分 行锁 是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引&…