ERC-1155 মাল্টি-টোকেন স্ট্যান্ডার্ড
পেজ সর্বশেষ আপডেট করা হয়েছে: 3 এপ্রিল, 2026
ভূমিকা
একাধিক টোকেন টাইপ পরিচালনা করে এমন কন্ট্রাক্টগুলোর জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস। একটি একক ডেপ্লয় করা কন্ট্রাক্টে ফান্জেবল টোকেন, নন-ফান্জেবল টোকেন বা অন্যান্য কনফিগারেশনের (যেমন, সেমি-ফান্জেবল টোকেন) যেকোনো সমন্বয় অন্তর্ভুক্ত থাকতে পারে।
মাল্টি-টোকেন স্ট্যান্ডার্ড বলতে কী বোঝায়?
ধারণাটি সহজ এবং এটি এমন একটি স্মার্ট কন্ট্রাক্ট ইন্টারফেস তৈরি করতে চায় যা যেকোনো সংখ্যক ফান্জেবল এবং নন-ফান্জেবল টোকেন টাইপকে উপস্থাপন এবং নিয়ন্ত্রণ করতে পারে। এইভাবে, 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 এর ফাংশন এবং বৈশিষ্ট্যসমূহ:
- ব্যাচ ট্রান্সফার: একটি একক কলে একাধিক অ্যাসেট ট্রান্সফার করুন।
- ব্যাচ ব্যালেন্স: একটি একক কলে একাধিক অ্যাসেটের ব্যালেন্স পান।
- ব্যাচ অ্যাপ্রুভাল: একটি এডড্রেস-এ সমস্ত টোকেন অনুমোদন করুন।
- হুকস: রিসিভ টোকেনস হুক।
- 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);
ব্যালেন্স কলের জন্য এটি আরও সহজ, আমরা একটি একক কলে একাধিক ব্যালেন্স পুনরুদ্ধার করতে পারি। আমরা ওনারদের (owners) অ্যারে পাস করি, এরপর টোকেন 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) দেখুন।
নিরাপদ ট্রান্সফার নিয়ম
আমরা পূর্ববর্তী ব্যাখ্যাগুলোতে ইতিমধ্যে কয়েকটি নিরাপদ ট্রান্সফার নিয়ম নিয়ে আলোচনা করেছি। তবে চলুন সবচেয়ে গুরুত্বপূর্ণ নিয়মগুলো দেখি:
- কলারকে (caller)
_fromএডড্রেস-এর জন্য টোকেন খরচ করার অনুমোদন থাকতে হবে অথবা কলারকে_from-এর সমান হতে হবে। - ট্রান্সফার কলটি অবশ্যই রিভার্ট (revert) হবে যদি
_toএডড্রেস 0 হয়।_ids-এর দৈর্ঘ্য_values-এর দৈর্ঘ্যের সমান না হয়।_ids-এ থাকা টোকেন(গুলোর) জন্য হোল্ডার(দের) যেকোনো ব্যালেন্স প্রাপকের কাছে পাঠানো_values-এর সংশ্লিষ্ট পরিমাণ(গুলোর) চেয়ে কম হয়।- অন্য কোনো ত্রুটি ঘটে।
দ্রষ্টব্য: হুকসহ সমস্ত ব্যাচ ফাংশন ব্যাচ ছাড়া সংস্করণ হিসেবেও বিদ্যমান। এটি গ্যাস দক্ষতার জন্য করা হয়েছে, কারণ শুধুমাত্র একটি অ্যাসেট ট্রান্সফার করাই সম্ভবত সবচেয়ে বেশি ব্যবহৃত উপায় হবে। নিরাপদ ট্রান্সফার নিয়মসহ ব্যাখ্যাগুলোতে সরলতার জন্য আমরা সেগুলোকে বাদ দিয়েছি। নামগুলো অভিন্ন, শুধু 'Batch' শব্দটি সরিয়ে দিন।