当前位置: 首页 > news >正文

solidity中的抽象合约

之前总结过solidity中的接口和继承,但遗漏掉了一个相关概念——抽象合约,类似于Java中的抽象类,下边补充一下该知识点。

什么是抽象合约?

抽象合约是至少有一个函数没有实现的合约。它就像一个"模板",需要其他合约来完善它。

// 抽象合约 - 包含未实现的函数
abstract contract Animal {function speak() public pure virtual returns (string memory);function sleep() public pure virtual returns (string memory) {return "Zzz...";}
}

抽象合约不需要部署,也无法直接部署。

为什么不能部署?

因为以太坊虚拟机(EVM)需要完整的字节码才能部署合约,而抽象合约包含未实现的函数,编译后字节码不完整。

具体例子

示例1:明显的抽象合约

abstract contract Animal {// 未实现的函数 - 使合约成为抽象合约function speak() public pure virtual returns (string memory);// 已实现的函数function breathe() public pure returns (string memory) {return "Breathing...";}
}// 这个合约可以部署,因为它实现了所有抽象函数
contract Dog is Animal {function speak() public pure override returns (string memory) {return "Woof!";}
}

示例2:隐式的抽象合约

// 这也是抽象合约,即使没有显式声明 abstract
contract Vehicle {// 未实现的函数使合约自动成为抽象合约function startEngine() public virtual returns (bool);
}

验证无法部署

如果您尝试部署抽象合约,编译器会报错:

TypeError: Trying to create an instance of an abstract contract.

在 Remix 中,抽象合约的部署按钮会是灰色的或不可用状态。

抽象合约的使用场景

1. 作为基类模板

abstract contract ERC20Base {mapping(address => uint256) public balances;function transfer(address to, uint256 amount) public virtual returns (bool);function balanceOf(address account) public view virtual returns (uint256);
}contract MyToken is ERC20Base {function transfer(address to, uint256 amount) public override returns (bool) {// 实现逻辑return true;}function balanceOf(address account) public view override returns (uint256) {return balances[account];}
}

2. 定义接口标准

abstract contract Staking {function stake(uint256 amount) public virtual;function unstake(uint256 amount) public virtual;function getReward() public virtual;// 已实现的工具函数function calculateReward(address user) public view virtual returns (uint256) {// 计算逻辑return 100;}
}

3. 部分实现的模板

abstract contract Ownable {address public owner;constructor() {owner = msg.sender;}modifier onlyOwner() {require(msg.sender == owner, "Not owner");_;}function transferOwnership(address newOwner) public virtual onlyOwner;
}contract MyContract is Ownable {function transferOwnership(address newOwner) public override onlyOwner {owner = newOwner;}
}

与接口(interface)的区别

特性抽象合约接口
函数实现可以有已实现的函数只能有函数声明
状态变量可以有不能有
构造函数可以有不能有
修饰器可以有不能有
继承可以继承其他合约可以继承其他接口

总结

  • 抽象合约不能部署 - 因为字节码不完整
  • 必须通过继承来使用 - 子合约实现所有抽象函数后才能部署
  • 用途广泛 - 作为模板、定义标准、代码复用
  • 编译时检查 - 编译器确保子合约实现了所有抽象函数
http://www.dtcms.com/a/593074.html

相关文章:

  • 去中心化铸就价值基石:CVC与BTC引领区块链投资新范式
  • 微美全息(NASDAQ:WIMI)基于边缘云计算与区块链的数据缓存算法,引领数据管理变革
  • K8S RD: Kubernetes核心概念与故障排查全解析
  • 响应式网站手机端广州网站建设商城建设
  • 第三方应用软件提权之vnc提权
  • iOS 跨平台开发实战指南,从框架选择到开心上架(Appuploader)跨系统免 Mac 发布全流程解析
  • 【Go】并发编程的核心思想 CSP 模型
  • 《Vue项目开发实战》第四章:组件封装--ToolBar
  • Redis拒绝策略
  • iphone Delta模拟器如何从夸克网盘导入游戏ROM 附游戏资源下载
  • 专业网站建设平台网站建设功能评估表
  • 做农业网站怎么赚钱58同城北京网站建设
  • 如何在命令行中调用Dev-C++的编译器?
  • C语言自定义类型:联合体与枚举
  • 在线网站推广工具WordPress 付费下载阅读
  • Windows2008 如何禁用FSO?
  • 了解一下LSTM:长短期记忆网络(改进的RNN)
  • 【微服务 - easy视频 | day03】服务与服务之间的调用
  • 网站建设定做mvc网站建设的实验报告
  • CMP(类Cloudera CMP 7 404版华为Kunpeng)告别CDH/CDP,拥抱自主可控的新时代
  • 生成ios钱包pkpass文件
  • Paimon——官网阅读:理解文件
  • 做网站应该学什么语言网站建设裕鸿国际
  • Xenium数据分析 | 使用Xenium Ranger重新分析数据
  • MySQL 8.0 新特性详解:窗口函数,开启数据分析的潘多拉魔盒
  • 基于模板匹配的数字和大写字母识别(Matlab)
  • 网站编程赚钱企业门户网站 php
  • 网站有什么到期网站空间哪里买
  • LeetCode 分类刷题:2816. 翻倍以链表形式表示的数字
  • 一文掌握,soular安装与配置