কীভাবে একটি NFT লিখবেন এবং ডিপ্লয় করবেন (NFT টিউটোরিয়াল সিরিজের পর্ব 1/3)
নন-ফাঞ্জিবল টোকেন (NFT)-গুলো ব্লকচেইন-কে সাধারণ মানুষের নজরে নিয়ে আসার সাথে সাথে, ইথেরিয়াম ব্লকচেইন-এ আপনার নিজস্ব NFT কন্ট্রাক্ট (ERC-721 টোকেন) প্রকাশ করে এই উন্মাদনাটি নিজে বোঝার জন্য এখন একটি চমৎকার সুযোগ!
এই টিউটোরিয়ালে, আমরা মেটামাস্ক (নতুন ট্যাবে খোলে), Solidity (নতুন ট্যাবে খোলে), Hardhat (নতুন ট্যাবে খোলে), Pinata (নতুন ট্যাবে খোলে) এবং Alchemy (নতুন ট্যাবে খোলে) ব্যবহার করে Sepolia টেস্ট নেটওয়ার্ক-এ একটি ERC-721 স্মার্ট কন্ট্রাক্ট তৈরি এবং ডিপ্লয় করার ধাপগুলো দেখব (যদি আপনি এখনও এগুলোর মানে না বোঝেন তবে চিন্তা করবেন না — আমরা এটি ব্যাখ্যা করব!)।
এই টিউটোরিয়ালের পর্ব 2-এ আমরা দেখব কীভাবে আমরা আমাদের স্মার্ট কন্ট্রাক্ট ব্যবহার করে একটি NFT মিন্ট করতে পারি, এবং পর্ব 3-এ আমরা ব্যাখ্যা করব কীভাবে মেটামাস্ক-এ আপনার NFT দেখতে হয়।
এবং অবশ্যই, যদি কোনো পর্যায়ে আপনার প্রশ্ন থাকে, তবে Alchemy ডিসকর্ড (নতুন ট্যাবে খোলে)-এ যোগাযোগ করতে দ্বিধা করবেন না বা Alchemy-এর NFT অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (এপিআই) ডক্স (নতুন ট্যাবে খোলে) ভিজিট করুন!
ধাপ 1: ইথেরিয়াম নেটওয়ার্ক-এর সাথে কানেক্ট করুন
ইথেরিয়াম ব্লকচেইন-এ রিকোয়েস্ট করার অনেক উপায় আছে, কিন্তু কাজ সহজ করার জন্য, আমরা Alchemy (নতুন ট্যাবে খোলে)-তে একটি ফ্রি অ্যাকাউন্ট ব্যবহার করব, যা একটি ব্লকচেইন ডেভেলপার প্ল্যাটফর্ম এবং API যা আমাদের নিজস্ব নোড না চালিয়েই ইথেরিয়াম চেইন-এর সাথে যোগাযোগ করতে দেয়।
এই টিউটোরিয়ালে, আমরা আমাদের স্মার্ট কন্ট্রাক্ট ডিপ্লয়মেন্ট-এর ভেতরে কীভাবে কাজ হচ্ছে তা বোঝার জন্য মনিটরিং এবং অ্যানালিটিক্স-এর জন্য Alchemy-এর ডেভেলপার টুলগুলোর সুবিধাও নেব। যদি আপনার আগে থেকেই কোনো Alchemy অ্যাকাউন্ট না থাকে, তবে আপনি বিনামূল্যে এখানে (নতুন ট্যাবে খোলে) সাইন আপ করতে পারেন।
ধাপ 2: আপনার অ্যাপ (এবং অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (এপিআই) কী) তৈরি করুন
একবার আপনি একটি Alchemy অ্যাকাউন্ট তৈরি করলে, আপনি একটি অ্যাপ তৈরি করে একটি এপিআই কী জেনারেট করতে পারেন। এটি আমাদের Sepolia টেস্ট নেটওয়ার্ক-এ রিকোয়েস্ট করার অনুমতি দেবে। আপনি যদি টেস্ট নেটওয়ার্কগুলো সম্পর্কে আরও জানতে আগ্রহী হন তবে এই গাইডটি (নতুন ট্যাবে খোলে) দেখুন।
- ন্যাভ বার-এ "Select an app" নির্বাচন করে এবং "Create new app"-এ ক্লিক করে আপনার Alchemy ড্যাশবোর্ড-এর "Create new app" পেজে যান
-
আপনার অ্যাপের নাম দিন (আমরা “My First NFT!” বেছে নিয়েছি), একটি ছোট বিবরণ দিন এবং একটি ইউজ কেস বেছে নিন। এরপর, "Ethereum" সার্চ করুন এবং নেটওয়ার্ক নির্বাচন করুন। আমরা Sepolia ব্যবহার করব, যা অ্যাপ্লিকেশন ডেভেলপমেন্ট-এর জন্য প্রস্তাবিত টেস্টনেট (দেখুন ইথেরিয়াম নেটওয়ার্ক)।
-
এগিয়ে যেতে "Next"-এ ক্লিক করুন, তারপর “Create app” এবং হয়ে গেল! আপনার অ্যাপটি ন্যাভ বার ড্রপডাউন মেনুতে উপস্থিত হওয়া উচিত, যেখানে কপি করার জন্য একটি এপিআই কী (API Key) উপলব্ধ থাকবে।
ধাপ 3: একটি ইথেরিয়াম অ্যাকাউন্ট (ঠিকানা) তৈরি করুন
ট্রানজ্যাকশন পাঠানো এবং গ্রহণ করার জন্য আমাদের একটি ইথেরিয়াম অ্যাকাউন্ট প্রয়োজন। এই টিউটোরিয়ালের জন্য, আমরা মেটামাস্ক ব্যবহার করব, যা ব্রাউজারে একটি ভার্চুয়াল ওয়ালেট এবং আপনার ইথেরিয়াম অ্যাকাউন্ট ঠিকানা পরিচালনা করতে ব্যবহৃত হয়। আপনি যদি ইথেরিয়াম-এ ট্রানজ্যাকশন কীভাবে কাজ করে সে সম্পর্কে আরও বুঝতে চান, তবে ইথেরিয়াম ফাউন্ডেশন-এর এই পেজটি দেখুন।
আপনি বিনামূল্যে এখানে (নতুন ট্যাবে খোলে) একটি মেটামাস্ক অ্যাকাউন্ট ডাউনলোড এবং তৈরি করতে পারেন। যখন আপনি একটি অ্যাকাউন্ট তৈরি করছেন, বা যদি আপনার আগে থেকেই একটি অ্যাকাউন্ট থাকে, তবে নেটওয়ার্ক নির্বাচন মেনু ব্যবহার করে "Sepolia" টেস্ট নেটওয়ার্ক-এ স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। যদি আপনি Sepolia তালিকাভুক্ত না দেখেন, তবে উপরের ডানদিকের কোণায় মেনুটি খুলুন, "Networks" নির্বাচন করুন এবং "Show test networks" টগল অন করুন (দেখুন টেস্টনেট দেখার জন্য মেটামাস্ক-এর গাইড (নতুন ট্যাবে খোলে))।
ধাপ 4: একটি ফসেট থেকে ইথার যোগ করুন
টেস্ট নেটওয়ার্ক-এ আমাদের স্মার্ট কন্ট্রাক্ট ডিপ্লয় করার জন্য, আমাদের কিছু নকল ETH প্রয়োজন হবে। Sepolia ETH পেতে, Sepolia নেটওয়ার্ক বিবরণ-এ তালিকাভুক্ত ফসেট-গুলোর মধ্যে একটি বেছে নিন এবং আপনার অ্যাকাউন্ট ঠিকানা লিখুন। যদি একটি কাজ না করে, তবে অন্যটি চেষ্টা করুন কারণ সেগুলো মাঝে মাঝে খালি হয়ে যেতে পারে, এবং কিছু ফসেট-এর যোগ্যতার নিয়ম রয়েছে: উদাহরণস্বরূপ, Alchemy Sepolia ফসেট (নতুন ট্যাবে খোলে)-এর জন্য গ্রহণকারী ঠিকানায় ইথেরিয়াম মেইননেট-এ কমপক্ষে 0.001 ETH থাকা প্রয়োজন। এর কিছুক্ষণ পরেই আপনার মেটামাস্ক অ্যাকাউন্ট-এ ETH দেখতে পাওয়া উচিত!
ধাপ 5: আপনার ব্যালেন্স চেক করুন
আমাদের ব্যালেন্স সেখানে আছে কিনা তা নিশ্চিত করতে, চলুন Alchemy-এর স্যান্ডবক্স টুল (নতুন ট্যাবে খোলে) ব্যবহার করে একটি eth_getBalance (নতুন ট্যাবে খোলে) রিকোয়েস্ট করি। এটি আমাদের ওয়ালেট-এ থাকা ETH-এর পরিমাণ রিটার্ন করবে। আপনার মেটামাস্ক অ্যাকাউন্ট ঠিকানা ইনপুট করার পর এবং “Send Request”-এ ক্লিক করার পর, আপনি এরকম একটি রেসপন্স দেখতে পাবেন:
{ "jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000" }
নোট এই ফলাফলটি Wei-তে, ETH-এ নয়। Wei-কে ইথার-এর সবচেয়ে ছোট একক হিসেবে ব্যবহার করা হয়। Wei থেকে ETH-এ রূপান্তর হলো 1 eth = 1018 Wei। তাই যদি আমরা 0xde0b6b3a7640000-কে ডেসিমালে রূপান্তর করি তবে আমরা 1*1018 Wei পাই, যা 1 ETH-এর সমান।
যাক! আমাদের সব নকল টাকা সেখানেই আছে।
ধাপ 6: আমাদের প্রজেক্ট ইনিশিয়ালাইজ করুন
প্রথমে, আমাদের প্রজেক্টের জন্য একটি ফোল্ডার তৈরি করতে হবে। আপনার কমান্ড লাইনে যান এবং টাইপ করুন:
mkdir my-nft
cd my-nft
এখন যেহেতু আমরা আমাদের প্রজেক্ট ফোল্ডারের ভেতরে আছি, আমরা প্রজেক্টটি ইনিশিয়ালাইজ করতে npm init ব্যবহার করব। যদি আপনার আগে থেকে npm ইনস্টল করা না থাকে, তবে Node.js ইনস্টলেশন নির্দেশাবলী (নতুন ট্যাবে খোলে) অনুসরণ করুন (এই টিউটোরিয়ালের জন্য আমাদের Node.js এবং npm প্রয়োজন হবে)।
npm init
আপনি ইনস্টলেশন প্রশ্নগুলোর উত্তর কীভাবে দিচ্ছেন তা খুব একটা গুরুত্বপূর্ণ নয়; রেফারেন্সের জন্য আমরা কীভাবে এটি করেছি তা নিচে দেওয়া হলো:
package name: (my-nft)
version: (1.0.0)
description: My first NFT!
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/thesuperb1/Desktop/my-nft/package.json:
{
"name": "my-nft",
"version": "1.0.0",
"description": "My first NFT!",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
package.json অনুমোদন করুন। Hardhat 3, যা আমরা পরবর্তীতে ইনস্টল করব, শুধুমাত্র ES মডিউল প্রজেক্ট সমর্থন করে, তাই প্রজেক্টটিকে সেভাবে চিহ্নিত করুন:
npm pkg set type=module
এবং আমরা কাজ শুরু করার জন্য প্রস্তুত!
ধাপ 7: Hardhat (নতুন ট্যাবে খোলে) ইনস্টল করুন
Hardhat হলো আপনার ইথেরিয়াম সফটওয়্যার কম্পাইল, ডিপ্লয়, টেস্ট এবং ডিবাগ করার জন্য একটি ডেভেলপমেন্ট এনভায়রনমেন্ট। এটি লাইভ চেইন-এ ডিপ্লয় করার আগে স্থানীয়ভাবে স্মার্ট কন্ট্রাক্ট এবং বিকেন্দ্রীকৃত অ্যাপ্লিকেশন (dapp) তৈরি করার সময় ডেভেলপারদের সাহায্য করে।
Hardhat 3-এর জন্য Node.js v22.13.0 বা তার পরের সংস্করণ প্রয়োজন। আমাদের my-nft প্রজেক্টের ভেতরে রান করুন:
npm install --save-dev hardhat
ইনস্টলেশন নির্দেশাবলী (নতুন ট্যাবে খোলে) সম্পর্কে আরও বিস্তারিত জানতে এই পেজটি দেখুন।
ধাপ 8: Hardhat প্রজেক্ট তৈরি করুন
npx hardhat --init রান করলে একটি সম্পূর্ণ নমুনা প্রজেক্ট তৈরি হবে, কিন্তু এই টিউটোরিয়ালের জন্য আমরা সবকিছু ম্যানুয়ালি সেট আপ করব যাতে আপনি প্রতিটি অংশ দেখতে পারেন। আপনার প্রজেক্ট ফোল্ডারের রুট ডিরেক্টরিতে, নিচের বিষয়বস্তুসহ hardhat.config.js নামের একটি ফাইল তৈরি করুন:
import { defineConfig } from "hardhat/config"
export default defineConfig({
solidity: "0.8.34",
})
এখানেই আমরা আমাদের প্রজেক্টের জন্য সমস্ত সেট আপ নির্দিষ্ট করব (ধাপ 13-এ)। আপাতত, এটি শুধু Hardhat-কে বলে দেয় যে Solidity কম্পাইলার-এর কোন সংস্করণটি ব্যবহার করতে হবে।
ধাপ 9: প্রজেক্ট ফোল্ডার যোগ করুন
আমাদের প্রজেক্ট গুছিয়ে রাখতে, আমরা দুটি নতুন ফোল্ডার তৈরি করব। আপনার কমান্ড লাইনে প্রজেক্টের রুট ডিরেক্টরিতে যান এবং টাইপ করুন:
mkdir contracts
mkdir scripts
-
contracts/ হলো সেই জায়গা যেখানে আমরা আমাদের নন-ফাঞ্জিবল টোকেন (NFT) স্মার্ট কন্ট্রাক্ট কোড রাখব
-
scripts/ হলো সেই জায়গা যেখানে আমরা আমাদের স্মার্ট কন্ট্রাক্ট ডিপ্লয় এবং এর সাথে ইন্টারঅ্যাক্ট করার জন্য স্ক্রিপ্টগুলো রাখব
ধাপ 10: আমাদের কন্ট্রাক্ট লিখুন
এখন যেহেতু আমাদের এনভায়রনমেন্ট সেট আপ হয়ে গেছে, চলুন আরও আকর্ষণীয় কাজের দিকে এগিয়ে যাই: আমাদের স্মার্ট কন্ট্রাক্ট কোড লেখা!
আপনার পছন্দের এডিটরে (আমরা VSCode (নতুন ট্যাবে খোলে) পছন্দ করি) my-nft প্রজেক্টটি খুলুন। স্মার্ট কন্ট্রাক্ট-গুলো Solidity নামক একটি ভাষায় লেখা হয়, যা আমরা আমাদের MyNFT.sol স্মার্ট কন্ট্রাক্ট লিখতে ব্যবহার করব।
-
contractsফোল্ডারে যান এবং MyNFT.sol নামে একটি নতুন ফাইল তৈরি করুন -
নিচে আমাদের নন-ফাঞ্জিবল টোকেন (NFT) স্মার্ট কন্ট্রাক্ট কোড দেওয়া হলো, যা আমরা ওপেনজেপেলিন (নতুন ট্যাবে খোলে) লাইব্রেরি-এর ERC-721 ইমপ্লিমেন্টেশন-এর ওপর ভিত্তি করে তৈরি করেছি। নিচের বিষয়বস্তু কপি করে আপনার MyNFT.sol ফাইলে পেস্ট করুন।
// https://docs.openzeppelin.com/contracts/5.x/erc721 এর উপর ভিত্তি করে তৈরি কন্ট্রাক্ট // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; contract MyNFT is ERC721URIStorage, Ownable { uint256 private _nextTokenId; constructor(address initialOwner) ERC721("MyNFT", "NFT") Ownable(initialOwner) {} function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256) { uint256 newItemId = ++_nextTokenId; _mint(recipient, newItemId); _setTokenURI(newItemId, tokenURI); return newItemId; } } -
যেহেতু আমরা ওপেনজেপেলিন কন্ট্রাক্ট লাইব্রেরি থেকে ক্লাস ইনহেরিট করছি, তাই আমাদের ফোল্ডারে লাইব্রেরিটি ইনস্টল করতে আপনার কমান্ড লাইনে
npm install @openzeppelin/contractsরান করুন। এই টিউটোরিয়ালটি ওপেনজেপেলিন কন্ট্রাক্ট 5.x ব্যবহার করে, যার জন্য Solidity 0.8.24 বা তার পরের সংস্করণ প্রয়োজন।
তাহলে, এই কোডটি আসলে কী করে? চলুন এটি লাইন-বাই-লাইন বিশ্লেষণ করি।
আমাদের স্মার্ট কন্ট্রাক্ট-এর একেবারে ওপরে, আমরা তিনটি ওপেনজেপেলিন (নতুন ট্যাবে খোলে) স্মার্ট কন্ট্রাক্ট ক্লাস ইমপোর্ট করি:
-
@openzeppelin/contracts/token/ERC721/ERC721.sol-এ ERC-721 স্ট্যান্ডার্ড-এর ইমপ্লিমেন্টেশন রয়েছে, যা আমাদের NFT স্মার্ট কন্ট্রাক্ট ইনহেরিট করবে। (একটি বৈধ NFT হতে হলে, আপনার স্মার্ট কন্ট্রাক্ট-কে অবশ্যই ERC-721 স্ট্যান্ডার্ড-এর সমস্ত মেথড ইমপ্লিমেন্ট করতে হবে।) ইনহেরিট করা ERC-721 ফাংশনগুলো সম্পর্কে আরও জানতে, এখানে (নতুন ট্যাবে খোলে) ইন্টারফেস ডেফিনিশন দেখুন।
-
@openzeppelin/contracts/access/Ownable.sol আমাদের স্মার্ট কন্ট্রাক্ট-এ অ্যাক্সেস কন্ট্রোল (নতুন ট্যাবে খোলে) সেট আপ করে, যাতে শুধুমাত্র স্মার্ট কন্ট্রাক্ট-এর মালিক (আপনি) NFT মিন্ট করতে পারেন। মালিক হলো কনস্ট্রাক্টর-এ পাস করা
initialOwnerঠিকানা। (উল্লেখ্য, অ্যাক্সেস কন্ট্রোল অন্তর্ভুক্ত করা সম্পূর্ণ আপনার পছন্দের ওপর নির্ভর করে। আপনি যদি চান যে যে কেউ আপনার স্মার্ট কন্ট্রাক্ট ব্যবহার করে একটি NFT মিন্ট করতে পারুক, তবে কন্ট্রাক্ট ডেফিনিশন এবং কনস্ট্রাক্টর থেকেOwnableএবংOwnable(initialOwner)সরিয়ে দিন, এবংmintNFTফাংশন থেকেonlyOwnerসরিয়ে দিন।) -
@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol ERC-721-কে এক্সটেন্ড করে যাতে প্রতিটি টোকেন তার নিজস্ব মেটাডেটা URI সংরক্ষণ করতে পারে, যা আমরা মিন্টিং-এর সময় সেট করি।
আমাদের ইমপোর্ট স্টেটমেন্ট-গুলোর পরে, আমাদের কাস্টম NFT স্মার্ট কন্ট্রাক্ট রয়েছে, যা আশ্চর্যজনকভাবে ছোট — এতে শুধুমাত্র একটি কাউন্টার, একটি কনস্ট্রাক্টর এবং একটি ফাংশন রয়েছে! এটি আমাদের ইনহেরিট করা ওপেনজেপেলিন কন্ট্রাক্ট-গুলোর কারণে সম্ভব হয়েছে, যা একটি NFT তৈরি করার জন্য প্রয়োজনীয় বেশিরভাগ মেথড ইমপ্লিমেন্ট করে, যেমন ownerOf যা NFT-এর মালিককে রিটার্ন করে, এবং transferFrom, যা এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে NFT-এর মালিকানা স্থানান্তর করে।
কাউন্টার, _nextTokenId, মিন্ট করা মোট NFT-এর সংখ্যার হিসাব রাখে এবং আমাদের নতুন NFT-তে ইউনিক আইডি সেট করে। (স্মার্ট কন্ট্রাক্ট ব্যবহার করে মিন্ট করা প্রতিটি NFT-কে অবশ্যই একটি ইউনিক আইডি দিতে হবে—এখানে আমাদের ইউনিক আইডি শুধুমাত্র বিদ্যমান মোট NFT-এর সংখ্যা দ্বারা নির্ধারিত হয়। ++_nextTokenId কাউন্টারটি ব্যবহার করার আগে তা বাড়িয়ে দেয়, তাই আমাদের স্মার্ট কন্ট্রাক্ট দিয়ে মিন্ট করা প্রথম NFT-এর আইডি হয় "1," আমাদের দ্বিতীয় NFT-এর আইডি হয় "2," ইত্যাদি।)
আমাদের ERC-721 কনস্ট্রাক্টর-এ, আপনি লক্ষ্য করবেন যে আমরা 2টি স্ট্রিং পাস করি, “MyNFT” এবং “NFT”। প্রথম ভেরিয়েবলটি হলো স্মার্ট কন্ট্রাক্ট-এর নাম, এবং দ্বিতীয়টি হলো এর প্রতীক। আপনি আপনার ইচ্ছামতো এই ভেরিয়েবলগুলোর নাম দিতে পারেন!
অবশেষে, আমাদের mintNFT(address recipient, string memory tokenURI) ফাংশন রয়েছে যা আমাদের একটি NFT মিন্ট করতে দেয়! আপনি লক্ষ্য করবেন যে এই ফাংশনটি দুটি ভেরিয়েবল গ্রহণ করে:
-
address recipientসেই ঠিকানা নির্দিষ্ট করে যা আপনার সদ্য মিন্ট করা NFT গ্রহণ করবে -
string memory tokenURIহলো একটি স্ট্রিং যা একটি JSON ডকুমেন্টে রিজলভ হওয়া উচিত যা NFT-এর মেটাডেটা বর্ণনা করে। একটি NFT-এর মেটাডেটা সত্যিই এটিকে প্রাণবন্ত করে তোলে, এটিকে কনফিগারযোগ্য বৈশিষ্ট্য যেমন নাম, বিবরণ, ছবি এবং অন্যান্য অ্যাট্রিবিউট রাখার অনুমতি দেয়। এই টিউটোরিয়ালের পর্ব 2-এ, আমরা বর্ণনা করব কীভাবে এই মেটাডেটা কনফিগার করতে হয়।
mintNFT ইনহেরিট করা ERC-721 লাইব্রেরি থেকে কিছু মেথড কল করে, এবং শেষ পর্যন্ত একটি সংখ্যা রিটার্ন করে যা সদ্য মিন্ট করা NFT-এর আইডি উপস্থাপন করে।
ধাপ 11: আপনার প্রজেক্টের সাথে মেটামাস্ক এবং Alchemy কানেক্ট করুন
এখন যেহেতু আমরা একটি মেটামাস্ক ওয়ালেট, Alchemy অ্যাকাউন্ট তৈরি করেছি এবং আমাদের স্মার্ট কন্ট্রাক্ট লিখেছি, এখন এই তিনটিকে কানেক্ট করার সময়।
আপনার ভার্চুয়াল ওয়ালেট থেকে পাঠানো প্রতিটি ট্রানজ্যাকশন-এর জন্য আপনার ইউনিক প্রাইভেট কী ব্যবহার করে একটি স্বাক্ষর প্রয়োজন। আমাদের প্রোগ্রামকে এই অনুমতি দেওয়ার জন্য, আমরা নিরাপদে আমাদের প্রাইভেট কী (এবং Alchemy অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (এপিআই) কী) একটি এনভায়রনমেন্ট ফাইলে সংরক্ষণ করতে পারি।
ট্রানজ্যাকশন পাঠানো সম্পর্কে আরও জানতে, ট্রানজ্যাকশন ডকুমেন্টেশন দেখুন।
আমাদের প্রজেক্টের রুট ডিরেক্টরিতে একটি .env ফাইল তৈরি করুন, এবং এতে আপনার মেটামাস্ক প্রাইভেট কী এবং HTTP Alchemy এপিআই URL যোগ করুন।
-
মেটামাস্ক থেকে আপনার প্রাইভেট কী এক্সপোর্ট করতে এই নির্দেশাবলী (নতুন ট্যাবে খোলে) অনুসরণ করুন
-
HTTP Alchemy এপিআই URL পেতে নিচে দেখুন এবং এটি আপনার ক্লিপবোর্ডে কপি করুন
আপনার .env এখন এরকম দেখতে হওয়া উচিত:
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"
এগুলোকে আমাদের কোডের সাথে যুক্ত করতে, আমরা ধাপ 13-এ আমাদের hardhat.config.js ফাইলে এই ভেরিয়েবলগুলোর রেফারেন্স দেব। Node.js নিজে থেকেই .env ফাইল পড়তে পারে, তাই ইনস্টল করার জন্য কোনো অতিরিক্ত প্যাকেজ নেই।
.env কমিট করবেন না! অনুগ্রহ করে নিশ্চিত করুন যে আপনি কখনই আপনার .env ফাইলটি কারও সাথে শেয়ার বা প্রকাশ করবেন না, কারণ এটি করার মাধ্যমে আপনি আপনার গোপনীয়তার সাথে আপস করছেন। আপনি যদি ভার্সন কন্ট্রোল ব্যবহার করেন, তবে আপনার .env ফাইলটি একটি gitignore (নতুন ট্যাবে খোলে) ফাইলে যোগ করুন।ধাপ 12: Ethers.js ইনস্টল করুন
Ethers.js হলো একটি লাইব্রেরি যা স্ট্যান্ডার্ড জেসন-আরপিসি মেথড-গুলোকে আরও ব্যবহারকারী-বান্ধব মেথড দিয়ে র্যাপ করে ইথেরিয়াম-এর সাথে ইন্টারঅ্যাক্ট করা এবং রিকোয়েস্ট করা সহজ করে তোলে।
অতিরিক্ত টুলিং এবং বর্ধিত কার্যকারিতার জন্য প্লাগইন (নতুন ট্যাবে খোলে) ইন্টিগ্রেট করা Hardhat খুব সহজ করে তোলে। আমরা কন্ট্রাক্ট ডিপ্লয়মেন্ট-এর জন্য Ethers প্লাগইন (নতুন ট্যাবে খোলে)-এর সুবিধা নেব (Ethers.js (নতুন ট্যাবে খোলে)-এ কিছু খুব পরিষ্কার কন্ট্রাক্ট ডিপ্লয়মেন্ট মেথড রয়েছে)।
আপনার প্রজেক্ট ডিরেক্টরিতে টাইপ করুন:
npm install --save-dev @nomicfoundation/hardhat-ethers ethers
আমরা পরবর্তী ধাপে আমাদের hardhat.config.js-এ প্লাগইনটিও যোগ করব।
ধাপ 13: hardhat.config.js আপডেট করুন
আমরা এ পর্যন্ত বেশ কয়েকটি ডিপেন্ডেন্সি এবং প্লাগইন যোগ করেছি, এখন আমাদের hardhat.config.js আপডেট করতে হবে যাতে আমাদের প্রজেক্ট সেগুলোর সব সম্পর্কে জানতে পারে।
আপনার hardhat.config.js আপডেট করে এরকম করুন:
import { existsSync } from "node:fs"
import hardhatEthers from "@nomicfoundation/hardhat-ethers"
import { configVariable, defineConfig } from "hardhat/config"
// .env ফাইলটি বিদ্যমান থাকলে, সেখান থেকে API_URL এবং PRIVATE_KEY process.env-এ লোড করুন
if (existsSync(".env")) process.loadEnvFile()
export default defineConfig({
plugins: [hardhatEthers],
solidity: "0.8.34",
networks: {
sepolia: {
type: "http",
url: configVariable("API_URL"),
accounts: [configVariable("PRIVATE_KEY")],
},
},
})
configVariable Hardhat-কে শুধুমাত্র প্রয়োজন হলেই একটি এনভায়রনমেন্ট ভেরিয়েবল থেকে প্রতিটি মান পড়তে বলে, তাই compile-এর মতো কমান্ডগুলো মান সেট করার আগেও কাজ করে। আপনি যদি আপনার প্রাইভেট কী একটি প্লেইন টেক্সট ফাইলে রাখতে না চান, তবে Hardhat একটি এনক্রিপ্ট করা কীস্টোর থেকে কনফিগারেশন ভেরিয়েবল (নতুন ট্যাবে খোলে)-ও পড়তে পারে।
ধাপ 14: আমাদের কন্ট্রাক্ট কম্পাইল করুন
এ পর্যন্ত সবকিছু ঠিকঠাক কাজ করছে কিনা তা নিশ্চিত করতে, চলুন আমাদের কন্ট্রাক্ট কম্পাইল করি। কম্পাইল টাস্কটি হলো বিল্ট-ইন Hardhat টাস্কগুলোর মধ্যে একটি।
কমান্ড লাইন থেকে রান করুন:
npx hardhat compile
প্রথমবার কম্পাইল করার সময়, Hardhat Solidity কম্পাইলার ডাউনলোড করে। এরপর আপনার Compiled 1 Solidity file with solc 0.8.34-এর মতো কিছু দেখা উচিত। যদি তা না হয়, তবে আপনি সবসময় Alchemy ডিসকর্ড (নতুন ট্যাবে খোলে)-এ মেসেজ করতে পারেন।
ধাপ 15: আমাদের ডিপ্লয় স্ক্রিপ্ট লিখুন
এখন যেহেতু আমাদের কন্ট্রাক্ট লেখা হয়ে গেছে এবং আমাদের কনফিগারেশন ফাইল প্রস্তুত, এখন আমাদের কন্ট্রাক্ট ডিপ্লয় স্ক্রিপ্ট লেখার সময়।
scripts/ ফোল্ডারে যান এবং deploy.js নামে একটি নতুন ফাইল তৈরি করুন, এতে নিচের বিষয়বস্তু যোগ করুন:
import { network } from "hardhat"
const { ethers } = await network.create()
const [deployer] = await ethers.getSigners()
const MyNFT = await ethers.getContractFactory("MyNFT")
// ডিপ্লয়মেন্ট শুরু করুন, যা এমন একটি প্রমিস রিটার্ন করে যা একটি কন্ট্রাক্ট অবজেক্টে রিজলভ হয়
const myNFT = await MyNFT.deploy(deployer.address)
await myNFT.waitForDeployment()
console.log("Contract deployed to address:", await myNFT.getAddress())
চলুন দেখি কোডের এই প্রতিটি লাইন কী কাজ করে।
const { ethers } = await network.create()
Hardhat 3-এ, একটি স্ক্রিপ্ট স্পষ্টভাবে একটি নেটওয়ার্ক-এর সাথে কানেকশন খোলে। আপনি যখন স্ক্রিপ্টটি রান করেন তখন --network অপশন দিয়ে যে নেটওয়ার্কটি বেছে নেন তার সাথে network.create() কানেক্ট করে, এবং hardhat-ethers প্লাগইন সেই কানেকশনে একটি ethers অবজেক্ট যোগ করে।
const [deployer] = await ethers.getSigners()
getSigners() নেটওয়ার্ক-এর জন্য কনফিগার করা অ্যাকাউন্ট-গুলো রিটার্ন করে। Sepolia-তে, এটি হলো সেই অ্যাকাউন্ট যার প্রাইভেট কী আপনি .env-এ রেখেছেন। আমরা এর ঠিকানাটি কনস্ট্রাক্টর-এ পাস করি যাতে আপনি কন্ট্রাক্ট-এর মালিক হন।
const MyNFT = await ethers.getContractFactory("MyNFT")
ethers.js-এ একটি ContractFactory হলো নতুন স্মার্ট কন্ট্রাক্ট ডিপ্লয় করার জন্য ব্যবহৃত একটি অ্যাবস্ট্রাকশন, তাই এখানে MyNFT হলো আমাদের নন-ফাঞ্জিবল টোকেন (NFT) কন্ট্রাক্ট-এর ইনস্ট্যান্সগুলোর জন্য একটি ফ্যাক্টরি। hardhat-ethers প্লাগইন ব্যবহার করার সময় ContractFactory এবং Contract ইনস্ট্যান্সগুলো ডিফল্টভাবে প্রথম সাইনারের সাথে কানেক্ট থাকে।
const myNFT = await MyNFT.deploy(deployer.address)
একটি ContractFactory-তে deploy() কল করলে ডিপ্লয়মেন্ট শুরু হবে, এবং একটি Promise রিটার্ন করবে যা একটি Contract-এ রিজলভ হয়। এটি হলো সেই অবজেক্ট যার আমাদের প্রতিটি স্মার্ট কন্ট্রাক্ট ফাংশনের জন্য একটি মেথড রয়েছে। আপনি deploy()-এ যে আর্গুমেন্টগুলো পাস করেন তা কন্ট্রাক্ট-এর কনস্ট্রাক্টর-এ যায়, এখানে initialOwner ঠিকানা।
waitForDeployment() ডিপ্লয়মেন্ট ট্রানজ্যাকশন একটি ব্লক-এ অন্তর্ভুক্ত হওয়া পর্যন্ত অপেক্ষা করে, এবং getAddress() নতুন কন্ট্রাক্ট-এর ঠিকানা রিটার্ন করে। আরও বিস্তারিত জানতে ethers.js কন্ট্রাক্ট ডকুমেন্টেশন (নতুন ট্যাবে খোলে) দেখুন।
ধাপ 16: আমাদের কন্ট্রাক্ট ডিপ্লয় করুন
আমরা অবশেষে আমাদের স্মার্ট কন্ট্রাক্ট ডিপ্লয় করতে প্রস্তুত! আপনার প্রজেক্ট ডিরেক্টরির রুটে ফিরে যান, এবং কমান্ড লাইনে রান করুন:
npx hardhat run scripts/deploy.js --network sepolia
এরপর আপনার এরকম কিছু দেখা উচিত:
Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650
যদি আমরা Sepolia Etherscan (নতুন ট্যাবে খোলে)-এ যাই এবং আমাদের কন্ট্রাক্ট ঠিকানা সার্চ করি তবে আমরা দেখতে পাব যে এটি সফলভাবে ডিপ্লয় হয়েছে। যদি আপনি এটি সাথে সাথে দেখতে না পান, তবে অনুগ্রহ করে কিছুক্ষণ অপেক্ষা করুন কারণ এতে কিছুটা সময় লাগতে পারে। ট্রানজ্যাকশন-টি দেখতে এরকম হবে:
From ঠিকানাটি আপনার মেটামাস্ক অ্যাকাউন্ট ঠিকানার সাথে মিলতে হবে এবং To ঠিকানায় “Contract Creation” লেখা থাকবে। যদি আমরা ট্রানজ্যাকশন-এ ক্লিক করি, তবে আমরা To ফিল্ডে আমাদের কন্ট্রাক্ট ঠিকানা দেখতে পাব:
দারুণ! আপনি এইমাত্র ইথেরিয়াম (টেস্টনেট) চেইন-এ আপনার নন-ফাঞ্জিবল টোকেন (NFT) স্মার্ট কন্ট্রাক্ট ডিপ্লয় করেছেন!
ভেতরে কীভাবে কাজ হচ্ছে তা বুঝতে, আপনি আপনার Alchemy ড্যাশবোর্ড (নতুন ট্যাবে খোলে)-এ আপনার অ্যাপের প্রাপ্ত রিকোয়েস্টগুলো দেখতে পারেন।
সেখানে আপনি বেশ কয়েকটি জেসন-আরপিসি কল দেখতে পাবেন যা Hardhat/Ethers আমাদের জন্য ভেতরে তৈরি করেছে যখন আমরা .deploy() ফাংশন কল করেছি। এখানে উল্লেখ করার মতো দুটি গুরুত্বপূর্ণ কল হলো eth_sendRawTransaction, যা আসলে Sepolia চেইন-এ আমাদের স্মার্ট কন্ট্রাক্ট লেখার রিকোয়েস্ট, এবং eth_getTransactionByHash যা হ্যাশ দেওয়া থাকলে আমাদের ট্রানজ্যাকশন সম্পর্কে তথ্য পড়ার একটি রিকোয়েস্ট (ট্রানজ্যাকশন পাঠানোর সময় একটি সাধারণ প্যাটার্ন)। ট্রানজ্যাকশন পাঠানো সম্পর্কে আরও জানতে, ট্রানজ্যাকশন ডকুমেন্টেশন দেখুন।
এই টিউটোরিয়ালের পর্ব 1-এর জন্য এটুকুই। পর্ব 2-এ, আমরা একটি NFT মিন্ট করে আমাদের স্মার্ট কন্ট্রাক্ট-এর সাথে ইন্টারঅ্যাক্ট করব, এবং পর্ব 3-এ আমরা আপনাকে দেখাব কীভাবে আপনার ইথেরিয়াম ওয়ালেট-এ আপনার NFT দেখতে হয়!



