• Solidity智能合约开发 — 3.4-抽象智能合约和接口


    1. 抽象智能合约

    假如一个智能合约中至少一个函数缺省实现时,即某个函数缺少{}中的内容,这个智能合约就当做抽象智能合约。

    当我们有一个函数没想好怎么写时,必须将该合约标为abstract,不然编译会报错;另外,未实现的函数需要加virtual,以便子合约重写。抽象智能合约是将智能合约的定义与实现部分分离,从而提供更好的可扩展性和易读性。

    1. abstract contract InsertionSort{
    2. function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
    3. }

    需要注意的是,缺省实现的函数虽然跟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都实现了这些函数。我们可以看到,接口和常规合约的区别在于每个函数都以;代替函数体{ }结尾。

    1. interface IERC721 is IERC165 {
    2. event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    3. event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    4. event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    5. function balanceOf(address owner) external view returns (uint256 balance);
    6. function ownerOf(uint256 tokenId) external view returns (address owner);
    7. function safeTransferFrom(address from, address to, uint256 tokenId) external;
    8. function transferFrom(address from, address to, uint256 tokenId) external;
    9. function approve(address to, uint256 tokenId) external;
    10. function getApproved(uint256 tokenId) external view returns (address operator);
    11. function setApprovalForAll(address operator, bool _approved) external;
    12. function isApprovedForAll(address owner, address operator) external view returns (bool);
    13. function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data) external;
    14. }

    我们知道一个合约实现了IERC721接口,我们不需要知道它具体代码实现,就可以与它交互。

  • 相关阅读:
    算法金 | 通透!!十大回归算法模型最强总结
    【拼题A】 520 钻石争霸赛 2023 题解
    go并发操作且限制数量
    【RPC】I/O模型——BIO、NIO、AIO及NIO的Rector模式
    C# Winform PropertyGrid中文排序
    C++ string 类相关知识
    Net6 Configuration & Options 源码分析 Part2 Options 模型使用与源码分析
    计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统
    Django DRF中的request.data与Django中的request.body
    前端面试记录
  • 原文地址:https://blog.csdn.net/qincheng168/article/details/128211608