سلام خدمت جامعه توسعه دهندگان قرار داد های هوشمند ایران
من 0xlive هستم و در این قسمت قصد داریم قرار داد هوشمند یک nft با استاندارد CRC721 رو بنویسیم و روی شبکه تست کوینکس اسمارت چین دیپلوی کنیم
NFT
در لغت 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 میزنیم
نکته: از شما درباره نصب 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
تبریک میگم ما موفق شدیم
همین مقاله رو به زبان انگلیسی میتونید از مدیوم و انتشارات coinsmonks بخونید:
https://medium.com/coinmonks/nft-collection-deployment-on-csc-6d41ce988a40