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 में एकमात्र अंतर यह है कि हम मानों को एक ऐरे (array) के रूप में पास करते हैं और हम आईडी (ids) का एक ऐरे भी पास करते हैं। उदाहरण के लिए ids=[3, 6, 13] और values=[100, 200, 5] दिए जाने पर, परिणामी ट्रांसफर होंगे:
_fromसे_toतक 3 आईडी वाले 100 टोकन ट्रांसफर करें।_fromसे_toतक 6 आईडी वाले 200 टोकन ट्रांसफर करें।_fromसे_toतक 13 आईडी वाले 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) का ऐरे पास करते हैं, उसके बाद टोकन आईडी का ऐरे पास करते हैं।
उदाहरण के लिए _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' हटा दें।