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. 接口

接口类似于抽象智能合约,但是不实现任何功能:

  • 不能继承其他智能合约或接口
  • 不能定义构造函数
  • 不能定义变量
  • 不能定义结构体
  • 不能定义枚举

接口是智能合约的骨架,定义了合约的功能以及如何触发它们:如果智能合约实现了某种接口(比如ERC20ERC721),其他Dapps和智能合约就知道如何与它交互。因为接口提供了两个重要的信息:

  1. 合约里每个函数的bytes4选择器,以及基于它们的函数签名函数名(每个参数类型)
  2. 接口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-抽象智能合约和接口相关推荐

  1. 智能合约_AElf智能合约开发-第一个AElf智能合约

    第一个AElf智能合约 如果AElf脚手架项目能够正常启动并使用单节点产生区块,现在就可以着手做第一个智能合约了:Hello World. 开发AElf智能合约只需要简单的C#语法,并且这些语法都可以 ...

  2. EOS智能合约开发系列(13): 多签合约代码分析(二)

    知识星球地址:https://t.zsxq.com/2zBaE6u 欢迎访问知识星球,并留言探讨.

  3. EOS智能合约开发系列(12): 多签合约代码分析(一)

    知识星球地址:https://t.zsxq.com/Y3feqnu 欢迎访问知识星球,并留言探讨.

  4. 智能合约开发 Ganache | Truffle | Solidity | Web3.js

    Truffle Truffle是最全面的智能合约开发套件 内置智能合约编译.链接.部署和二进制管理. 使用断点.变量分析和步骤功能进行高级调试. Truffle基于JavaScript编写,可以在智能 ...

  5. 阿希链-ASCH智能合约开发入门

    1. 概述 1.1. 设计目标 ASCH智能合约平台致力于成为一个开发者可以快速上手的安全.高效的智能合约开发和运行平台 智能合约容易学习.容易编写.容易验证 合约语言必须是图灵完备的,合约运行必须是 ...

  6. Solana solidity到solana 开发第一讲

    Solana-solidity到solana 开发第一讲 说明:本文主要是讲解Solana的一些基本概念,对于详细的编程还有更多细节需要了解和学习,往后的课程可以给大家讲解更多 solana 简介 s ...

  7. 区块链开发之Solidity智能合约开发

    在编写智能合约之前,需要有Solidity的开发环境,我将使用Remix来进行Solidity的学习,大家可以访问 Remix在线Solidity集成开发环境 其界面主要分三部分,左半本分是合约目录, ...

  8. solidity智能合约开发简介

    1.solodity简介 Solidity语言是一种以太坊智能合约高级编程语言,运行在以太坊(Ethereum)虚拟机(EVM)之上. Solidity语言是一种语法类似JavaScript的高级编程 ...

  9. 智能合约开发solidity编程语言实例

    智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...

最新文章

  1. 二叉搜索树(BST)?平衡二叉树(AVL)?
  2. mybatis的if test 条件判断
  3. iTerm2的使用技巧及快捷键
  4. GitHub(从安装到使用)
  5. .NET 5中的EF Core 5数据迁移:在单独的库中并自动部署
  6. nginx配置和安装
  7. Java 9 揭秘(15. 增强的弃用注解)
  8. VMware虚拟机找不到USB设备该怎么办?
  9. Python:输入概率,计算信源熵
  10. 卫生间里的上下铺,那滋味~
  11. 一根网线实现两台计算机网络共享
  12. html参考文献英文文献,写英文paper的参考文献格式How To Cite References - Chicago Style...
  13. 爱奇艺、新英体育宣布成立合资公司,共造超级在线体育平台
  14. java绝对值怎么取
  15. 函数式编程-Stream流
  16. 函数对称性常见公式_三角函数的对称性公式大全
  17. 游戏充值订单金额修改思路与实践
  18. linux的设备类型
  19. 2021 Java 这一年
  20. BarTender打印流水号

热门文章

  1. 计算机主机硬盘主要有,现在电脑上的硬盘都有哪几种?
  2. Spring Cloud Finchley.SR1 的学习与应用 2 - Consul
  3. 2021年全球甲基丙烯酸羟丙酯收入大约196.5百万美元,预计2028年达到185百万美元
  4. mysql cluster 配置大全_Mysql Cluster配置基本篇
  5. Maven仓库理解和优先级
  6. centos6怎么通过光盘安装yum源_Linux系统中安装软件的三种方法
  7. html5照片浏览,实践html5实例–简单图片浏览器
  8. MapStruct 一文读懂
  9. 2021年劳务员-通用基础(劳务员)考试题及劳务员-通用基础(劳务员)考试资料
  10. 【华为机试真题 C++】奥运会排行榜-100