ไทย

สำรวจความซับซ้อนของ ERC-721 smart contract สำหรับ NFT เรียนรู้สถาปัตยกรรม การนำไปใช้ ข้อควรพิจารณาด้านความปลอดภัย และการประยุกต์ใช้ในโลกจริง

NFT Smart Contracts: เจาะลึกการนำมาตรฐาน ERC-721 ไปใช้งาน

Non-Fungible Tokens (NFTs) ได้ปฏิวัติวงการสินทรัพย์ดิจิทัล ทำให้สามารถใช้แสดงแทนสิ่งของที่มีเอกลักษณ์เฉพาะตัวบนบล็อกเชนได้ หัวใจสำคัญของ NFT ส่วนใหญ่คือมาตรฐาน ERC-721 ซึ่งเป็นชุดของกฎเกณฑ์ที่ควบคุมวิธีการสร้าง จัดการ และโอนย้ายโทเคนเหล่านี้ คู่มือฉบับสมบูรณ์นี้จะพาคุณไปสำรวจ ERC-721 smart contract อย่างเจาะลึก ครอบคลุมทั้งสถาปัตยกรรม รายละเอียดการนำไปใช้ ข้อควรพิจารณาด้านความปลอดภัย และการประยุกต์ใช้ในทางปฏิบัติ

ERC-721 คืออะไร?

ERC-721 คือมาตรฐานสำหรับการแสดงโทเคนที่ทดแทนกันไม่ได้ (non-fungible tokens) บนบล็อกเชน Ethereum ซึ่งแตกต่างจากโทเคน ERC-20 ที่สามารถทดแทนกันได้ (fungible) (หมายความว่าแต่ละโทเคนเหมือนกันทุกประการ) โทเคน ERC-721 นั้นมีเอกลักษณ์เฉพาะตัว แต่ละโทเคนมี ID ที่แตกต่างกัน ทำให้เหมาะสำหรับการแสดงความเป็นเจ้าของสินทรัพย์ดิจิทัลหรือสินทรัพย์ทางกายภาพที่มีลักษณะเฉพาะ

คุณลักษณะสำคัญของโทเคน ERC-721:

สถาปัตยกรรมของ ERC-721 Smart Contract

ERC-721 smart contract คือโปรแกรมภาษา Solidity ที่นำมาตรฐาน ERC-721 มาใช้งาน โดยทั่วไปประกอบด้วยส่วนประกอบดังต่อไปนี้:

ฟังก์ชันหลัก (Core Functions):

ส่วนขยายเมทาดาทา (Metadata Extension) (ทางเลือก):

ส่วนขยายการแจกแจง (Enumeration Extension) (ทางเลือก):

การสร้าง ERC-721 Smart Contract ด้วย OpenZeppelin

OpenZeppelin มีไลบรารีของ smart contract ที่ปลอดภัยและผ่านการตรวจสอบแล้ว ซึ่งช่วยให้การพัฒนาโทเคน ERC-721 ง่ายขึ้น การใช้ ERC721 ของ OpenZeppelin ช่วยลดความเสี่ยงในการเกิดช่องโหว่ในโค้ดของคุณ นี่คือตัวอย่างวิธีการสร้าง ERC-721 smart contract โดยใช้ OpenZeppelin:

สิ่งที่ต้องมีก่อน (Prerequisites):

ขั้นตอน:

  1. เริ่มต้นโปรเจกต์ Truffle หรือ Hardhat:
# สำหรับ Truffle
mkdir my-nft-project
cd my-nft-project
truffle init

# สำหรับ Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
  1. ติดตั้ง OpenZeppelin Contracts:
npm install @openzeppelin/contracts
  1. สร้าง ERC-721 Smart Contract: สร้างไฟล์ Solidity ใหม่ (เช่น `MyNFT.sol`) ในไดเรกทอรี `contracts` ของคุณ
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string private _baseURI;

    constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
        _baseURI = baseURI;
    }

    function mintNFT(address recipient) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));

        return newItemId;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        return string(abi.encodePacked(_tokenURI));
    }

    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory baseURI) public {
        _baseURI = baseURI;
    }



    // ฟังก์ชันต่อไปนี้เป็นการ override ที่จำเป็นสำหรับ Solidity

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

