บทเรียนที่ 4

สำรวจสัญญา LearnCoin

เมื่อสิ้นสุดบทเรียนนี้ คุณควรจะสามารถ: 1. ทำความเข้าใจส่วนสำคัญและฟังก์ชันการทำงานของสัญญา LearnCoin 2. ทำความเข้าใจบทบาทของสัญญาและไลบรารีของ OpenZeppelin ในสัญญาโทเค็นของเรา

แนะนำสกุลเงิน

ในบทเรียนที่แล้ว เราได้ปรับใช้สัญญา LearnCoin กับ Goerli Testnet ในบทนี้ เราจะสำรวจโดยละเอียดเกี่ยวกับฟังก์ชันการทำงานของสัญญา LearnCoin และอธิบายว่าแต่ละส่วนทำหน้าที่อะไร

โครงสร้างสัญญา

นี่คือสัญญาฉบับเต็มของ LearnCoin ของเรา

Python 
 // SPDX-License-Identifier: ไม่มี 
 ความแข็งแกร่งของ pragma ^0.8.9; 

 นำเข้า "@openzeppelin/contracts/token/ERC20/ERC20.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
นำเข้า "@openzeppelin/contracts/access/AccessControl.sol";
นำเข้า "@openzeppelin/contracts/security/Pausable.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";

