【2022 元宇宙基础NFT之Solidity OOP编程第07篇】3分钟了解合约结构

Solidity 合约和面向对象语言非常相似。每个合约均能包含状态变量State Variables, 函数Functions, 函数修饰符Function Modifiers, 事件Events, 结构体类型Struct Types 和 枚举类型Enum Types。除此以外,还有比较特殊的合约叫做库libraries和接口interfaces

本篇文章将简单分别做一个介绍,接下来后面的教程将作更详细的讲解。

一、状态变量State Variables

状态变量是其值永久存储在合约实例中的变量。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract SimpleStorage {
    uint storedData; // 状态变量
    // ...
}

二、函数Functions

函数是合约实例对象的一种行为,可以通过合约实例调用函数请求其帮助我们完成我们期望的某个任务。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract SimpleAuction {
    function bid() public payable { // 函数、行为、方法
        // ...
    }
}

三、函数修饰符Modifier

函数修饰符可用于以声明方式修改功能的语义。Modifier修饰符不支持重载,也就是相同的名字不可能出现两个。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Purchase {
    address public seller;

    modifier onlySeller() { // Modifier修饰符
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _;
    }

    function abort() public view onlySeller { // Modifier 使用场景,当调用`abort()`函数时,会先执行`onlySeller`检查是否满足条件,满足,继续执行,不满足,发生异常,停止
        // ...
    }
}

四、事件Events

事件是与EVM日志记录工具的便捷接口。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // Event

    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // 触发 event
    }
}

五、结构体Struct Types

结构是自定义的结构类型,可以对多个变量进行分组封装。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

六、枚举Enum Types

枚举可用于创建带有有限“常量值”集的自定义类型。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}

七、库library

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

struct Data {
    mapping(uint => bool) flags;
}

library Set { // 集合 Set library

    function insert(Data storage self, uint value)
        public
        returns (bool)
    {
        if (self.flags[value])
            return false; 
        self.flags[value] = true;
        return true;
    }

    function remove(Data storage self, uint value)
        public
        returns (bool)
    {
        if (!self.flags[value])
            return false; 
        self.flags[value] = false;
        return true;
    }

    function contains(Data storage self, uint value)
        public
        view
        returns (bool)
    {
        return self.flags[value];
    }
}

contract C {
    Data knownValues;

    function register(uint value) public {
        // library 函数不需要通过实例对象调用,可直接通过 library 名字直接调用
        require(Set.insert(knownValues, value));
    }
}

八、接口Interfaces

接口类似于抽象协议,但是不能实现任何功能。还有其他限制:

  • 它们不能继承其它合约,但是可以从其他接口继承。
  • 所有声明的函数都必须是外部的。
  • 接口不能声明构造函数。
  • 接口不能声明状态变量。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

interface ParentA {
    function test() external returns (uint256);
}

interface ParentB {
    function test() external returns (uint256);
}

祝学习愉快: 更多细节我们将在后面的教程中进行讲解。

⚠️:ok,一切准备就绪,开始我们的学习之旅吧,如果有问题,可以到这里提问

已有 0 用户参与0
0 : 0
+1已打分
电子邮箱
  • 程序咖巴士
联系我们
  • 扫一扫,联系我们