मुख्य सामग्री पर जाएं
Change page

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 के कार्य और विशेषताएँ:

बैच ट्रांसफर

बैच ट्रांसफर नियमित ERC-20 ट्रांसफर के समान ही काम करता है। आइए नियमित ERC-20 transferFrom फ़ंक्शन को देखें:

ERC-1155 में एकमात्र अंतर यह है कि हम मानों को एक ऐरे (array) के रूप में पास करते हैं और हम आईडी (ids) का एक ऐरे भी पास करते हैं। उदाहरण के लिए ids=[3, 6, 13] और values=[100, 200, 5] दिए जाने पर, परिणामी ट्रांसफर होंगे:

  1. _from से _to तक 3 आईडी वाले 100 टोकन ट्रांसफर करें।
  2. _from से _to तक 6 आईडी वाले 200 टोकन ट्रांसफर करें।
  3. _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-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) देखें।

सुरक्षित ट्रांसफर नियम

हमने पिछले स्पष्टीकरणों में पहले ही कुछ सुरक्षित ट्रांसफर नियमों पर चर्चा की है। लेकिन आइए सबसे महत्वपूर्ण नियमों पर नज़र डालें:

  1. कॉलर को _from पते के लिए टोकन खर्च करने की स्वीकृति होनी चाहिए या कॉलर _from के बराबर होना चाहिए।
  2. ट्रांसफर कॉल को रिवर्ट करना चाहिए यदि
    1. _to पता 0 है।
    2. _ids की लंबाई _values की लंबाई के समान नहीं है।
    3. _ids में टोकन के लिए धारक(कों) का कोई भी बैलेंस प्राप्तकर्ता को भेजे गए _values में संबंधित राशि(यों) से कम है।
    4. कोई अन्य त्रुटि होती है।

नोट: हुक सहित सभी बैच फ़ंक्शन बिना बैच वाले संस्करणों के रूप में भी मौजूद हैं। यह गैस दक्षता के लिए किया गया है, यह देखते हुए कि केवल एक संपत्ति को ट्रांसफर करना संभवतः अभी भी सबसे अधिक उपयोग किया जाने वाला तरीका होगा। हमने स्पष्टीकरण में सरलता के लिए उन्हें छोड़ दिया है, जिसमें सुरक्षित ट्रांसफर नियम भी शामिल हैं। नाम समान हैं, बस 'Batch' हटा दें।

आगे की पढ़ाई