Bài học 4

LearnCoin合约详解

通过本章的学习,您应该: 1.了解LearnCoin合约的核心部分和功能。 2.了解OpenZeppelin合约和库在我们的代币合约中的作用。

引言

在上一章中,我们将LearnCoin合约部署到Goerli测试网。在本章中,我们将详细探讨LearnCoin合约的功能并解释每个部分的作用。

合约结构

以下是我们的LearnCoin完整合约:

Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";

contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
    bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    function snapshot() public onlyRole(SNAPSHOT_ROLE) {
        _snapshot();
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

我们部署的合约是一个名为LearnCoin的ERC20代币合约。它包含了OpenZeppelin合约库中的多个功能,如可销毁代币、快照、访问控制、可暂停代币、许可、投票和闪电铸币。

合约import语句

合约开头的import语句是从OpenZeppelin的合约库中导入代码:

  • ERC20.sol是ERC20代币的基础合约。
  • ERC20Burnable.sol使代币持有者能够销毁自己的代币。
  • ERC20Snapshot.sol支持创建代币余额的快照。
  • AccessControl.sol是一个用于管理对某些功能的访问权限的合约模块。
  • Pausable.sol可以暂停和取消暂停代币传输。
  • ERC20Permit.sol使持有者能够通过许可(permits)使用用户的代币。
  • ERC20Votes.sol为代币添加了投票功能。
  • ERC20FlashMint.sol可以实现快速铸造代币。

LearnCoin合约声明

LearnCoin合约继承了导入的OpenZeppelin合约。因此,LearnCoin合约将拥有OpenZeppelin合约的所有方法和属性。

角色声明

SNAPSHOT_ROLEPAUSER_ROLE是常量值(使用keccak256哈希函数创建),表示合约中访问控制的特定角色。

构造函数

部署LearnCoin合约时,会调用构造函数。构造函数设置了代币的名称和符号,授予部署帐户(msg.sender)管理员、快照者和暂停者角色,并铸造了一定数量的初始代币供部署账户使用。

其他函数

snapshotpauseunpause是允许具有相应角色的帐户执行某些操作的函数。snapshot函数可以创建快照,pauseunpause函数可以停止和重新启动代币转账。

重写

函数_beforeTokenTransfer_afterTokenTransfer_mint_burn是从父合约重写的内部函数。它们执行LearnCoin合约的自定义逻辑。

  • _beforeTokenTransfer:在代币转账之前调用此函数,确保代币转账不会暂停。
  • _afterTokenTransfer:在代币转账之后调用此函数。此处,它是一个空函数,但可用于转账后立即执行的自定义逻辑。
  • _mint:此函数用于创建新代币并将其分配给给定的帐户。
  • _burn:此函数用于销毁来自给定帐户的代币。

结语

本章是对LearnCoin合约所做的综合介绍。合约部署完成后,您可以运行该合约,我们将在下一章中详细探讨。

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 4

LearnCoin合约详解

通过本章的学习,您应该: 1.了解LearnCoin合约的核心部分和功能。 2.了解OpenZeppelin合约和库在我们的代币合约中的作用。

引言

在上一章中,我们将LearnCoin合约部署到Goerli测试网。在本章中,我们将详细探讨LearnCoin合约的功能并解释每个部分的作用。

合约结构

以下是我们的LearnCoin完整合约:

Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";

contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
    bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    function snapshot() public onlyRole(SNAPSHOT_ROLE) {
        _snapshot();
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

我们部署的合约是一个名为LearnCoin的ERC20代币合约。它包含了OpenZeppelin合约库中的多个功能,如可销毁代币、快照、访问控制、可暂停代币、许可、投票和闪电铸币。

合约import语句

合约开头的import语句是从OpenZeppelin的合约库中导入代码:

  • ERC20.sol是ERC20代币的基础合约。
  • ERC20Burnable.sol使代币持有者能够销毁自己的代币。
  • ERC20Snapshot.sol支持创建代币余额的快照。
  • AccessControl.sol是一个用于管理对某些功能的访问权限的合约模块。
  • Pausable.sol可以暂停和取消暂停代币传输。
  • ERC20Permit.sol使持有者能够通过许可(permits)使用用户的代币。
  • ERC20Votes.sol为代币添加了投票功能。
  • ERC20FlashMint.sol可以实现快速铸造代币。

LearnCoin合约声明

LearnCoin合约继承了导入的OpenZeppelin合约。因此,LearnCoin合约将拥有OpenZeppelin合约的所有方法和属性。

角色声明

SNAPSHOT_ROLEPAUSER_ROLE是常量值(使用keccak256哈希函数创建),表示合约中访问控制的特定角色。

构造函数

部署LearnCoin合约时,会调用构造函数。构造函数设置了代币的名称和符号,授予部署帐户(msg.sender)管理员、快照者和暂停者角色,并铸造了一定数量的初始代币供部署账户使用。

其他函数

snapshotpauseunpause是允许具有相应角色的帐户执行某些操作的函数。snapshot函数可以创建快照,pauseunpause函数可以停止和重新启动代币转账。

重写

函数_beforeTokenTransfer_afterTokenTransfer_mint_burn是从父合约重写的内部函数。它们执行LearnCoin合约的自定义逻辑。

  • _beforeTokenTransfer:在代币转账之前调用此函数,确保代币转账不会暂停。
  • _afterTokenTransfer:在代币转账之后调用此函数。此处,它是一个空函数,但可用于转账后立即执行的自定义逻辑。
  • _mint:此函数用于创建新代币并将其分配给给定的帐户。
  • _burn:此函数用于销毁来自给定帐户的代币。

结语

本章是对LearnCoin合约所做的综合介绍。合约部署完成后,您可以运行该合约,我们将在下一章中详细探讨。

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.