NFT Collection Deployment on csc

سلام خدمت جامعه توسعه دهندگان قرار داد های هوشمند ایران
من 0xlive هستم و در این قسمت قصد داریم قرار داد هوشمند یک nft با استاندارد CRC721 رو بنویسیم و روی شبکه تست کوینکس اسمارت چین دیپلوی کنیم

NFT

1*UImFyJMXuGKB0-cDzwH3mQ

در لغت NFT خلاصه شده non-fungible token هستش به معنی غیر مثلی یا تعویض ناپذیر اما این به چه معنی هستش؟
در یک مثال فرض کنید شما به من یک اسکناس صد دلاری میدید. من میتونم قرضی که بهم دادید رو با صد تا اسکناس یک دلاری یا ده تا اسکناس ده دلاری پس بدم اما اگه شما ماشین خودتون رو به من قرض بدید میتونم برم مثل ماشین شما رو بیارم بهتون بدم؟ یا مثلا وقتی بهم یه پژو میدید در عوضش دوتا پراید بهتون بدم؟ غیر مثلی یعنی همین که یک چیز منحصر به فرد و متمایز هست که نمیشه با چیزی دیگه تعویض بشه

CRC721

در واقع CRC-721 همون ERC-721 هستش و C اول نام شبکه کوینکس هست که روی این استاندارد گذاشته شده. از اونجایی که کوینکس اسمارت چین یک شبکه سازگار با ماشین مجازی اتریوم هست و قرار داد های هوشمند در ماشین مجازی اتریوم اجرا میشن هیچ فرقی با اتریوم نداره و در اصل من همین دلیل رو برای اموزش و تست انتخاب کردم.

در اصل یک استاندارد برای ساخت توکن های غیرمثلی روی شبکه اتریوم هستش.

شروع پروژه

اول از همه چیز یک دایرکتوری برای پروژه خودمون میسازیم. پس وارد ترمینال میشیم و تایپ میکنیم:

mkdir crc721

حالا وارد دایرکتوری میشیم و با پکیج منیجر npm یک پروژه رو init میکنیم:

cd hardhat-tutorial
npm init --yes

برای دیپلوی کردن قرار داد های هوشمندمون ما از Hardhat استفاده میکنیم پس با دستور زیر اونو نصب میکنیم:

npm install --save-dev hardhat

برای اجرای hardhat:

npx hardhat

گزینه اول یعنی Create a basic sample project رو انتخاب میکنیم و همشو yes yes میزنیم :smiley: :yum:

نکته: از شما درباره نصب hardhat-waffle , ethereum-waffle and hardhat-ethers میپرسه که خودکار نصب کنه در غیر این صورت هم میتونید با دستور زیر نصبشون کنید:

npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers

حالا میریم که کتابخونه openzeppelin رو نصب کنیم :

npm install @openzeppelin/contracts

حالا یک فایل nft.sol میسازیم و این کد رو مینویسیم :

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

// Import the openzepplin contracts
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

// GameItem is  ERC721 signifies that the contract we are creating imports ERC721 and follows ERC721 contract from openzeppelin
contract nft is ERC721 {

    constructor() ERC721("simple nft", "NFT") {
        // mint an NFT to yourself
        _mint(msg.sender, 1);
    }
}

بریم کد بالا رو تحلیل کنیم.
در خط اول ما لایسنس کدمون رو به زبانی که ماشین بفهمه تعیین کردیم:

// SPDX-License-Identifier: MIT

در خط دوم نسخه ای که کامپایلر باید کد سالیدیتی رو کامپایل کنه تعیین کردیم:

pragma solidity ^0.8.10;

و حالا از کتابخونه openzeppelin استاندارد erc721 رو ایمپورت میکنیم:

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

و در اخر قرار داد هوشمند رو مینویسیم که در اون میگیم یک توکن با استاندارد erc721 با نام simple nft و نماد NFT رو ایجاد میکنه و به کیف پول کسی که قرار داد رو دیپلوی کرده میفرسته

contract nft is ERC721 {

    constructor() ERC721("simple nft", "NFT") {
        // mint an NFT to yourself
        _mint(msg.sender, 1);
    }
}

حالا وقت اون رسیده که قرار دادمون رو با کمک hardhat کامپایل کنیم:

npx hardhat compile

پیکربندی هاردهت
برای اتوماتیک کردن پروسه کامپایل و دیپلوی از هاردهت استفاده میکنیم
قبل از هرچیز در دایرکتوری scripts یک فایل run.js ایجاد میکنیم حاوی کد زیر:

const { ethers } = require("hardhat");

async function main() {
  /*
A ContractFactory in ethers.js is an abstraction used to deploy new smart contracts,
so nftContract here is a factory for instances of our GameItem contract.
*/
  const nftContract = await ethers.getContractFactory("NFT");

  // here we deploy the contract
  const deployedNFTContract = await nftContract.deploy();

  // print the address of the deployed contract
  console.log("NFT Contract Address:", deployedNFTContract.address);
}

// Call the main function and catch if there is any error
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

حالا فایل hardhat.config.json باید به این شکل باشه:

require("@nomiclabs/hardhat-waffle");// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();for (const account of accounts) {
    console.log(account.address);
  }
});module.exports = {
  solidity: "0.8.10",
  networks: {
    csc: {
      url: "https://testnet-rpc.coinex.net",
      accounts: ["YOUR-PRIVATE_KEY"],
    }
  }
};

حالا اسکریپتمون رو برای دیپلوی روی شبکه تست اجرا میکنیم:

npx hardhat run scripts/run.js --network csc

تبریک میگم ما موفق شدیم :partying_face:

همین مقاله رو به زبان انگلیسی میتونید از مدیوم و انتشارات coinsmonks بخونید:

https://medium.com/coinmonks/nft-collection-deployment-on-csc-6d41ce988a40

1 پسندیده