Solidity智能合约开发 — 3.4-抽象智能合约和接口
1. 抽象智能合约
假如一个智能合约中至少一个函数缺省实现时,即某个函数缺少{}中的内容,这个智能合约就当做抽象智能合约。
当我们有一个函数没想好怎么写时,必须将该合约标为abstract
,不然编译会报错;另外,未实现的函数需要加virtual
,以便子合约重写。抽象智能合约是将智能合约的定义与实现部分分离,从而提供更好的可扩展性和易读性。
abstract contract InsertionSort{function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
}
需要注意的是,缺省实现的函数虽然跟function类型的变量在语法上看起来很像,但两者完全不同,缺省实现的函数如下:
function foo(address) external returns (adderss);
function类型的变量在声明时如下:
function(address) exteranl returns (address) foo;
2. 接口
接口类似于抽象智能合约,但是不实现任何功能:
- 不能继承其他智能合约或接口
- 不能定义构造函数
- 不能定义变量
- 不能定义结构体
- 不能定义枚举
接口是智能合约的骨架,定义了合约的功能以及如何触发它们:如果智能合约实现了某种接口(比如ERC20
或ERC721
),其他Dapps和智能合约就知道如何与它交互。因为接口提供了两个重要的信息:
- 合约里每个函数的
bytes4
选择器,以及基于它们的函数签名函数名(每个参数类型)
。 - 接口id(更多信息见EIP165)
另外,接口与合约ABI
(Application Binary Interface)等价,可以相互转换:编译接口可以得到合约的ABI
,利用abi-to-sol工具也可以将ABI json
文件转换为接口sol
文件。
ERC721
接口合约IERC721
为例,它定义了3个event
和9个function
,所有ERC721
标准的NFT都实现了这些函数。我们可以看到,接口和常规合约的区别在于每个函数都以;
代替函数体{ }
结尾。
interface IERC721 is IERC165 {event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);event ApprovalForAll(address indexed owner, address indexed operator, bool approved);function balanceOf(address owner) external view returns (uint256 balance);function ownerOf(uint256 tokenId) external view returns (address owner);function safeTransferFrom(address from, address to, uint256 tokenId) external;function transferFrom(address from, address to, uint256 tokenId) external;function approve(address to, uint256 tokenId) external;function getApproved(uint256 tokenId) external view returns (address operator);function setApprovalForAll(address operator, bool _approved) external;function isApprovedForAll(address owner, address operator) external view returns (bool);function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data) external;
}
我们知道一个合约实现了IERC721
接口,我们不需要知道它具体代码实现,就可以与它交互。
Solidity智能合约开发 — 3.4-抽象智能合约和接口相关推荐
- 智能合约_AElf智能合约开发-第一个AElf智能合约
第一个AElf智能合约 如果AElf脚手架项目能够正常启动并使用单节点产生区块,现在就可以着手做第一个智能合约了:Hello World. 开发AElf智能合约只需要简单的C#语法,并且这些语法都可以 ...
- EOS智能合约开发系列(13): 多签合约代码分析(二)
知识星球地址:https://t.zsxq.com/2zBaE6u 欢迎访问知识星球,并留言探讨.
- EOS智能合约开发系列(12): 多签合约代码分析(一)
知识星球地址:https://t.zsxq.com/Y3feqnu 欢迎访问知识星球,并留言探讨.
- 智能合约开发 Ganache | Truffle | Solidity | Web3.js
Truffle Truffle是最全面的智能合约开发套件 内置智能合约编译.链接.部署和二进制管理. 使用断点.变量分析和步骤功能进行高级调试. Truffle基于JavaScript编写,可以在智能 ...
- 阿希链-ASCH智能合约开发入门
1. 概述 1.1. 设计目标 ASCH智能合约平台致力于成为一个开发者可以快速上手的安全.高效的智能合约开发和运行平台 智能合约容易学习.容易编写.容易验证 合约语言必须是图灵完备的,合约运行必须是 ...
- Solana solidity到solana 开发第一讲
Solana-solidity到solana 开发第一讲 说明:本文主要是讲解Solana的一些基本概念,对于详细的编程还有更多细节需要了解和学习,往后的课程可以给大家讲解更多 solana 简介 s ...
- 区块链开发之Solidity智能合约开发
在编写智能合约之前,需要有Solidity的开发环境,我将使用Remix来进行Solidity的学习,大家可以访问 Remix在线Solidity集成开发环境 其界面主要分三部分,左半本分是合约目录, ...
- solidity智能合约开发简介
1.solodity简介 Solidity语言是一种以太坊智能合约高级编程语言,运行在以太坊(Ethereum)虚拟机(EVM)之上. Solidity语言是一种语法类似JavaScript的高级编程 ...
- 智能合约开发solidity编程语言实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
最新文章
- 二叉搜索树(BST)?平衡二叉树(AVL)?
- mybatis的if test 条件判断
- iTerm2的使用技巧及快捷键
- GitHub(从安装到使用)
- .NET 5中的EF Core 5数据迁移:在单独的库中并自动部署
- nginx配置和安装
- Java 9 揭秘(15. 增强的弃用注解)
- VMware虚拟机找不到USB设备该怎么办?
- Python:输入概率,计算信源熵
- 卫生间里的上下铺,那滋味~
- 一根网线实现两台计算机网络共享
- html参考文献英文文献,写英文paper的参考文献格式How To Cite References - Chicago Style...
- 爱奇艺、新英体育宣布成立合资公司,共造超级在线体育平台
- java绝对值怎么取
- 函数式编程-Stream流
- 函数对称性常见公式_三角函数的对称性公式大全
- 游戏充值订单金额修改思路与实践
- linux的设备类型
- 2021 Java 这一年
- BarTender打印流水号
热门文章
- 计算机主机硬盘主要有,现在电脑上的硬盘都有哪几种?
- Spring Cloud Finchley.SR1 的学习与应用 2 - Consul
- 2021年全球甲基丙烯酸羟丙酯收入大约196.5百万美元,预计2028年达到185百万美元
- mysql cluster 配置大全_Mysql Cluster配置基本篇
- Maven仓库理解和优先级
- centos6怎么通过光盘安装yum源_Linux系统中安装软件的三种方法
- html5照片浏览,实践html5实例–简单图片浏览器
- MapStruct 一文读懂
- 2021年劳务员-通用基础(劳务员)考试题及劳务员-通用基础(劳务员)考试资料
- 【华为机试真题 C++】奥运会排行榜-100