ERC-1155 মাল্টি-টোকেন স্ট্যান্ডার্ড
ভূমিকা
একাধিক টোকেন ধরন পরিচালনা করে এমন কন্ট্রাক্টগুলোর জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস। একটি একক ডিপ্লয় করা কন্ট্রাক্টে বিনিমেয় টোকেন, অবিনিমেয় টোকেন বা অন্যান্য কনফিগারেশনের (যেমন, আধা-বিনিমেয় টোকেন) যেকোনো সমন্বয় অন্তর্ভুক্ত থাকতে পারে।
মাল্টি-টোকেন স্ট্যান্ডার্ড বলতে কী বোঝায়?
ধারণাটি সহজ এবং এটি এমন একটি স্মার্ট কন্ট্রাক্ট ইন্টারফেস তৈরি করতে চায় যা যেকোনো সংখ্যক বিনিমেয় এবং অবিনিমেয় টোকেন ধরনকে উপস্থাপন এবং নিয়ন্ত্রণ করতে পারে। এইভাবে, ERC-1155 টোকেন একটি ERC-20 এবং ERC-721 টোকেনের মতো একই কাজ করতে পারে এবং এমনকি একই সাথে উভয় কাজও করতে পারে। এটি ERC-20 এবং ERC-721 উভয় স্ট্যান্ডার্ডের কার্যকারিতা উন্নত করে, এটিকে আরও দক্ষ করে তোলে এবং সুস্পষ্ট বাস্তবায়ন ত্রুটিগুলো সংশোধন করে।
ERC-1155 টোকেনটি EIP-1155 (opens in a new tab)-এ সম্পূর্ণভাবে বর্ণনা করা হয়েছে।
পূর্বশর্ত
এই পৃষ্ঠাটি আরও ভালোভাবে বোঝার জন্য, আমরা সুপারিশ করছি যে আপনি প্রথমে টোকেন স্ট্যান্ডার্ড, ERC-20 এবং ERC-721 সম্পর্কে পড়ুন।
ERC-1155 এর ফাংশন এবং বৈশিষ্ট্য:
- ব্যাচ হস্তান্তর: একটি একক কলে একাধিক সম্পদ হস্তান্তর করুন।
- ব্যাচ ব্যালেন্স: একটি একক কলে একাধিক সম্পদের ব্যালেন্স পান।
- ব্যাচ অনুমোদন: একটি ঠিকানায় সমস্ত টোকেন অনুমোদন করুন।
- হুকস (Hooks): টোকেন গ্রহণের হুক।
- NFT সমর্থন: যদি সরবরাহ শুধুমাত্র 1 হয়, তবে এটিকে NFT হিসেবে বিবেচনা করুন।
- নিরাপদ হস্তান্তরের নিয়ম: নিরাপদ হস্তান্তরের জন্য নিয়মের সেট।
ব্যাচ হস্তান্তর
ব্যাচ হস্তান্তর সাধারণ ERC-20 হস্তান্তরের মতোই কাজ করে। চলুন সাধারণ ERC-20 transferFrom ফাংশনটি দেখি:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
ERC-1155-এ একমাত্র পার্থক্য হলো আমরা মানগুলোকে একটি অ্যারে হিসেবে পাস করি এবং আমরা id-গুলোর একটি অ্যারেও পাস করি। উদাহরণস্বরূপ ids=[3, 6, 13] এবং values=[100, 200, 5] দেওয়া হলে, এর ফলে যে হস্তান্তরগুলো হবে তা হলো
_fromথেকে_to-এ 3 id যুক্ত 100টি টোকেন হস্তান্তর করা।_fromথেকে_to-এ 6 id যুক্ত 200টি টোকেন হস্তান্তর করা।_fromথেকে_to-এ 13 id যুক্ত 5টি টোকেন হস্তান্তর করা।
ERC-1155-এ আমাদের শুধুমাত্র transferFrom আছে, কোনো transfer নেই। এটিকে একটি সাধারণ transfer এর মতো ব্যবহার করতে, শুধুমাত্র from ঠিকানাকে সেই ঠিকানায় সেট করুন যা ফাংশনটিকে কল করছে।
ব্যাচ ব্যালেন্স
সংশ্লিষ্ট ERC-20 balanceOf কলেরও একইভাবে ব্যাচ সমর্থনসহ এর পার্টনার ফাংশন রয়েছে। মনে করিয়ে দেওয়ার জন্য, এটি হলো ERC-20 সংস্করণ:
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
ব্যালেন্স কলের জন্য এটি আরও সহজ, আমরা একটি একক কলে একাধিক ব্যালেন্স পুনরুদ্ধার করতে পারি। আমরা মালিকদের অ্যারে পাস করি, এরপর টোকেন id-গুলোর অ্যারে পাস করি।
উদাহরণস্বরূপ _ids=[3, 6, 13] এবং _owners=[0xbeef..., 0x1337..., 0x1111...] দেওয়া হলে, রিটার্ন মান হবে
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
ব্যাচ অনুমোদন
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
অনুমোদনগুলো ERC-20 এর চেয়ে কিছুটা আলাদা। নির্দিষ্ট পরিমাণ অনুমোদন করার পরিবর্তে, আপনি setApprovalForAll এর মাধ্যমে একজন অপারেটরকে অনুমোদিত বা অননুমোদিত হিসেবে সেট করেন।
বর্তমান অবস্থা পড়া isApprovedForAll এর মাধ্যমে করা যেতে পারে। যেমনটি আপনি দেখতে পাচ্ছেন, এটি একটি 'সব-বা-কিছুই-না' (all-or-nothing) অপারেশন। আপনি কতগুলো টোকেন অনুমোদন করবেন বা এমনকি কোন টোকেন ক্লাস তা নির্ধারণ করতে পারবেন না।
এটি ইচ্ছাকৃতভাবে সরলতার কথা মাথায় রেখে ডিজাইন করা হয়েছে। আপনি শুধুমাত্র একটি ঠিকানার জন্য সবকিছু অনুমোদন করতে পারেন।
রিসিভ হুক
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
EIP-165 (opens in a new tab) সমর্থনের কারণে, ERC-1155 শুধুমাত্র স্মার্ট কন্ট্রাক্টগুলোর জন্য রিসিভ হুক সমর্থন করে। হুক ফাংশনটিকে অবশ্যই একটি ম্যাজিক পূর্বনির্ধারিত bytes4 মান প্রদান করতে হবে যা নিচে দেওয়া হলো:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
যখন গ্রহণকারী কন্ট্রাক্ট এই মানটি প্রদান করে, তখন ধরে নেওয়া হয় যে কন্ট্রাক্টটি হস্তান্তর গ্রহণ করে এবং জানে কীভাবে ERC-1155 টোকেনগুলো পরিচালনা করতে হয়। দারুণ, কন্ট্রাক্টে আর কোনো আটকে থাকা টোকেন নেই!
NFT সমর্থন
যখন সরবরাহ শুধুমাত্র একটি হয়, তখন টোকেনটি মূলত একটি অবিনিমেয় টোকেন (NFT)। এবং ERC-721 এর স্ট্যান্ডার্ড অনুযায়ী, আপনি একটি মেটাডেটা URL সংজ্ঞায়িত করতে পারেন। URL-টি ক্লায়েন্টদের দ্বারা পড়া এবং পরিবর্তন করা যেতে পারে, এখানে (opens in a new tab) দেখুন।
নিরাপদ হস্তান্তরের নিয়ম
আমরা পূর্ববর্তী ব্যাখ্যাগুলোতে ইতিমধ্যে কয়েকটি নিরাপদ হস্তান্তরের নিয়ম নিয়ে আলোচনা করেছি। তবে চলুন সবচেয়ে গুরুত্বপূর্ণ নিয়মগুলো দেখি:
- কলারকে অবশ্যই
_fromঠিকানার জন্য টোকেন খরচ করার অনুমোদন পেতে হবে অথবা কলারকে_fromএর সমান হতে হবে। - হস্তান্তর কলটি অবশ্যই রিভার্ট করতে হবে যদি
_toঠিকানা 0 হয়।_idsএর দৈর্ঘ্য_valuesএর দৈর্ঘ্যের সমান না হয়।_ids-এ থাকা টোকেন(গুলোর) জন্য হোল্ডার(দের) যেকোনো ব্যালেন্স প্রাপকের কাছে পাঠানো_values-এর সংশ্লিষ্ট পরিমাণ(গুলোর) চেয়ে কম হয়।- অন্য কোনো ত্রুটি ঘটে।
দ্রষ্টব্য: হুকসহ সমস্ত ব্যাচ ফাংশন ব্যাচ ছাড়া সংস্করণ হিসেবেও বিদ্যমান। এটি গ্যাস দক্ষতার জন্য করা হয়েছে, কারণ শুধুমাত্র একটি সম্পদ হস্তান্তর করা সম্ভবত এখনও সবচেয়ে বেশি ব্যবহৃত উপায় হবে। নিরাপদ হস্তান্তরের নিয়মসহ ব্যাখ্যাগুলোতে সরলতার জন্য আমরা সেগুলোকে বাদ দিয়েছি। নামগুলো অভিন্ন, শুধু 'Batch' শব্দটি সরিয়ে দিন।