สัญญา LearnCoin คือ ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint { 
 bytes32 public Constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE"); 
 bytes32 ค่าคงที่สาธารณะ PAUSER_ROLE = keccak256("PAUSER_ROLE"); 

 ตัวสร้าง () ERC20 ("เรียนรู้เหรียญ", "LC") ERC20Permit ("เรียนรู้เหรียญ") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    ฟังก์ชั่นสแนปชอต () สาธารณะ onlyRole (SNAPSHOT_ROLE) {
        _snapshot();
    }

    ฟังก์ชั่นหยุดชั่วคราว () สาธารณะ onlyRole (PAUSER_ROLE) {
        _pause();
    }

    ฟังก์ชั่น unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    ฟังก์ชั่น _beforeTokenTransfer(ที่อยู่จาก, ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 whenNotPaused 
 override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // ฟังก์ชั่นต่อไปนี้ถูกแทนที่ ต้องการโดย Solidity

    ฟังก์ชั่น _afterTokenTransfer (ที่อยู่จาก, ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 การแทนที่ (ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    ฟังก์ชั่น _mint (ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 การแทนที่ (ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    ฟังก์ชั่น _burn (บัญชีที่อยู่จำนวน uint256) 
 การแทนที่ 
 ภายใน (ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

สัญญาที่คุณปรับใช้คือสัญญาโทเค็น ERC20 ชื่อ LearnCoin ประกอบด้วยคุณลักษณะหลายประการจากไลบรารีสัญญาของ OpenZeppelin เช่น โทเค็นที่เบิร์นได้ สแน็ปช็อต การควบคุมการเข้าถึง โทเค็นที่หยุดชั่วคราว ฟังก์ชันการอนุญาต การโหวต และแฟลชมินต์

คำชี้แจงการนำเข้าตามสัญญา

คำสั่งนำเข้าที่จุดเริ่มต้นของสัญญาดึงโค้ดจากไลบรารีสัญญาของ OpenZeppelin:

  • ERC20.sol เป็นสัญญาพื้นฐานสำหรับโทเค็น ERC20
  • ERC20Burnable.sol เพิ่มความสามารถให้ผู้ถือโทเค็นสามารถทำลายโทเค็นของตนเองได้
  • ERC20Snapshot.sol ช่วยให้สามารถสร้างสแนปช็อตของยอดโทเค็นได้
  • AccessControl.sol เป็นโมดูลสัญญาสำหรับจัดการการเข้าถึงฟังก์ชันการทำงานบางอย่าง
  • Pausable.sol เพิ่มความสามารถในการหยุดชั่วคราวและยกเลิกการหยุดการโอนโทเค็นชั่วคราว
  • ERC20Permit.sol ช่วยให้ผู้ถือสามารถใช้โทเค็นของผู้ใช้ผ่านใบอนุญาตได้
  • ERC20Votes.sol เพิ่มความสามารถในการลงคะแนนให้กับโทเค็น
  • ERC20FlashMint.sol ช่วยให้สามารถสร้างโทเค็นแบบแฟลชได้

การประกาศสัญญา LearnCoin

สัญญา LearnCoin สืบทอดมาจากสัญญา OpenZeppelin ที่นำเข้า ซึ่งหมายความว่าจะมีวิธีการและคุณสมบัติทั้งหมดจากสัญญาเหล่านั้น

การประกาศบทบาท

SNAPSHOT_ROLE และ PAUSER_ROLE เป็นค่าคงที่ (สร้างโดยใช้ฟังก์ชันแฮช keccak256 ) ที่แสดงบทบาทเฉพาะสำหรับการควบคุมการเข้าถึงภายในสัญญา

ฟังก์ชั่นตัวสร้าง

เมื่อสัญญา LearnCoin ถูกปรับใช้ ฟังก์ชันตัวสร้างจะถูกเรียก โดยจะตั้งชื่อและสัญลักษณ์ของโทเค็น มอบบทบาทผู้ดูแลระบบ สแน็ปช็อต และตัวหยุดชั่วคราวให้กับบัญชีที่ใช้งาน (msg.sender) และสร้างโทเค็นเริ่มต้นให้กับบัญชีที่ใช้งาน

ฟังก์ชั่นเพิ่มเติม

snapshot pause และ unpause เป็นฟังก์ชันที่อนุญาตให้บัญชีที่มีบทบาทที่เกี่ยวข้องสามารถดำเนินการบางอย่างได้ snapshot ช่วยให้สามารถสร้างสแน็ปช็อต pause และ unpause การหยุดชั่วคราว อนุญาตให้หยุดและรีสตาร์ทการถ่ายโอนโทเค็น

แทนที่

ฟังก์ชัน _beforeTokenTransfer, _afterTokenTransfer, _mint และ _burn เป็นฟังก์ชันภายในที่ถูกแทนที่จากสัญญาหลัก พวกเขาใช้ตรรกะที่กำหนดเองสำหรับสัญญา LearnCoin

  • _beforeTokenTransfer: ฟังก์ชันนี้ถูกเรียกก่อนการโอนโทเค็นใดๆ ช่วยให้มั่นใจได้ว่าการโอนโทเค็นจะไม่ถูกหยุดชั่วคราว
  • _afterTokenTransfer: ฟังก์ชันนี้ถูกเรียกหลังจากการโอนโทเค็น ที่นี่เป็นฟังก์ชันว่างเปล่า แต่ใช้กับตรรกะที่กำหนดเองได้ซึ่งควรจะเกิดขึ้นทันทีหลังจากการโอน
  • _mint: ฟังก์ชันนี้สร้างโทเค็นใหม่และกำหนดให้กับบัญชีที่กำหนด
  • _burn: ฟังก์ชั่นนี้จะทำลายโทเค็นจากบัญชีที่กำหนด

บทสรุป

นี่เป็นภาพรวมโดยย่อของสัญญา LearnCoin ของคุณ เมื่อใช้งานสัญญาแล้ว ตอนนี้คุณก็พร้อมที่จะโต้ตอบกับสัญญาแล้ว ซึ่งเราจะกล่าวถึงในบทเรียนถัดไป

ข้อจำกัดความรับผิด
* การลงทุนคริปโตมีความเสี่ยงสูง โปรดดำเนินการด้วยความระมัดระวัง หลักสูตรนี้ไม่ได้มีไว้เพื่อเป็นคำแนะนำในการลงทุน
* หลักสูตรนี้สร้างขึ้นโดยผู้เขียนที่ได้เข้าร่วม Gate Learn ความคิดเห็นของผู้เขียนไม่ได้มาจาก Gate Learn
แคตตาล็อก
บทเรียนที่ 4

สำรวจสัญญา LearnCoin

เมื่อสิ้นสุดบทเรียนนี้ คุณควรจะสามารถ: 1. ทำความเข้าใจส่วนสำคัญและฟังก์ชันการทำงานของสัญญา LearnCoin 2. ทำความเข้าใจบทบาทของสัญญาและไลบรารีของ OpenZeppelin ในสัญญาโทเค็นของเรา

แนะนำสกุลเงิน

ในบทเรียนที่แล้ว เราได้ปรับใช้สัญญา LearnCoin กับ Goerli Testnet ในบทนี้ เราจะสำรวจโดยละเอียดเกี่ยวกับฟังก์ชันการทำงานของสัญญา LearnCoin และอธิบายว่าแต่ละส่วนทำหน้าที่อะไร

โครงสร้างสัญญา

นี่คือสัญญาฉบับเต็มของ LearnCoin ของเรา

Python 
 // SPDX-License-Identifier: ไม่มี 
 ความแข็งแกร่งของ pragma ^0.8.9; 

 นำเข้า "@openzeppelin/contracts/token/ERC20/ERC20.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
นำเข้า "@openzeppelin/contracts/access/AccessControl.sol";
นำเข้า "@openzeppelin/contracts/security/Pausable.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
นำเข้า "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";

สัญญา LearnCoin คือ ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint { 
 bytes32 public Constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE"); 
 bytes32 ค่าคงที่สาธารณะ PAUSER_ROLE = keccak256("PAUSER_ROLE"); 

 ตัวสร้าง () ERC20 ("เรียนรู้เหรียญ", "LC") ERC20Permit ("เรียนรู้เหรียญ") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    ฟังก์ชั่นสแนปชอต () สาธารณะ onlyRole (SNAPSHOT_ROLE) {
        _snapshot();
    }

    ฟังก์ชั่นหยุดชั่วคราว () สาธารณะ onlyRole (PAUSER_ROLE) {
        _pause();
    }

    ฟังก์ชั่น unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    ฟังก์ชั่น _beforeTokenTransfer(ที่อยู่จาก, ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 whenNotPaused 
 override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // ฟังก์ชั่นต่อไปนี้ถูกแทนที่ ต้องการโดย Solidity

    ฟังก์ชั่น _afterTokenTransfer (ที่อยู่จาก, ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 การแทนที่ (ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    ฟังก์ชั่น _mint (ที่อยู่ถึง, จำนวน uint256) 
 ภายใน 
 การแทนที่ (ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    ฟังก์ชั่น _burn (บัญชีที่อยู่จำนวน uint256) 
 การแทนที่ 
 ภายใน (ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

สัญญาที่คุณปรับใช้คือสัญญาโทเค็น ERC20 ชื่อ LearnCoin ประกอบด้วยคุณลักษณะหลายประการจากไลบรารีสัญญาของ OpenZeppelin เช่น โทเค็นที่เบิร์นได้ สแน็ปช็อต การควบคุมการเข้าถึง โทเค็นที่หยุดชั่วคราว ฟังก์ชันการอนุญาต การโหวต และแฟลชมินต์

คำชี้แจงการนำเข้าตามสัญญา

คำสั่งนำเข้าที่จุดเริ่มต้นของสัญญาดึงโค้ดจากไลบรารีสัญญาของ OpenZeppelin:

  • ERC20.sol เป็นสัญญาพื้นฐานสำหรับโทเค็น ERC20
  • ERC20Burnable.sol เพิ่มความสามารถให้ผู้ถือโทเค็นสามารถทำลายโทเค็นของตนเองได้
  • ERC20Snapshot.sol ช่วยให้สามารถสร้างสแนปช็อตของยอดโทเค็นได้
  • AccessControl.sol เป็นโมดูลสัญญาสำหรับจัดการการเข้าถึงฟังก์ชันการทำงานบางอย่าง
  • Pausable.sol เพิ่มความสามารถในการหยุดชั่วคราวและยกเลิกการหยุดการโอนโทเค็นชั่วคราว
  • ERC20Permit.sol ช่วยให้ผู้ถือสามารถใช้โทเค็นของผู้ใช้ผ่านใบอนุญาตได้
  • ERC20Votes.sol เพิ่มความสามารถในการลงคะแนนให้กับโทเค็น
  • ERC20FlashMint.sol ช่วยให้สามารถสร้างโทเค็นแบบแฟลชได้

การประกาศสัญญา LearnCoin

สัญญา LearnCoin สืบทอดมาจากสัญญา OpenZeppelin ที่นำเข้า ซึ่งหมายความว่าจะมีวิธีการและคุณสมบัติทั้งหมดจากสัญญาเหล่านั้น

การประกาศบทบาท

SNAPSHOT_ROLE และ PAUSER_ROLE เป็นค่าคงที่ (สร้างโดยใช้ฟังก์ชันแฮช keccak256 ) ที่แสดงบทบาทเฉพาะสำหรับการควบคุมการเข้าถึงภายในสัญญา

ฟังก์ชั่นตัวสร้าง

เมื่อสัญญา LearnCoin ถูกปรับใช้ ฟังก์ชันตัวสร้างจะถูกเรียก โดยจะตั้งชื่อและสัญลักษณ์ของโทเค็น มอบบทบาทผู้ดูแลระบบ สแน็ปช็อต และตัวหยุดชั่วคราวให้กับบัญชีที่ใช้งาน (msg.sender) และสร้างโทเค็นเริ่มต้นให้กับบัญชีที่ใช้งาน

ฟังก์ชั่นเพิ่มเติม

snapshot pause และ unpause เป็นฟังก์ชันที่อนุญาตให้บัญชีที่มีบทบาทที่เกี่ยวข้องสามารถดำเนินการบางอย่างได้ snapshot ช่วยให้สามารถสร้างสแน็ปช็อต pause และ unpause การหยุดชั่วคราว อนุญาตให้หยุดและรีสตาร์ทการถ่ายโอนโทเค็น

แทนที่

ฟังก์ชัน _beforeTokenTransfer, _afterTokenTransfer, _mint และ _burn เป็นฟังก์ชันภายในที่ถูกแทนที่จากสัญญาหลัก พวกเขาใช้ตรรกะที่กำหนดเองสำหรับสัญญา LearnCoin

  • _beforeTokenTransfer: ฟังก์ชันนี้ถูกเรียกก่อนการโอนโทเค็นใดๆ ช่วยให้มั่นใจได้ว่าการโอนโทเค็นจะไม่ถูกหยุดชั่วคราว
  • _afterTokenTransfer: ฟังก์ชันนี้ถูกเรียกหลังจากการโอนโทเค็น ที่นี่เป็นฟังก์ชันว่างเปล่า แต่ใช้กับตรรกะที่กำหนดเองได้ซึ่งควรจะเกิดขึ้นทันทีหลังจากการโอน
  • _mint: ฟังก์ชันนี้สร้างโทเค็นใหม่และกำหนดให้กับบัญชีที่กำหนด
  • _burn: ฟังก์ชั่นนี้จะทำลายโทเค็นจากบัญชีที่กำหนด

บทสรุป

นี่เป็นภาพรวมโดยย่อของสัญญา LearnCoin ของคุณ เมื่อใช้งานสัญญาแล้ว ตอนนี้คุณก็พร้อมที่จะโต้ตอบกับสัญญาแล้ว ซึ่งเราจะกล่าวถึงในบทเรียนถัดไป

ข้อจำกัดความรับผิด
* การลงทุนคริปโตมีความเสี่ยงสูง โปรดดำเนินการด้วยความระมัดระวัง หลักสูตรนี้ไม่ได้มีไว้เพื่อเป็นคำแนะนำในการลงทุน
* หลักสูตรนี้สร้างขึ้นโดยผู้เขียนที่ได้เข้าร่วม Gate Learn ความคิดเห็นของผู้เขียนไม่ได้มาจาก Gate Learn