ব্লকচেইন এবং স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের ক্ষেত্রে প্র্যাকটিস প্রোজেক্ট তৈরি করা ডেভেলপারদের জন্য অত্যন্ত কার্যকর, কারণ এটি তাদের বাস্তব অভিজ্ঞতা এবং কোডিং দক্ষতা বাড়ায়। প্র্যাকটিস প্রোজেক্টের মাধ্যমে ডেভেলপাররা স্মার্ট কন্ট্রাক্ট, dApps, এবং ব্লকচেইন প্রযুক্তির মৌলিক ধারণা এবং বাস্তবায়ন শিখতে পারে। নিচে কিছু প্র্যাকটিস প্রোজেক্ট এবং তাদের বিশদ বিবরণ দেওয়া হলো, যা ব্লকচেইন ডেভেলপমেন্ট শিখতে সহায়ক।
এই প্র্যাকটিস প্রোজেক্টগুলো ডেভেলপারদের জন্য ব্লকচেইন এবং স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের বিভিন্ন দিক শেখার এবং তাদের দক্ষতা বাড়ানোর জন্য কার্যকর। প্রতিটি প্রোজেক্ট ডেভেলপারদের স্মার্ট কন্ট্রাক্টের মৌলিক ধারণা, ফ্রন্ট-এন্ড ইন্টিগ্রেশন, এবং ব্লকচেইন নিরাপত্তার বিভিন্ন দিক শেখার সুযোগ দেয়। এসব প্রোজেক্টের মাধ্যমে ডেভেলপাররা dApps এবং DeFi প্রোজেক্ট ডেভেলপমেন্টের ক্ষেত্রে তাদের দক্ষতা আরও উন্নত করতে পারবে।
Solidity ব্যবহার করে একটি Basic Smart Contract তৈরি করা অনেক সহজ এবং Ethereum ব্লকচেইনের জন্য এটি আদর্শ প্রোগ্রামিং ভাষা। Solidity দিয়ে আপনি স্মার্ট কন্ট্রাক্ট তৈরি করতে পারবেন, যা Ethereum ব্লকচেইনে ডেপ্লয় করা যাবে। নিচে একটি Basic Smart Contract এর উদাহরণ দেয়া হলো, যা একটি সাধারণ স্টোরেজ কন্ট্রাক্ট হিসেবে কাজ করবে। এই কন্ট্রাক্টের মাধ্যমে আপনি একটি ভ্যালু স্টোর করতে এবং রিট্রিভ করতে পারবেন।
// Solidity ভার্সন নির্ধারণ করা
pragma solidity ^0.8.0;
// কন্ট্রাক্টের নাম SimpleStorage
contract SimpleStorage {
// একটি private state variable সংরক্ষণ করা, যা শুধুমাত্র কন্ট্রাক্টের মাধ্যমে অ্যাক্সেস করা যাবে
uint private storedData;
// একটি function যা ভ্যালু স্টোর করবে
function set(uint x) public {
storedData = x;
}
// একটি function যা স্টোর করা ভ্যালু রিটার্ন করবে
function get() public view returns (uint) {
return storedData;
}
}
Solidity ভার্সন নির্ধারণ:
pragma solidity ^0.8.0;
এই লাইনটি Solidity কম্পাইলারকে বলে যে, এই কন্ট্রাক্টটি Solidity-এর 0.8.0 বা তার পরবর্তী ভার্সনে কম্পাইল করতে হবে। এটি একটি ভালো প্র্যাকটিস যাতে সুনির্দিষ্ট ভার্সনে কন্ট্রাক্টটি কাজ করতে পারে এবং ভার্সন-স্পেসিফিক বাগ এড়ানো যায়।
কন্ট্রাক্ট ডিক্লেয়ারেশন:
contract SimpleStorage {
এখানে, SimpleStorage
নামে একটি স্মার্ট কন্ট্রাক্ট তৈরি করা হয়েছে। কন্ট্রাক্টের মধ্যে আমরা ভ্যারিয়েবল এবং ফাংশনগুলো সংজ্ঞায়িত করবো।
স্টেট ভ্যারিয়েবল:
storedData
হলো একটি uint
টাইপের প্রাইভেট স্টেট ভ্যারিয়েবল, যা কন্ট্রাক্টে একটি সংখ্যা সংরক্ষণ করবে। প্রাইভেট হওয়ার কারণে, এটি কেবলমাত্র এই কন্ট্রাক্টের মাধ্যমে অ্যাক্সেস করা যাবে এবং বাইরের কোনো অ্যাকাউন্ট বা কন্ট্রাক্ট এটি সরাসরি অ্যাক্সেস করতে পারবে না।
set
ফাংশন:
function set(uint x) public {
storedData = x;
}
set
ফাংশনটি পাবলিক এবং এটি একটি uint
মান ইনপুট হিসেবে নেয়। এই ফাংশনটি ব্যবহার করে storedData
ভ্যারিয়েবলে একটি নতুন মান সেট করা যায়।
get
ফাংশন:
function get() public view returns (uint) {
return storedData;
}
get
ফাংশনটি পাবলিক এবং এটি একটি view
ফাংশন, যার মানে হলো এটি শুধুমাত্র ডেটা রিড করে, পরিবর্তন করে না। এটি storedData
ভ্যারিয়েবলে সংরক্ষিত মান রিটার্ন করে।
এই কন্ট্রাক্টটি Solidity কম্পাইলার ব্যবহার করে কম্পাইল করা যায় এবং তারপর Ethereum Virtual Machine (EVM)-এ ডেপ্লয় করা যায়। নিচে কন্ট্রাক্ট ডেপ্লয় এবং ব্যবহার করার ধাপগুলো দেয়া হলো:
Deploy
বাটন ক্লিক করে কন্ট্রাক্টটি ডেপ্লয় করুন। আপনি Ethereum-এর টেস্টনেট (যেমন Ropsten, Kovan) বা স্থানীয় নেটওয়ার্ক ব্যবহার করতে পারেন।set
এবং get
ফাংশনগুলো ব্যবহার করে কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করতে পারেন।set
ফাংশনের মাধ্যমে একটি মান ইনপুট দিন এবং get
ফাংশন ব্যবহার করে সেই মানটি রিড করুন।view
বা pure
ফাংশনগুলো শুধুমাত্র ডেটা রিড বা ক্যালকুলেশন করে এবং গ্যাস খরচ হয় না। তবে set
বা অন্যান্য স্টেট-মডিফাইং ফাংশনগুলোতে গ্যাস ফি প্রয়োজন হয়।আপনি কন্ট্রাক্টটিতে আরও ফাংশন যুক্ত করতে পারেন, যেমন:
event
যোগ করা, যা কন্ট্রাক্টের পরিবর্তন সম্পর্কে ব্যবহারকারীদের অবহিত করতে সাহায্য করে।// মালিক সংরক্ষণের জন্য স্টেট ভ্যারিয়েবল
address public owner;
// কন্ট্রাক্ট ডিপ্লয় করার সময় মালিক সেট করা হচ্ছে
constructor() {
owner = msg.sender;
}
// শুধুমাত্র মালিক স্টোরেজ আপডেট করতে পারবে
function set(uint x) public {
require(msg.sender == owner, "Only the owner can set the value");
storedData = x;
}
Solidity ব্যবহার করে একটি Basic Smart Contract তৈরি করা সহজ এবং এটি Ethereum ব্লকচেইনে স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের জন্য প্রথম ধাপ। এই Basic Smart Contract-এর মাধ্যমে আপনি Solidity-এর মৌলিক ধারণাগুলো শিখতে পারবেন এবং ভবিষ্যতে আরও জটিল এবং উদ্ভাবনী কন্ট্রাক্ট তৈরি করতে সক্ষম হবেন।
Ethereum Testnet ব্যবহার করে একটি ট্রানজেকশন করা Ethereum-এর মূল নেটওয়ার্কে (Mainnet) যাওয়ার আগে স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট এবং ট্রানজেকশন টেস্টিং করার একটি নিরাপদ এবং কম খরচে উপায়। Testnet হলো Ethereum-এর একটি পরীক্ষামূলক নেটওয়ার্ক, যা মূল নেটওয়ার্কের মতোই কাজ করে কিন্তু এখানে Ether (ETH) ফ্রি এবং এর কোনো প্রকৃত মূল্য নেই। Ropsten, Rinkeby, Goerli, এবং Sepolia হলো Ethereum-এর কিছু জনপ্রিয় Testnet।
Ethereum Testnet-এ একটি ট্রানজেকশন করার জন্য নিচের ধাপগুলো অনুসরণ করতে হবে:
Testnet-এ ট্রানজেকশন করার জন্য আপনার একটি Ethereum Wallet প্রয়োজন হবে। MetaMask হলো একটি জনপ্রিয় Ethereum Wallet, যা Chrome, Firefox, এবং অন্যান্য ব্রাউজারে এক্সটেনশন হিসেবে ব্যবহার করা যায়।
Ethereum-এর বিভিন্ন Testnet রয়েছে, যেমন Ropsten, Goerli, Rinkeby, এবং Sepolia। MetaMask-এ Testnet নেটওয়ার্ক নির্বাচন করতে নিচের ধাপগুলো অনুসরণ করুন:
Testnet-এ ট্রানজেকশন করতে আপনার ফ্রি ETH প্রয়োজন হবে, যা আপনি Faucet-এর মাধ্যমে সংগ্রহ করতে পারেন।
Testnet-এ একটি ট্রানজেকশন পাঠানোর জন্য নিচের ধাপগুলো অনুসরণ করুন:
Ethereum Testnet-এ ট্রানজেকশন সম্পন্ন হওয়ার পরে আপনি ট্রানজেকশনের স্টেটাস যাচাই করতে পারেন।
Etherscan Testnet Explorer ব্যবহার করুন:
MetaMask-এ ট্রানজেকশন চেক করুন:
Testnet-এ একটি SimpleStorage কন্ট্রাক্ট ডেপ্লয় এবং ট্রানজেকশন করা যেতে পারে। নিচে কিভাবে কন্ট্রাক্টটি Remix IDE এবং MetaMask ব্যবহার করে Testnet-এ ডেপ্লয় করা যায় তার ধাপ উল্লেখ করা হলো:
Remix IDE খুলুন:
MetaMask এবং Remix যুক্ত করা:
কন্ট্রাক্ট কম্পাইল করুন:
Testnet নির্বাচন করুন এবং কন্ট্রাক্ট ডেপ্লয় করুন:
কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করা:
Ethereum Testnet (যেমন Goerli) ব্যবহার করে একটি ট্রানজেকশন করা এবং স্মার্ট কন্ট্রাক্ট ডেপ্লয় করা নতুন ডেভেলপারদের জন্য একটি গুরুত্বপূর্ণ স্কিল। Testnet ব্যবহার করে ডেভেলপাররা Ethereum-এর মূল নেটওয়ার্কে যাওয়ার আগে তাদের কন্ট্রাক্ট এবং অ্যাপ্লিকেশনগুলো পরীক্ষা করতে পারে, যা তাদের খরচ এবং ঝুঁকি কমায়।
একটি Decentralized Application (dApp) তৈরি করতে হলে স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট, ফ্রন্ট-এন্ড ডেভেলপমেন্ট, এবং ব্লকচেইনের সাথে ইন্টারঅ্যাকশন করতে সক্ষম একটি পূর্ণাঙ্গ অ্যাপ্লিকেশন তৈরি করতে হয়। dApp ডেভেলপমেন্টে আপনি স্মার্ট কন্ট্রাক্ট এবং ফ্রন্ট-এন্ড ইন্টিগ্রেশন শেখার সুযোগ পাবেন। নিচে একটি Basic dApp তৈরির ধাপগুলো এবং ব্যবহৃত টুলস নিয়ে আলোচনা করা হলো।
আমরা একটি Simple Storage dApp তৈরি করবো, যেখানে ব্যবহারকারীরা একটি সংখ্যা স্টোর করতে এবং তা রিট্রিভ করতে পারবে। এটি একটি বেসিক প্রোজেক্ট, তবে এটি Solidity, স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট, এবং ব্লকচেইনের সাথে ফ্রন্ট-এন্ড ইন্টিগ্রেশন শেখার জন্য আদর্শ।
১. স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট
২. ফ্রন্ট-এন্ড ডেভেলপমেন্ট
৩. Ethereum নেটওয়ার্কে কন্ট্রাক্ট ডেপ্লয় করা
৪. ফ্রন্ট-এন্ড এবং স্মার্ট কন্ট্রাক্ট ইন্টিগ্রেশন
Solidity ব্যবহার করে একটি Simple Storage স্মার্ট কন্ট্রাক্ট লিখুন। এই কন্ট্রাক্ট একটি সংখ্যা স্টোর এবং রিট্রিভ করার সুযোগ দেবে।
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 private storedNumber;
// Store a number
function set(uint256 _number) public {
storedNumber = _number;
}
// Retrieve the stored number
function get() public view returns (uint256) {
return storedNumber;
}
}
১. Remix IDE ওপেন করুন। ২. SimpleStorage.sol
নামে একটি নতুন ফাইল তৈরি করুন এবং উপরের কোডটি পেস্ট করুন। 3. Solidity Compiler ট্যাবে যান এবং কন্ট্রাক্টটি কম্পাইল করুন। 4. Deploy & Run Transactions ট্যাবে যান এবং JavaScript VM নির্বাচন করুন। 5. "Deploy" বাটনে ক্লিক করে কন্ট্রাক্টটি ডেপ্লয় করুন।
এখন আমরা আমাদের স্মার্ট কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করতে একটি ফ্রন্ট-এন্ড তৈরি করবো। আমরা React.js এবং Ethers.js লাইব্রেরি ব্যবহার করবো।
npx create-react-app simple-storage-dapp
cd simple-storage-dapp
npm install ethers
import React, { useState } from "react";
import { ethers } from "ethers";
import SimpleStorage from "./artifacts/contracts/SimpleStorage.sol/SimpleStorage.json";
const simpleStorageAddress = "আপনার_ডেপ্লয়কৃত_কন্ট্রাক্টের_অ্যাড্রেস";
function App() {
const [storedValue, setStoredValue] = useState("");
const [inputValue, setInputValue] = useState("");
// স্মার্ট কন্ট্রাক্টের সাথে কানেক্ট করতে
async function requestAccount() {
await window.ethereum.request({ method: "eth_requestAccounts" });
}
// get ফাংশন কল করে মান রিট্রিভ করতে
async function fetchValue() {
if (typeof window.ethereum !== "undefined") {
const provider = new ethers.providers.Web3Provider(window.ethereum);
const contract = new ethers.Contract(
simpleStorageAddress,
SimpleStorage.abi,
provider
);
try {
const data = await contract.get();
setStoredValue(data.toString());
} catch (err) {
console.error("Error: ", err);
}
}
}
// set ফাংশন কল করে মান সংরক্ষণ করতে
async function setValue() {
if (!inputValue) return;
if (typeof window.ethereum !== "undefined") {
await requestAccount();
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(
simpleStorageAddress,
SimpleStorage.abi,
signer
);
const transaction = await contract.set(inputValue);
await transaction.wait();
fetchValue();
}
}
return (
Simple Storage dApp
Stored Value: {storedValue}
setInputValue(e.target.value)}
/>
);
}
export default App;
ডেভেলপমেন্ট নেটওয়ার্কে স্মার্ট কন্ট্রাক্ট ডেপ্লয় করার জন্য Truffle বা Hardhat ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমরা Hardhat ব্যবহার করবো।
npm install --save-dev hardhat
npx hardhat
Hardhat কনফিগারেশনে ডেভেলপমেন্ট নেটওয়ার্ক যোগ করুন এবং কন্ট্রাক্ট ডেপ্লয় করার জন্য একটি স্ক্রিপ্ট লিখুন।
// scripts/deploy.js
async function main() {
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const simpleStorage = await SimpleStorage.deploy();
await simpleStorage.deployed();
console.log("SimpleStorage deployed to:", simpleStorage.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
npx hardhat run scripts/deploy.js --network localhost
React অ্যাপে Hardhat থেকে প্রাপ্ত কন্ট্রাক্ট অ্যাড্রেস এবং ABI (ডেপ্লয় করার পর পাওয়া) আপডেট করুন। এটি করার পর আপনি dApp-এর ফ্রন্ট-এন্ডের মাধ্যমে স্মার্ট কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করতে পারবেন।
এই প্রোজেক্টের মাধ্যমে আপনি একটি Basic dApp তৈরি করতে এবং স্মার্ট কন্ট্রাক্ট, ফ্রন্ট-এন্ড ইন্টিগ্রেশন, এবং Ethereum নেটওয়ার্কে কন্ট্রাক্ট ডেপ্লয় করার প্রক্রিয়া শিখতে পারবেন। এটি একটি বেসিক প্রোজেক্ট হলেও, আপনি এই ভিত্তির ওপর ভিত্তি করে আরও জটিল dApp তৈরি করতে পারেন, যেমন DeFi, NFT মার্কেটপ্লেস, বা Decentralized Voting System।
NFT Minting এবং ERC-721 Contract Deployment করতে হলে Solidity স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট, Ethereum নেটওয়ার্কে কন্ট্রাক্ট ডেপ্লয়মেন্ট, এবং NFT ম্যানেজমেন্ট প্রক্রিয়া সম্পর্কে ধারণা থাকা প্রয়োজন। নিচে একটি ERC-721 (NFT) কন্ট্রাক্ট তৈরির এবং NFT মিন্টিং করার প্রক্রিয়া নিয়ে বিস্তারিত আলোচনা করা হলো।
ERC-721 হলো Ethereum-এর একটি NFT স্ট্যান্ডার্ড, যা ইউনিক এবং Non-Fungible টোকেন তৈরি করতে ব্যবহৃত হয়। ERC-721 কন্ট্রাক্টের মাধ্যমে আপনি ইউনিক অ্যাসেট, ডিজিটাল আর্টওয়ার্ক, এবং অন্যান্য ক্লেক্টিবলস ব্লকচেইনে মুদ্রণ করতে পারেন।
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
uint256 public tokenCounter;
constructor() ERC721("MyNFT", "MNFT") {
tokenCounter = 0;
}
function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256) {
uint256 newTokenId = tokenCounter;
_safeMint(recipient, newTokenId);
_setTokenURI(newTokenId, tokenURI);
tokenCounter += 1;
return newTokenId;
}
function _baseURI() internal view virtual override returns (string memory) {
return "https://api.example.com/metadata/";
}
}
ERC-721 এবং Ownable:
Ownable
মোডিফায়ার কন্ট্রাক্টের মালিক নির্ধারণ করে এবং শুধুমাত্র মালিককে NFT মিন্ট করার অনুমতি দেয়।mintNFT ফাংশন:
mintNFT
ফাংশনটি নতুন NFT টোকেন মিন্ট করে এবং সেটি একটি নির্দিষ্ট অ্যাড্রেসে প্রেরণ করে।tokenURI
সংযুক্ত করা হয়, যা NFT-এর মেটাডেটা নির্দেশ করে (যেমন ছবির লিংক, নাম, বিবরণ)।১. Remix IDE ওপেন করুন।
২. নতুন একটি ফাইল তৈরি করুন, MyNFT.sol
নামে এবং উপরের কোডটি পেস্ট করুন।
৩. Solidity Compiler ট্যাবে যান এবং কন্ট্রাক্টটি কম্পাইল করুন।
৪. Deploy & Run Transactions ট্যাবে যান এবং Injected Web3 নির্বাচন করুন (MetaMask ব্রাউজার এক্সটেনশনটি ব্যবহার করে)।
৫. ডেপ্লয় বাটনে ক্লিক করে কন্ট্রাক্টটি Ethereum নেটওয়ার্কে ডেপ্লয় করুন।
নোট: আপনি ডেভেলপমেন্ট নেটওয়ার্ক (যেমন Ropsten বা Rinkeby) ব্যবহার করতে পারেন পরীক্ষার জন্য, কারণ এটি গ্যাস ফি ছাড়াই কাজ করতে সহায়ক।
এখন আমরা আমাদের কন্ট্রাক্টের মাধ্যমে একটি NFT মিন্ট করবো। Remix IDE-তে mintNFT
ফাংশন কল করে এটি করা যাবে।
১. Deployed Contracts সেকশনে আপনার ডেপ্লয় করা কন্ট্রাক্টটি দেখুন।
২. mintNFT
ফাংশন নির্বাচন করুন এবং প্রয়োজনীয় ইনপুট প্রদান করুন:
"https://api.example.com/metadata/1.json"
)।প্রত্যেকটি NFT-এর জন্য একটি ইউনিক tokenURI সেট করা হয়, যা NFT-এর মেটাডেটা নির্দেশ করে। মেটাডেটা সাধারণত JSON ফরম্যাটে থাকে এবং এটি NFT-এর ছবির লিংক, নাম, এবং অন্যান্য বিবরণ নির্দেশ করে।
{
"name": "My First NFT",
"description": "This is my first NFT on the blockchain!",
"image": "https://api.example.com/images/1.png",
"attributes": [
{
"trait_type": "Background",
"value": "Blue"
},
{
"trait_type": "Rarity",
"value": "Common"
}
]
}
এই JSON ফাইলটি হোস্ট করতে আপনি IPFS (InterPlanetary File System) বা অন্য কোনো হোস্টিং সার্ভিস ব্যবহার করতে পারেন। JSON ফাইলটি হোস্ট করার পর তার URI (যেমন "https://ipfs.io/ipfs/Qm12345"
) tokenURI
হিসেবে ব্যবহার করা হবে।
NFT মিন্টিং করার পর আপনি একটি ফ্রন্ট-এন্ড ইন্টারফেস তৈরি করতে পারেন, যেখানে ব্যবহারকারীরা তাদের NFT দেখতে এবং ম্যানেজ করতে পারবে। React.js এবং Ethers.js ব্যবহার করে আপনি একটি সম্পূর্ণ dApp তৈরি করতে পারেন।
NFT মিন্টিং এবং ERC-721 কন্ট্রাক্ট ডেপ্লয়মেন্ট একটি অত্যন্ত কার্যকরী প্রক্রিয়া, যা আপনাকে NFT ইকোসিস্টেমের মধ্যে কাজ করার সুযোগ দেয়। Solidity, Remix IDE, এবং MetaMask-এর সাহায্যে আপনি দ্রুত NFT কন্ট্রাক্ট তৈরি এবং ডেপ্লয় করতে পারবেন। আপনার জ্ঞান এবং দক্ষতা বাড়ানোর জন্য আপনি আরও জটিল ফিচার (যেমন রয়্যালটি পেমেন্ট, অটোমেটিক মার্কেটপ্লেস ইন্টিগ্রেশন) যুক্ত করতে পারেন।