Solidity তে Tokens এবং ERC Standards হল ব্লকচেইনে ডিজিটাল অ্যাসেট তৈরির এবং ব্যবস্থাপনার জন্য গুরুত্বপূর্ণ কনসেপ্ট। ERC (Ethereum Request for Comments) হল Ethereum ব্লকচেইন ভিত্তিক টোকেনগুলির জন্য স্ট্যান্ডার্ডস বা প্রোটোকল, যা বিভিন্ন ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন (dApp) এবং স্মার্ট কন্ট্রাক্টের মধ্যে ইন্টারঅ্যাকশন নিশ্চিত করে। এই স্ট্যান্ডার্ডগুলির মাধ্যমে ব্লকচেইনে বিভিন্ন ধরনের টোকেন তৈরি এবং ব্যবহার করা হয়।
১. Tokens (টোকেন)
Tokens হল ডিজিটাল বা ভার্চুয়াল অ্যাসেট যা ব্লকচেইন নেটওয়ার্কে ব্যবহৃত হয়। টোকেনগুলি সাধারণত একটি স্মার্ট কন্ট্রাক্টের মাধ্যমে তৈরি এবং পরিচালনা করা হয়। Ethereum ব্লকচেইনে টোকেনগুলি নির্দিষ্ট নিয়মাবলী অনুসরণ করে, যাতে তারা অন্যান্য স্মার্ট কন্ট্রাক্ট এবং ডিস্ট্রিবিউটেড অ্যাপ্লিকেশনগুলির সাথে সহজে ইন্টারঅ্যাক্ট করতে পারে।
Types of Tokens (টোকেনের ধরন):
- ERC-20 Tokens: সবচেয়ে সাধারণ টোকেন স্ট্যান্ডার্ড যা টোকেনের ট্রান্সফার, ব্যালেন্স এবং অ্যাপ্রুভাল প্রক্রিয়া সংজ্ঞায়িত করে।
- ERC-721 Tokens (NFTs): একক এবং অদ্বিতীয় টোকেন তৈরি করতে ব্যবহৃত হয় (Non-Fungible Tokens বা NFT)।
- ERC-1155 Tokens: এটি মিশ্রিত ফাংশনালিটির একটি স্ট্যান্ডার্ড যা একাধিক টোকেন টাইপের সমর্থন প্রদান করে।
২. ERC-20 Tokens (ইআরসি-২০ টোকেন)
ERC-20 হল Ethereum প্ল্যাটফর্মের জন্য একটি স্ট্যান্ডার্ড যা টোকেন তৈরি করার জন্য ব্যবহৃত হয়। এটি টোকেনের কিছু মৌলিক ফাংশন ডিফাইন করে যেমন ট্রান্সফার, ব্যালেন্স চেক, এবং অনুমোদন। ERC-20 স্ট্যান্ডার্ডটি নিশ্চিত করে যে একটি টোকেন একইভাবে কাজ করবে এবং অন্যান্য ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন বা স্মার্ট কন্ট্রাক্টের সাথে সহজে ইন্টারঅ্যাক্ট করতে পারবে।
ERC-20 স্ট্যান্ডার্ড ফাংশনগুলি:
totalSupply(): টোকেনের মোট সরবরাহ।balanceOf(address account): নির্দিষ্ট অ্যাকাউন্টের ব্যালেন্স।transfer(address recipient, uint256 amount): টোকেন ট্রান্সফার করা।approve(address spender, uint256 amount): অন্য কন্ট্রাক্ট বা অ্যাকাউন্টকে নির্দিষ্ট পরিমাণ টোকেন ব্যয় করার অনুমতি দেওয়া।allowance(address owner, address spender): অনুমোদিত পরিমাণ দেখানো।transferFrom(address sender, address recipient, uint256 amount): অনুমোদিত পরিমাণ থেকে টোকেন ট্রান্সফার করা।
ERC-20 Token Example (ইআরসি-২০ টোকেন উদাহরণ)
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract MyToken is IERC20 {
string public name = "MyToken";
string public symbol = "MTK";
uint256 public totalSupply;
mapping(address => uint256) public balances;
mapping(address => mapping(address => uint256)) public allowances;
constructor(uint256 _totalSupply) {
totalSupply = _totalSupply;
balances[msg.sender] = totalSupply; // Assign all tokens to the deployer
}
function balanceOf(address account) external view override returns (uint256) {
return balances[account];
}
function transfer(address recipient, uint256 amount) external override returns (bool) {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[recipient] += amount;
return true;
}
function approve(address spender, uint256 amount) external override returns (bool) {
allowances[msg.sender][spender] = amount;
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
require(balances[sender] >= amount, "Insufficient balance");
require(allowances[sender][msg.sender] >= amount, "Allowance exceeded");
balances[sender] -= amount;
balances[recipient] += amount;
allowances[sender][msg.sender] -= amount;
return true;
}
}এখানে, MyToken কন্ট্রাক্টটি ERC-20 স্ট্যান্ডার্ড অনুযায়ী টোকেন তৈরি করেছে, যা totalSupply(), balanceOf(), transfer(), approve() এবং transferFrom() ফাংশনগুলো বাস্তবায়িত করেছে।
৩. ERC-721 Tokens (NFTs)
ERC-721 হল Ethereum এর জন্য একটি স্ট্যান্ডার্ড যা Non-Fungible Tokens (NFTs) তৈরি করতে ব্যবহৃত হয়। NFTs একক, অদ্বিতীয় ডিজিটাল সম্পদ হিসেবে কাজ করে। উদাহরণস্বরূপ, একটি আর্টওয়ার্ক, গেমের আইটেম বা ডিজিটাল সিংগল রেকর্ড যা অনন্য।
ERC-721 এর মৌলিক ফাংশনগুলি:
ownerOf(uint256 tokenId): নির্দিষ্ট টোকেন আইডির মালিকের অ্যাড্রেস।safeTransferFrom(address from, address to, uint256 tokenId): টোকেন মালিকানার ট্রান্সফার।approve(address to, uint256 tokenId): নির্দিষ্ট টোকেনের জন্য অনুমোদন দেওয়া।getApproved(uint256 tokenId): টোকেনের জন্য অনুমোদিত অ্যাড্রেস।
ERC-721 Token Example (ইআরসি-৭২১ টোকেন উদাহরণ)
pragma solidity ^0.8.0;
interface IERC721 {
function ownerOf(uint256 tokenId) external view returns (address owner);
function transferFrom(address from, address to, uint256 tokenId) external;
}
contract MyNFT is IERC721 {
string public name = "MyNFT";
string public symbol = "MNFT";
mapping(uint256 => address) public owners;
function ownerOf(uint256 tokenId) external view override returns (address) {
return owners[tokenId];
}
function transferFrom(address from, address to, uint256 tokenId) external override {
require(owners[tokenId] == from, "Not the owner");
owners[tokenId] = to;
}
function mint(address to, uint256 tokenId) public {
owners[tokenId] = to;
}
}এখানে, MyNFT কন্ট্রাক্টটি ERC-721 স্ট্যান্ডার্ড অনুযায়ী একটি Non-Fungible Token (NFT) তৈরি করেছে, যেখানে ownerOf(), transferFrom(), এবং mint() ফাংশন রয়েছে।
৪. ERC-1155 Tokens
ERC-1155 হল একটি উন্নত স্ট্যান্ডার্ড যা একাধিক টোকেনের সঠিক ব্যবস্থাপনা নিশ্চিত করে, যেখানে একটি কন্ট্রাক্টে ERC-20 এবং ERC-721 টোকেন একত্রে ব্যবহৃত হতে পারে। এটি Multi-Token Standard নামে পরিচিত এবং একটি স্মার্ট কন্ট্রাক্টের মধ্যে একাধিক টোকেন টাইপ পরিচালনা করতে সক্ষম।
ERC-1155 Example (ইআরসি-১১৫৫ উদাহরণ)
pragma solidity ^0.8.0;
interface IERC1155 {
function balanceOf(address account, uint256 id) external view returns (uint256);
function transferFrom(address from, address to, uint256 id, uint256 amount) external;
}
contract MyMultiToken is IERC1155 {
mapping(address => mapping(uint256 => uint256)) public balances;
function balanceOf(address account, uint256 id) external view override returns (uint256) {
return balances[account][id];
}
function transferFrom(address from, address to, uint256 id, uint256 amount) external override {
require(balances[from][id] >= amount, "Insufficient balance");
balances[from][id] -= amount;
balances[to][id] += amount;
}
function mint(address account, uint256 id, uint256 amount) public {
balances[account][id] += amount;
}
}এখানে, MyMultiToken কন্ট্রাক্টটি ERC-1155 স্ট্যান্ডার্ড অনুযায়ী একাধিক
টোকেন টাইপের সমর্থন প্রদান করছে, যেখানে mint() এবং transferFrom() ফাংশন রয়েছে।
সারাংশ
Tokens এবং ERC Standards Ethereum ব্লকচেইন প্ল্যাটফর্মে ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন (dApps) তৈরি করার জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে। ERC-20 হল একটি জনপ্রিয় স্ট্যান্ডার্ড যা সাধারণ টোকেন তৈরি করতে ব্যবহৃত হয়, ERC-721 NFTs (Non-Fungible Tokens) তৈরি করতে ব্যবহৃত হয় এবং ERC-1155 একাধিক টোকেন টাইপ সমর্থন করে। এই স্ট্যান্ডার্ডগুলো স্মার্ট কন্ট্রাক্টের মধ্যে স্ট্যান্ডার্ডাইজড ইন্টারঅ্যাকশন এবং কার্যক্রম নিশ্চিত করতে ব্যবহৃত হয়।
ERC-20 হলো Ethereum ব্লকচেইনে একটি টোকেন স্ট্যান্ডার্ড, যা ডিজিটাল অ্যাসেট বা টোকেন তৈরির জন্য একটি নির্দিষ্ট নিয়মাবলি বা প্রোটোকল প্রদান করে। এটি Ethereum ব্লকচেইনে স্মার্ট কন্ট্রাক্টের মাধ্যমে টোকেন তৈরি এবং পরিচালনা করার জন্য ব্যবহৃত হয়। ERC-20 স্ট্যান্ডার্ড অনুযায়ী তৈরি টোকেনগুলো ব্লকচেইনে সহজেই একে অপরের মধ্যে ট্রেড করা, স্টোর করা এবং প্রেরণ করা যায়। এটি একটি অতি পরিচিত এবং widely adopted স্ট্যান্ডার্ড, যা ডিজিটাল মুদ্রা, ক্রিপ্টোকারেন্সি, এবং অন্যান্য টোকেনের জন্য ব্যবহৃত হয়।
ERC-20 এর মূল ধারণা
ERC-20 হলো Ethereum Request for Comments 20 এর সংক্ষিপ্ত রূপ, যা 2015 সালে Fabian Vogelsteller এবং Vitalik Buterin দ্বারা প্রস্তাবিত হয়েছিল। এটি Ethereum ব্লকচেইনে একটি ইউনিফর্ম টোকেন ইন্টারফেস তৈরি করে, যা ডেভেলপারদের জন্য একটি নির্দিষ্ট নিয়মাবলি দিয়ে টোকেন তৈরি এবং ব্যবহার সহজ করে দেয়। ERC-20 স্ট্যান্ডার্ড একটি টোকেনের জন্য বেশ কিছু প্রয়োজনীয় ফাংশন এবং ইভেন্ট ডিফাইন করে, যাতে এটি ব্লকচেইনে অন্যান্য কন্ট্রাক্ট এবং অ্যাপ্লিকেশনগুলির সাথে সঠিকভাবে কাজ করতে পারে।
ERC-20 স্ট্যান্ডার্ডের মৌলিক ফাংশনসমূহ
ERC-20 স্ট্যান্ডার্ডের আওতায় আসা একটি টোকেনকে সর্বনিম্ন পাঁচটি গুরুত্বপূর্ণ ফাংশন প্রদান করতে হয়:
- totalSupply()
- এটি টোকেনের মোট সরবরাহ (total supply) ফেরত দেয়। অর্থাৎ, কত মোট টোকেন তৈরি করা হয়েছে।
- balanceOf(address account)
- এটি একটি নির্দিষ্ট ঠিকানার টোকেন ব্যালেন্স ফেরত দেয়।
- transfer(address recipient, uint amount)
- এটি টোকেনের একটি নির্দিষ্ট পরিমাণ একটি ঠিকানা থেকে অন্য ঠিকানায় স্থানান্তর করতে ব্যবহৃত হয়।
- allowance(address owner, address spender)
- এটি মালিকের পক্ষ থেকে কোন স্পেন্ডার কত টোকেন খরচ করার অনুমতি পেয়েছে, তা নির্ধারণ করে।
- approve(address spender, uint amount)
- এটি মালিকের পক্ষ থেকে কোনো স্পেন্ডারকে একটি নির্দিষ্ট পরিমাণ টোকেন খরচ করার অনুমতি দেয়।
- transferFrom(address sender, address recipient, uint amount)
- এটি একটি নির্দিষ্ট পরিমাণ টোকেন এক ঠিকানা থেকে অন্য ঠিকানায় স্থানান্তর করতে ব্যবহৃত হয়, যখন স্পেন্ডারের কাছে পূর্বে অনুমতি থাকে।
ERC-20 স্ট্যান্ডার্ডের ইভেন্টসমূহ
ERC-20 স্ট্যান্ডার্ডে দুটি প্রধান ইভেন্ট রয়েছে:
- Transfer(address indexed from, address indexed to, uint value)
- যখনই টোকেন স্থানান্তরিত হয়, এই ইভেন্টটি ট্রিগার হয়।
- এটি ব্লকচেইনে টোকেন ট্রান্সফারের একটি লগ হিসেবে সংরক্ষিত হয়, যা ট্রানজেকশন ট্র্যাক করতে সাহায্য করে।
- Approval(address indexed owner, address indexed spender, uint value)
- এটি তখন ট্রিগার হয়, যখন মালিক কোন স্পেন্ডারকে নির্দিষ্ট পরিমাণ টোকেন খরচ করার অনুমতি দেয়।
ERC-20 স্ট্যান্ডার্ডের সুবিধাসমূহ
- বিভিন্ন কন্ট্রাক্টের মধ্যে টোকেন সহজে ট্রেড এবং এক্সচেঞ্জ করা যায়: ERC-20 স্ট্যান্ডার্ডের কারণে টোকেনগুলো বিভিন্ন প্ল্যাটফর্মে এবং ড্যাপস (DApps) মধ্যে একে অপরের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হয়।
- টোকেনের জন্য একটি সুশৃঙ্খল নিয়মাবলি: ডেভেলপাররা ERC-20 স্ট্যান্ডার্ড অনুসরণ করে একটি নির্দিষ্ট ফাংশন এবং ইভেন্ট কাঠামো পায়, যা টোকেনের কার্যকারিতা এবং ট্রানজেকশন প্রসেসকে সহজ করে।
- ব্যবহারকারী এবং ডেভেলপারদের জন্য সহজ ইন্টিগ্রেশন: ERC-20 টোকেনগুলো বিভিন্ন ওয়ালেট, এক্সচেঞ্জ এবং স্মার্ট কন্ট্রাক্টের মাধ্যমে সহজে ব্যবহার করা যায়, যা ইন্টিগ্রেশন প্রক্রিয়াকে দ্রুত এবং সোজা করে তোলে।
- ডিজিটাল অ্যাসেটগুলির স্ট্যান্ডার্ডাইজেশন: এটি ক্রিপ্টোকারেন্সি এবং অন্যান্য ডিজিটাল অ্যাসেটগুলির জন্য একটি প্রচলিত স্ট্যান্ডার্ড হিসাবে কাজ করে, যা ব্লকচেইনে একাধিক অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।
ERC-20 স্ট্যান্ডার্ডের একটি উদাহরণ
এখানে একটি ERC-20 টোকেনের উদাহরণ দেওয়া হলো, যা এক কন্ট্রাক্টে টোকেন তৈরি এবং ব্যবহারের জন্য মৌলিক ফাংশনগুলি ধারণ করে:
pragma solidity ^0.8.0;
contract MyToken {
string public name = "MyToken";
string public symbol = "MTK";
uint8 public decimals = 18;
uint public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
constructor(uint _initialSupply) {
totalSupply = _initialSupply * 10 ** uint(decimals);
balanceOf[msg.sender] = totalSupply;
}
function transfer(address _to, uint _value) public returns (bool success) {
require(_to != address(0), "Invalid address");
require(balanceOf[msg.sender] >= _value, "Insufficient balance");
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function approve(address _spender, uint _value) public returns (bool success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
require(_from != address(0), "Invalid address");
require(_to != address(0), "Invalid address");
require(balanceOf[_from] >= _value, "Insufficient balance");
require(allowance[_from][msg.sender] >= _value, "Allowance exceeded");
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
}ব্যাখ্যা:
- name, symbol, decimals: এই ফাংশনগুলো টোকেনের নাম, প্রতীক এবং দশমিক স্থান সংখ্যা নির্ধারণ করে।
- totalSupply: এটি টোকেনের মোট সরবরাহ প্রদর্শন করে।
- transfer: এটি টোকেন স্থানান্তরের জন্য ব্যবহৃত হয়।
- approve: এটি স্পেন্ডারের কাছে টোকেন খরচ করার অনুমতি দেয়।
- transferFrom: এটি একজন স্পেন্ডারের মাধ্যমে টোকেন স্থানান্তরের জন্য ব্যবহৃত হয়।
- Transfer এবং Approval ইভেন্ট দুটি ব্লকচেইনে ট্রানজেকশন লগ হিসেবে সংরক্ষিত হয়।
সারাংশ
ERC-20 স্ট্যান্ডার্ড হলো একটি Ethereum ব্লকচেইন টোকেন স্ট্যান্ডার্ড যা ডিজিটাল অ্যাসেট বা টোকেন তৈরির জন্য একটি সাধারণ নিয়মাবলি এবং ফাংশন প্রদান করে। এটি টোকেনের ট্রান্সফার, ব্যালেন্স এবং অনুমতি প্রদানসহ বিভিন্ন কার্যক্রম সহজে এবং কার্যকরভাবে করতে সহায়তা করে। ERC-20 স্ট্যান্ডার্ডের মাধ্যমে টোকেনগুলির মধ্যে সহজে ট্রেড এবং এক্সচেঞ্জ করা সম্ভব হয়, এবং এটি ক্রিপ্টোকারেন্সি এবং অন্যান্য ডিজিটাল অ্যাসেটের জন্য একটি জনপ্রিয় ও widely adopted স্ট্যান্ডার্ড।
ERC-721 হলো একটি স্ট্যান্ডার্ড যা Non-Fungible Tokens (NFTs) তৈরি করার জন্য Ethereum ব্লকচেইনে ব্যবহৃত হয়। NFTs হল ডিজিটাল মালিকানার প্রতিনিধিত্বকারী ইউনিক টোকেন যা একে অপরের সাথে সমান নয় (non-fungible)। অর্থাৎ, প্রতিটি NFT একটি ইউনিক এবং অদ্বিতীয় টোকেন, যার মূল্য বা বৈশিষ্ট্য অন্য টোকেনের সাথে মিলে না। এই ধরনের টোকেন সাধারণত আর্ট, গেমস, কালেকটিবল, ভিডিও, বা অন্যান্য ডিজিটাল সম্পদ হিসেবে ব্যবহৃত হয়।
ERC-721 হলো একটি জনপ্রিয় স্ট্যান্ডার্ড যা ব্লকচেইনে NFTs তৈরি করতে ব্যবহৃত হয়। এটি Ethereum Request for Comments 721 এর সংক্ষিপ্ত রূপ, যা Ethereum ব্লকচেইনে ইউনিক টোকেনের জন্য নিয়মাবলী ও প্রোটোকল নির্ধারণ করে।
1. ERC-721 কি?
ERC-721 হল Ethereum ব্লকচেইনে NFTs এর জন্য একটি স্ট্যান্ডার্ড যা প্রতিটি টোকেনের জন্য একটি বিশেষ ইউনিক আইডেন্টিফায়ার (ID) নিশ্চিত করে। এই স্ট্যান্ডার্ড ব্যবহার করে একেকটি টোকেনের মালিকানা এবং বৈশিষ্ট্য সংরক্ষিত থাকে। এটি fungibility এর বিপরীত, কারণ প্রতিটি টোকেনের নিজস্ব বৈশিষ্ট্য এবং মান থাকে, যা অন্য টোকেনের সাথে মিলানো যায় না।
ERC-721 এর বৈশিষ্ট্য:
- Unique Identifier: প্রতিটি ERC-721 টোকেন একটি ইউনিক আইডেন্টিফায়ার (ID) থাকে যা টোকেনটিকে অন্য টোকেন থেকে আলাদা করে।
- Ownership Tracking: ERC-721 টোকেনগুলো মালিকানা ট্র্যাক করে এবং এটি নিশ্চিত করে যে কেবলমাত্র এক ব্যক্তি বা অ্যাড্রেস মালিক হতে পারে।
- Transferability: ERC-721 টোকেনগুলি এক ব্যক্তি থেকে অন্য ব্যক্তির কাছে সহজে ট্রান্সফারযোগ্য।
2. NFTs (Non-Fungible Tokens)
NFTs হল এমন ডিজিটাল সম্পদ যা ইউনিক এবং একে অপর থেকে আলাদা। এগুলো ব্লকচেইনে রেকর্ড করা থাকে, এবং মালিকানা নিশ্চিত করতে সাহায্য করে। NFTs সাধারণত আর্ট, গেম আইটেম, ভিডিও, মিউজিক, এবং অন্যান্য ডিজিটাল বা বাস্তব সম্পদের প্রতিনিধিত্ব করে।
NFTs এর বৈশিষ্ট্য:
- Uniqueness: প্রতিটি NFT এর নিজস্ব ইউনিক বৈশিষ্ট্য থাকে, যেমন ডিজিটাল আর্টের একটি নির্দিষ্ট ছবি বা গেমের একটি নির্দিষ্ট আইটেম।
- Ownership Verification: NFTs ব্লকচেইনে রেকর্ড হওয়া মালিকানার তথ্য দিয়ে যাচাই করা যায়, যা ডিজিটাল মালিকানা নিশ্চিত করে।
- Indivisibility: NFTs সাধারণত ভাগ করা যায় না, একে পুরোপুরি বিক্রি বা ট্রান্সফার করতে হয়।
3. ERC-721 এর উদাহরণ এবং ব্যবহার
Solidity তে ERC-721 স্ট্যান্ডার্ড ব্যবহার করে NFT তৈরি করা হয়। এটি ERC-721 ইন্টারফেস এবং এর ফাংশনগুলোকে ব্যবহার করে ডিজিটাল টোকেন তৈরি করতে সহায়তা করে।
ERC-721 ইন্টারফেস:
interface IERC721 {
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function mint(address to, uint256 tokenId) external;
}এখানে, IERC721 হল একটি স্ট্যান্ডার্ড ইন্টারফেস যা ERC-721 টোকেনের মালিকানা, ট্রান্সফার, এবং অন্যান্য কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়। বিভিন্ন ফাংশন যেমন ownerOf, safeTransferFrom, এবং approve ব্যবহার করা হয় NFT এর মালিকানা এবং স্থানান্তর নিশ্চিত করতে।
ERC-721 টোকেন তৈরির উদাহরণ:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721 {
uint256 public tokenIdCounter;
constructor() ERC721("MyNFT", "MNFT") {}
function mint(address to) public {
uint256 tokenId = tokenIdCounter;
_mint(to, tokenId);
tokenIdCounter++;
}
}এখানে, MyNFT একটি ERC-721 টোকেন তৈরি করছে যা ERC721 কন্ট্রাক্টকে ইনহেরিট করে। mint ফাংশনটি একটি নতুন NFT তৈরি করে এবং সেটি নির্দিষ্ট অ্যাড্রেসে পাঠিয়ে দেয়।
4. NFTs এর ব্যবহার
NFTs এর ব্যবহার অনেক বিভিন্ন ক্ষেত্রে হয়ে থাকে। কিছু জনপ্রিয় ব্যবহার ক্ষেত্রের মধ্যে রয়েছে:
- ডিজিটাল আর্ট: আর্টিস্টরা তাদের ডিজিটাল শিল্পকর্ম NFT হিসেবে বিক্রি করতে পারেন।
- উদাহরণ: Cryptopunks, Beeple's Digital Artwork
- গেম আইটেম: গেম ডেভেলপাররা তাদের গেমের আইটেম (যেমন চরিত্র, অস্ত্র, বা ভূমিকা) NFTs হিসেবে তৈরি করতে পারেন, যা গেমের মধ্যে ব্যবহারযোগ্য এবং মালিকানা স্বীকৃত।
- উদাহরণ: Axie Infinity, Decentraland
- কোলেক্টিবলস (Collectibles): ক্রীড়া ইভেন্ট বা সংগীত শিল্পী তাদের পণ্য বা অন্য কালেক্টিবলস NFT হিসেবে তৈরি করে।
- উদাহরণ: NBA Top Shot, Music NFTs
- ডোমেন নাম: কিছু ডোমেন নাম NFTs হিসেবে ট্রেড করা হয়, যেখানে ডোমেন নামের মালিকানা ব্লকচেইনে রেকর্ড থাকে।
- উদাহরণ: Ethereum Name Service (ENS)
- Virtual Real Estate: ভার্চুয়াল জমি বা প্রপার্টি NFTs হিসেবে তৈরি করা যায়, যা ডিজিটাল গেমস বা ভার্চুয়াল বিশ্বে ব্যবহৃত হতে পারে।
- উদাহরণ: Decentraland, The Sandbox
5. NFT Marketplace
NFTs এর মাধ্যমে একটি বৃহৎ বাজার তৈরি হয়েছে যেখানে ব্যবহারকারীরা নিজেদের NFTs কেনা-বেচা করতে পারেন। বিভিন্ন প্ল্যাটফর্ম এবং মার্কেটপ্লেস আছে যেখানে আপনি NFTs কিনতে বা বিক্রি করতে পারেন। উদাহরণস্বরূপ:
- OpenSea: একটি জনপ্রিয় NFT মার্কেটপ্লেস যেখানে আপনি বিভিন্ন ডিজিটাল আর্ট, কালেক্টিবলস, এবং গেম আইটেম কেনা-বেচা করতে পারেন।
- Rarible: একটি ডিসেন্ট্রালাইজড NFT মার্কেটপ্লেস যেখানে ব্যবহারকারীরা নিজেদের NFTs তৈরি করতে পারেন এবং বেচতে পারেন।
সারাংশ
ERC-721 হল একটি স্ট্যান্ডার্ড যা NFTs তৈরি করতে ব্যবহৃত হয় এবং এটি Ethereum ব্লকচেইনে ইউনিক টোকেনের মালিকানা, ট্রান্সফার এবং অন্যান্য কার্যক্রম পরিচালনা করে। NFTs ইউনিক ডিজিটাল সম্পদ হিসেবে ব্যবহার করা হয়, যেমন আর্ট, গেম আইটেম, কালেক্টিবলস, এবং ভার্চুয়াল প্রপার্টি। ERC-721 এর মাধ্যমে NFTs তৈরি এবং পরিচালনা করা যায়, যা ব্লকচেইনে ডিজিটাল মালিকানা নিশ্চিত করে। NFTs শিল্প, গেমস, এবং বিভিন্ন ডিজিটাল সেক্টরে বিপ্লব ঘটাচ্ছে, এবং এগুলি দ্রুতই বৈশ্বিক অর্থনীতির একটি গুরুত্বপূর্ণ অংশ হয়ে উঠছে।
Solidity তে Token Creation, Minting এবং Burning হল একটি স্মার্ট কন্ট্রাক্টের মাধ্যমে ডিজিটাল টোকেন তৈরি এবং তার পরবর্তী পরিবর্তন (যেমন নতুন টোকেন তৈরি করা বা পুরানো টোকেন ধ্বংস করা) পরিচালনা করার প্রক্রিয়া। এই কার্যক্রমগুলো একটি ব্লকচেইন ভিত্তিক টোকেনের জন্য গুরুত্বপূর্ণ, বিশেষত ERC20 বা ERC721 স্ট্যান্ডার্ডের টোকেনের জন্য। টোকেন সৃষ্টি, ইস্যু এবং ধ্বংস করাটা ডিজিটাল মুদ্রা এবং সম্পদের ব্যবস্থাপনায় অত্যন্ত গুরুত্বপূর্ণ।
এখানে আমরা ERC20 স্ট্যান্ডার্ডের উদাহরণে Token Creation, Minting, এবং Burning এর ব্যবহার ব্যাখ্যা করবো।
১. Token Creation (টোকেন তৈরি করা)
Token Creation একটি টোকেন স্মার্ট কন্ট্রাক্ট তৈরি করার প্রক্রিয়া, যা একটি নির্দিষ্ট স্ট্যান্ডার্ড অনুযায়ী তৈরি করা হয়। ERC20 এবং ERC721 দুটি জনপ্রিয় টোকেন স্ট্যান্ডার্ড। ERC20 হচ্ছে একটি ফাঙ্গিবল টোকেন (যা এক ধরনের টোকেনের প্রতিটি ইউনিট অপরটির সমান), এবং ERC721 হচ্ছে একটি নন-ফাঙ্গিবল টোকেন (NFT) যা ইউনিক হয়।
ERC20 Token Creation Example:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract MyToken is IERC20 {
string public constant name = "MyToken";
string public constant symbol = "MTK";
uint8 public constant decimals = 18;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
constructor(uint256 initialSupply) {
_totalSupply = initialSupply * 10 ** uint256(decimals);
_balances[msg.sender] = _totalSupply; // Supply goes to the contract creator
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
require(_balances[sender] >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] -= amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}এখানে:
- ERC20 token তৈরি করার জন্য
name,symbol, এবংdecimalsডিফাইন করা হয়েছে। - কন্ট্রাক্টের
constructorফাংশনে টোকেনের ইনিশিয়াল সাপ্লাই নির্ধারণ করা হয়েছে, যা ডিপ্লয়ারের কাছে দেয়া হয়।
২. Minting (টোকেন মেন্টিং)
Minting হলো নতুন টোকেন তৈরি করার প্রক্রিয়া। এর মাধ্যমে নতুন টোকেন কন্ট্রাক্টের মধ্যে তৈরি করা হয় এবং তা ব্যবহারকারীদের কাছে বিতরণ করা হয়। ERC20 টোকেনের ক্ষেত্রে, এটি সাধারণত কন্ট্রাক্টের মালিক বা অ্যাডমিন দ্বারা সম্পাদিত হয়।
Minting Example (ERC20):
pragma solidity ^0.8.0;
contract MintableToken is MyToken {
address public owner;
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}
constructor(uint256 initialSupply) MyToken(initialSupply) {
owner = msg.sender;
}
function mint(address account, uint256 amount) public onlyOwner {
_mint(account, amount);
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
}এখানে:
- mint ফাংশনটি কেবলমাত্র মালিকের মাধ্যমে কল করা যাবে এবং এটি নতুন টোকেন তৈরি করে একটি নির্দিষ্ট অ্যাড্রেসে পাঠাবে।
_mintফাংশনটি নতুন টোকেন তৈরি এবং সরবরাহের জন্য ব্যবহৃত হয়।
৩. Burning (টোকেন বার্নিং)
Burning হলো একটি প্রক্রিয়া যার মাধ্যমে টোকেন ব্লকচেইন থেকে স্থায়ীভাবে মুছে ফেলা হয়। এটি সাধারণত টোকেন সাপ্লাই কমাতে ব্যবহৃত হয়, যার ফলে টোকেনের মান বা দাম বৃদ্ধি পেতে পারে। burn ফাংশন একটি নির্দিষ্ট পরিমাণ টোকেন নিয়ে সেটি ব্লকচেইনে ধ্বংস করে।
Burning Example (ERC20):
pragma solidity ^0.8.0;
contract BurnableToken is MyToken {
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
require(_balances[account] >= amount, "ERC20: burn amount exceeds balance");
_balances[account] -= amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount); // Emitting Transfer event to signal the burning
}
}এখানে:
- burn ফাংশনটি ব্যবহারকারীকে নির্দিষ্ট পরিমাণ টোকেন বার্ন করার সুযোগ দেয়।
_burnফাংশনটিmsg.senderএর ব্যালেন্স থেকে টোকেন অপসারণ করে এবং টোকেনের মোট সাপ্লাই কমিয়ে দেয়।
সারাংশ
Token Creation, Minting এবং Burning হল টোকেন ব্যবস্থাপনার মূল অংশ যা ব্লকচেইন ভিত্তিক ক্রিপ্টোকারেন্সি এবং ডিজিটাল অ্যাসেটের জন্য ব্যবহৃত হয়। Token Creation এর মাধ্যমে ERC20 বা ERC721 স্ট্যান্ডার্ডের ভিত্তিতে টোকেন তৈরি করা হয়। Minting নতুন টোকেন তৈরি করার প্রক্রিয়া এবং Burning হলো টোকেন ধ্বংস করার প্রক্রিয়া, যা সাপ্লাই কমাতে সহায়ক হয়। এগুলোর মাধ্যমে টোকেন ব্যবস্থাপনা আরও দক্ষ এবং নিরাপদ হয়, যা ডিজিটাল অর্থনীতি এবং ব্লকচেইন প্রোজেক্টের জন্য অপরিহার্য।
Solidity তে Token Standards হল কিছু নির্দিষ্ট নিয়ম এবং স্ট্যান্ডার্ড প্রোটোকল যা ব্লকচেইনে টোকেন তৈরি করার জন্য ব্যবহার করা হয়। টোকেন স্ট্যান্ডার্ডগুলি বিভিন্ন কন্ট্রাক্টের মধ্যে একক রূপে টোকেনের আচরণ নিশ্চিত করে এবং এটি ডেভেলপারদের জন্য টোকেন তৈরি ও ইন্টিগ্রেশনকে সহজ করে তোলে।
এখানে আলোচনা করা হবে ERC-20, ERC-721, এবং ERC-1155 স্ট্যান্ডার্ডগুলির সাথে স্মার্ট কন্ট্রাক্টের ইন্টিগ্রেশন সম্পর্কে।
১. ERC-20 Token Standard
ERC-20 হল Ethereum ব্লকচেইনে সর্বাধিক ব্যবহৃত টোকেন স্ট্যান্ডার্ড। এটি একটি ফাংকশনাল টোকেন স্ট্যান্ডার্ড যা ডিজিটাল মুদ্রা বা অন্যান্য টোকেন তৈরি করতে ব্যবহৃত হয়। ERC-20 টোকেনের মাধ্যমে এক কন্ট্রাক্টের মধ্যে নির্দিষ্ট মানের টোকেন তৈরি করা যায় এবং অন্যান্য কন্ট্রাক্ট বা ওয়ালেটের সাথে যোগাযোগ করা যায়।
ERC-20 এর মূল ফাংশন:
totalSupply(): টোকেনের মোট সরবরাহ।balanceOf(address account): কোনো একাউন্টের ব্যালেন্স।transfer(address recipient, uint256 amount): টোকেন ট্রান্সফার করতে।approve(address spender, uint256 amount): অনুমতি প্রদান করতে।transferFrom(address sender, address recipient, uint256 amount): অনুমতি দিয়ে ট্রান্সফার করা।allowance(address owner, address spender): কিভাবে একটি অ্যাকাউন্ট অন্য অ্যাকাউন্টের থেকে ট্রান্সফার করতে পারে তা জানাতে।
ERC-20 Token এর উদাহরণ:
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract MyToken is IERC20 {
string public name = "MyToken";
string public symbol = "MTK";
uint8 public decimals = 18;
uint256 public override totalSupply;
mapping(address => uint256) public balances;
mapping(address => mapping(address => uint256)) public allowances;
constructor(uint256 _initialSupply) {
totalSupply = _initialSupply * 10 ** uint256(decimals);
balances[msg.sender] = totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return balances[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
require(amount <= balances[msg.sender], "Insufficient balance");
balances[msg.sender] -= amount;
balances[recipient] += amount;
return true;
}
function approve(address spender, uint256 amount) public override returns (bool) {
allowances[msg.sender][spender] = amount;
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
require(amount <= balances[sender], "Insufficient balance");
require(amount <= allowances[sender][msg.sender], "Allowance exceeded");
balances[sender] -= amount;
balances[recipient] += amount;
allowances[sender][msg.sender] -= amount;
return true;
}
}এখানে:
MyTokenকন্ট্রাক্টটি ERC-20 স্ট্যান্ডার্ড অনুসরণ করে এবং টোকেন ট্রান্সফার, ব্যালেন্স চেক এবং অনুমতি ব্যবস্থা ফাংশন সরবরাহ করে।
২. ERC-721 Token Standard (NFTs)
ERC-721 একটি স্ট্যান্ডার্ড যা Non-Fungible Tokens (NFTs) তৈরি করার জন্য ব্যবহৃত হয়। NFTs হল একক এবং অদ্বিতীয় ডিজিটাল অ্যাসেট, যেমন আর্টওয়ার্ক, ভিডিও, গেম আইটেম ইত্যাদি। ERC-721 স্ট্যান্ডার্ড টোকেনের মধ্যে প্রতিটি টোকেনের একটি ইউনিক আইডেন্টিফায়ার থাকে, যার মাধ্যমে তারা একে অপর থেকে আলাদা হয়।
ERC-721 এর মূল ফাংশন:
ownerOf(uint256 tokenId): টোকেনের মালিক কে।safeTransferFrom(address from, address to, uint256 tokenId): টোকেন ট্রান্সফার করতে।approve(address to, uint256 tokenId): কোনো নির্দিষ্ট টোকেনের জন্য অনুমতি প্রদান করতে।getApproved(uint256 tokenId): নির্দিষ্ট টোকেনের জন্য অনুমতি যাচাই করতে।
ERC-721 এর উদাহরণ:
pragma solidity ^0.8.0;
interface IERC721 {
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
}
contract MyNFT is IERC721 {
string public name = "MyNFT";
string public symbol = "MNFT";
mapping(uint256 => address) public owners;
mapping(address => uint256) public balances;
function ownerOf(uint256 tokenId) public view override returns (address) {
return owners[tokenId];
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override {
require(from == owners[tokenId], "Not the owner");
owners[tokenId] = to;
balances[from] -= 1;
balances[to] += 1;
}
function approve(address to, uint256 tokenId) public override {
// Approve logic
}
}এখানে:
MyNFTকন্ট্রাক্টটি ERC-721 স্ট্যান্ডার্ড অনুসরণ করে এবং NFT তৈরি এবং ট্রান্সফার করতে ব্যবহৃত হয়।
৩. ERC-1155 Token Standard (Multi-Token Standard)
ERC-1155 একটি স্ট্যান্ডার্ড যা একাধিক ধরনের টোকেন তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। এটি একক কন্ট্রাক্টের মধ্যে fungible (ERC-20) এবং non-fungible (ERC-721) টোকেন সমর্থন করতে পারে। এটি গ্যাস খরচ কমানোর জন্য উপযোগী কারণ একাধিক টোকেন একসাথে ট্রান্সফার করা যায়।
ERC-1155 এর মূল ফাংশন:
safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data): টোকেন ট্রান্সফার করতে।balanceOf(address account, uint256 id): নির্দিষ্ট টোকেনের ব্যালেন্স চেক করতে।
ERC-1155 এর উদাহরণ:
pragma solidity ^0.8.0;
interface IERC1155 {
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external;
function balanceOf(address account, uint256 id) external view returns (uint256);
}
contract MyMultiToken is IERC1155 {
mapping(address => mapping(uint256 => uint256)) public balances;
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) public override {
require(balances[from][id] >= amount, "Insufficient balance");
balances[from][id] -= amount;
balances[to][id] += amount;
}
function balanceOf(address account, uint256 id) public view override returns (uint256) {
return balances[account][id];
}
}এখানে:
MyMultiTokenকন্ট্রাক্টটি ERC-1155 স্ট্যান্ডার্ড অনুসরণ করে এবং একাধিক টোকেন ধরনের জন্য ট্রান্সফার এবং ব্যালেন্স ফাংশন সরবরাহ করে।
Smart Contract এর ইন্টিগ্রেশন
এই স্ট্যান্ডার্ডগুলি স্মার্ট কন্ট্রাক্টের মধ্যে একাধিক ফাংশনালিটি এবং ধরনের টোকেন সমর্থন করতে সাহায্য করে। এক কন্ট্রাক্টের মাধ্যমে অন্য কন্ট্রাক্টের সাথে যোগাযোগ করার জন্য আপনি interface এবং inheritance ব্যবহার করে বিভিন্ন টোকেনের কার্যক্রম পরিচালনা করতে পারেন। উদাহরণস্বরূপ, যদি আপনার একটি DeFi প্ল্যাটফর্ম থাকে, যেখানে ERC-20, ERC-721 এবং ERC-1155 টোকেনের সমন্বয়ে ট্রানজেকশন হতে পারে, তবে আপনি প্রতিটি স্ট্যান্ডার্ডের জন্য আলাদা ফাংশন তৈরি করতে পারেন এবং সেগুলিকে এক কন্ট্রাক্টের মধ্যে ইন্টিগ্রেট করতে পারেন।
সারাংশ
Token Standards হল একটি গুরুত্বপূর্ণ উপাদান যা স্মার্ট কন্ট্রাক্টের মাধ্যমে বিভিন্ন ধরনের টোকেন তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। ERC-20, ERC-721, এবং ERC-1155 হল সবচেয়ে জনপ্রিয় টোকেন স্ট্যান্ডার্ড, যেগুলির মাধ্যমে আপনি ফাংকশনাল এবং ইউনিক টোকেন তৈরি করতে পারেন। এসব স্ট্যান্ডার্ড
ের সাথে ইন্টিগ্রেশন স্মার্ট কন্ট্রাক্টের কার্যকারিতা বৃদ্ধি করে এবং বিভিন্ন কন্ট্রাক্টের মধ্যে যোগাযোগ সহজ করে তোলে।
Read more