import "@openzeppelin/contracts/utils/Strings.sol";
  1. คอมไพล์ Smart Contract: ใช้ Truffle หรือ Hardhat เพื่อคอมไพล์ smart contract ของคุณ
# สำหรับ Truffle
truffle compile

# สำหรับ Hardhat
npx hardhat compile
  1. สร้างสคริปต์ Deployment: สร้างไฟล์ JavaScript ใหม่ (เช่น `deploy.js`) ในไดเรกทอรี `migrations` หรือ `scripts` ของคุณ
// ตัวอย่างสคริปต์ Migration ของ Truffle
const MyNFT = artifacts.require("MyNFT");

module.exports = async function (deployer) {
  await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};

// ตัวอย่างสคริปต์ Deployment ของ Hardhat
async function main() {
  const MyNFT = await ethers.getContractFactory("MyNFT");
  const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");

  await myNFT.deployed();

  console.log("MyNFT deployed to:", myNFT.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. ปรับใช้ Smart Contract: ปรับใช้ smart contract ของคุณไปยังบล็อกเชนในเครื่อง (เช่น Ganache) หรือเครือข่ายทดสอบ (เช่น Ropsten, Rinkeby)
# สำหรับ Truffle
truffle migrate

# สำหรับ Hardhat
npx hardhat run scripts/deploy.js --network localhost

อย่าลืมแทนที่ `ipfs://YOUR_IPFS_CID/` ด้วย IPFS CID (Content Identifier) จริงของคุณ Base URI นี้จะชี้ไปยังตำแหน่งที่ไฟล์ JSON เมทาดาทาของ NFT ของคุณจะถูกจัดเก็บ

การจัดเก็บเมทาดาทาของ NFT บน IPFS

โดยทั่วไปเมทาดาทาของ NFT จะถูกจัดเก็บไว้นอกเชน (off-chain) เพื่อลดค่าใช้จ่ายในการจัดเก็บข้อมูลบนบล็อกเชน IPFS (InterPlanetary File System) เป็นเครือข่ายจัดเก็บข้อมูลแบบกระจายศูนย์ที่นิยมใช้ในการจัดเก็บเมทาดาทาของ NFT โดยแต่ละ NFT จะมี `tokenURI` ที่ชี้ไปยังไฟล์ JSON บน IPFS ซึ่งประกอบด้วยเมทาดาทาเกี่ยวกับ NFT นั้นๆ เช่น ชื่อ, คำอธิบาย, URL รูปภาพ และคุณลักษณะอื่นๆ

ตัวอย่างเมทาดาทาของ NFT (JSON):

{
  "name": "NFT สุดเจ๋งของฉัน",
  "description": "นี่คือ NFT ที่มีเอกลักษณ์ไม่เหมือนใคร",
  "image": "ipfs://YOUR_IPFS_CID/image.png",
  "attributes": [
    {
      "trait_type": "พื้นหลัง",
      "value": "สีน้ำเงิน"
    },
    {
      "trait_type": "ตัวละคร",
      "value": "หุ่นยนต์"
    }
  ]
}

แทนที่ `ipfs://YOUR_IPFS_CID/image.png` ด้วย IPFS CID จริงของรูปภาพของคุณ

ขั้นตอนการอัปโหลดเมทาดาทาไปยัง IPFS:

  1. เลือก IPFS Client: เลือกใช้ IPFS client เช่น IPFS Desktop, Pinata หรือ NFT.Storage
  2. อัปโหลดเมทาดาทาของคุณ: อัปโหลดไฟล์ JSON เมทาดาทาและรูปภาพของ NFT ไปยัง IPFS โดยใช้ client ที่คุณเลือก
  3. รับ IPFS CID: หลังจากอัปโหลดเมทาดาทาแล้ว คุณจะได้รับ IPFS CID ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันสำหรับข้อมูลของคุณบน IPFS
  4. อัปเดต Smart Contract: อัปเดตฟังก์ชัน `tokenURI` ใน smart contract ของคุณให้ชี้ไปยัง IPFS CID ของคุณ

ข้อควรพิจารณาด้านความปลอดภัยสำหรับ ERC-721 Smart Contract

ความปลอดภัยเป็นสิ่งสำคัญที่สุดในการพัฒนา ERC-721 smart contract ต่อไปนี้คือข้อควรพิจารณาด้านความปลอดภัยที่สำคัญ:

การประยุกต์ใช้ ERC-721 NFT ในโลกแห่งความเป็นจริง

ERC-721 NFT ถูกนำไปใช้ในแอปพลิเคชันที่หลากหลาย รวมถึง:

ตัวอย่างในระดับนานาชาติ:

แนวคิด ERC-721 ขั้นสูง

ERC-721A

ERC-721A เป็นการนำมาตรฐาน ERC-721 มาใช้งานอย่างมีประสิทธิภาพด้าน gas มากขึ้น ซึ่งปรับให้เหมาะสมกับการสร้าง NFT หลายรายการในธุรกรรมเดียว โดยจะลดค่า gas ด้วยการกระจายต้นทุนการจัดเก็บข้อมูลไปยังโทเคนหลายๆ อัน ซึ่งจะเป็นประโยชน์สำหรับโปรเจกต์ที่เกี่ยวข้องกับการสร้าง NFT จำนวนมาก

Lazy Minting

Lazy minting คือเทคนิคที่ NFT จะถูกสร้างขึ้นก็ต่อเมื่อมีการซื้อเท่านั้น ซึ่งสามารถประหยัดค่า gas สำหรับโปรเจกต์ที่มี NFT จำนวนมากแต่ไม่คาดว่าทั้งหมดจะถูกขายได้ เมทาดาทาของ NFT จะถูกจัดเก็บไว้นอกเชนจนกว่า NFT จะถูกซื้อ เมื่อถึงจุดนั้นโทเคนจะถูกสร้างและเมทาดาทาจะถูกเพิ่มเข้าไปในบล็อกเชน

Soulbound Tokens

Soulbound tokens คือ NFT ที่ผูกติดกับที่อยู่ใดที่อยู่หนึ่งอย่างถาวรและไม่สามารถโอนย้ายได้ โทเคนเหล่านี้สามารถใช้เพื่อแสดงข้อมูลรับรองที่ไม่สามารถโอนย้ายได้ เช่น ปริญญาบัตร ใบรับรองวิชาชีพ หรือการเป็นสมาชิกในชุมชน ซึ่งทำได้โดยการลบหรือจำกัดฟังก์ชัน `transferFrom`

อนาคตของ ERC-721 และ NFT

มาตรฐาน ERC-721 ยังคงมีการพัฒนาอย่างต่อเนื่อง โดยมีการวิจัยและพัฒนาอย่างไม่หยุดยั้งเพื่อปรับปรุงประสิทธิภาพ ความปลอดภัย และฟังก์ชันการทำงาน การพัฒนาในอนาคตอาจรวมถึง:

บทสรุป

ERC-721 smart contract เป็นเครื่องมือที่ทรงพลังสำหรับการแสดงความเป็นเจ้าของสินทรัพย์ดิจิทัลและสินทรัพย์ทางกายภาพที่มีเอกลักษณ์บนบล็อกเชน ด้วยการทำความเข้าใจสถาปัตยกรรม รายละเอียดการนำไปใช้ ข้อควรพิจารณาด้านความปลอดภัย และการประยุกต์ใช้ในทางปฏิบัติ นักพัฒนาสามารถสร้างโปรเจกต์ NFT ที่สร้างสรรค์และมีผลกระทบได้ ในขณะที่ระบบนิเวศของ NFT เติบโตและพัฒนาอย่างต่อเนื่อง มาตรฐาน ERC-721 จะมีบทบาทสำคัญในการกำหนดอนาคตของความเป็นเจ้าของในโลกดิจิทัล

คู่มือนี้เป็นรากฐานที่มั่นคงสำหรับความเข้าใจและการนำ ERC-721 smart contract ไปใช้ อย่าลืมให้ความสำคัญกับความปลอดภัยเสมอและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเมื่อพัฒนาและปรับใช้โปรเจกต์ NFT ของคุณเอง ขอให้โชคดี!

NFT Smart Contracts: เจาะลึกการนำมาตรฐาน ERC-721 ไปใช้งาน | MLOG