मुख्य आशयावर जा

⁠Vyper⁠ ⁠ERC-721⁠ कॉन्ट्रॅक्ट वॉकथ्रू

Vyper
erc-721
Python
नवशिक्या
ओरी पोमेरँट्झ
1 एप्रिल, 2021
19 मिनिटांचे वाचन

परिचय

ERC-721 स्टँडर्डचा वापर नॉन-फंजिबल टोकन्स (NFT) ची मालकी ठेवण्यासाठी केला जातो. ERC-20 टोकन कमोडिटी (वस्तू) प्रमाणे वागतात, कारण वैयक्तिक टोकन्समध्ये कोणताही फरक नसतो. याउलट, ERC-721 टोकन अशा मालमत्तांसाठी डिझाइन केलेले आहेत जे समान आहेत परंतु तंतोतंत एकसारखे नाहीत, जसे की भिन्न कॅट कार्टून्स (opens in a new tab) किंवा रिअल इस्टेटच्या वेगवेगळ्या तुकड्यांचे टायटल्स.

या लेखामध्ये आपण रयुया नाकामुरा यांच्या ERC-721 कॉन्ट्रॅक्टचे (opens in a new tab) विश्लेषण करू. हे कॉन्ट्रॅक्ट Vyper (opens in a new tab) मध्ये लिहिलेले आहे, जी Python सारखी कॉन्ट्रॅक्ट भाषा आहे आणि ती Solidity पेक्षा असुरक्षित कोड लिहिणे अधिक कठीण करण्यासाठी डिझाइन केलेली आहे.

कॉन्ट्रॅक्ट

# @dev ERC-721 नॉन-फंजिबल टोकन स्टँडर्डची अंमलबजावणी.
# @author Ryuya Nakamura (@nrryuya)
# येथून सुधारित: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy

Vyper मधील टिप्पण्या (comments), Python प्रमाणेच, हॅश (#) ने सुरू होतात आणि ओळीच्या शेवटपर्यंत चालू राहतात. ज्या टिप्पण्यांमध्ये @<keyword> समाविष्ट असते त्यांचा वापर NatSpec (opens in a new tab) द्वारे मानवांना वाचता येण्याजोगे दस्तऐवजीकरण तयार करण्यासाठी केला जातो.

from vyper.interfaces import ERC721

implements: ERC721

ERC-721 इंटरफेस Vyper भाषेमध्ये अंगभूत आहे. तुम्ही कोडची व्याख्या येथे पाहू शकता (opens in a new tab). इंटरफेसची व्याख्या Vyper ऐवजी Python मध्ये लिहिलेली आहे, कारण इंटरफेस केवळ ब्लॉकचेनमध्येच वापरले जात नाहीत, तर बाह्य क्लायंटकडून ब्लॉकचेनला व्यवहार पाठवताना देखील वापरले जातात, जे Python मध्ये लिहिलेले असू शकतात.

पहिली ओळ इंटरफेस इम्पोर्ट करते आणि दुसरी ओळ निर्दिष्ट करते की आपण त्याची येथे अंमलबजावणी करत आहोत.

ERC721Receiver इंटरफेस

# safeTransferFrom() द्वारे कॉल केलेल्या कॉन्ट्रॅक्टसाठी इंटरफेस
interface ERC721Receiver:
    def onERC721Received(

ERC-721 दोन प्रकारच्या हस्तांतरणास समर्थन देते:

  • transferFrom, जे प्रेषकाला कोणताही गंतव्य पत्ता निर्दिष्ट करू देते आणि हस्तांतरणाची जबाबदारी प्रेषकावर टाकते. याचा अर्थ असा की तुम्ही अवैध पत्त्यावर हस्तांतरण करू शकता, अशा परिस्थितीत NFT कायमचे गमावले जाते.
  • safeTransferFrom, जे गंतव्य पत्ता कॉन्ट्रॅक्ट आहे की नाही हे तपासते. तसे असल्यास, ERC-721 कॉन्ट्रॅक्ट प्राप्त करणाऱ्या कॉन्ट्रॅक्टला विचारते की त्याला NFT प्राप्त करायचे आहे का.

safeTransferFrom विनंत्यांना उत्तर देण्यासाठी प्राप्त करणाऱ्या कॉन्ट्रॅक्टला ERC721Receiver ची अंमलबजावणी करावी लागते.

            _operator: address,
            _from: address,

_from पत्ता हा टोकनचा वर्तमान मालक आहे. _operator पत्ता तो आहे ज्याने हस्तांतरणाची विनंती केली आहे (मंजुरीमुळे हे दोन्ही समान नसू शकतात).

            _tokenId: uint256,

ERC-721 टोकन आयडी 256 बिट्सचे असतात. सामान्यतः ते टोकन ज्याचे प्रतिनिधित्व करते त्याच्या वर्णनाचे हॅशिंग करून तयार केले जातात.

            _data: Bytes[1024]

विनंतीमध्ये 1024 बाइट्सपर्यंत वापरकर्ता डेटा असू शकतो.

        ) -> bytes32: view

एखादे कॉन्ट्रॅक्ट चुकून हस्तांतरण स्वीकारते अशा प्रकरणांना प्रतिबंध करण्यासाठी रिटर्न व्हॅल्यू बुलियन नसते, तर विशिष्ट मूल्यासह 256 बिट्स असते.

हे फंक्शन एक view आहे, ज्याचा अर्थ असा की ते ब्लॉकचेनची स्थिती वाचू शकते, परंतु त्यात बदल करू शकत नाही.

घटना

ब्लॉकचेनच्या बाहेरील वापरकर्त्यांना आणि सर्व्हरला घटनांची माहिती देण्यासाठी घटना उत्सर्जित केल्या जातात. लक्षात घ्या की घटनांची सामग्री ब्लॉकचेनवरील कॉन्ट्रॅक्ट्ससाठी उपलब्ध नसते.

हे ERC-20 Transfer घटनेसारखेच आहे, फक्त आपण रकमेऐवजी tokenId नोंदवतो. शून्य पत्ता कोणाच्याही मालकीचा नसतो, त्यामुळे प्रथेनुसार आपण त्याचा वापर टोकन्सची निर्मिती आणि नष्ट झाल्याची नोंद करण्यासाठी करतो.

ERC-721 मंजुरी ही ERC-20 मंजुरीसारखीच असते. एका विशिष्ट पत्त्याला विशिष्ट टोकन हस्तांतरित करण्याची परवानगी असते. हे कॉन्ट्रॅक्ट्सना टोकन स्वीकारताना प्रतिसाद देण्यासाठी एक यंत्रणा देते. कॉन्ट्रॅक्ट्स घटना ऐकू शकत नाहीत, त्यामुळे जर तुम्ही त्यांना फक्त टोकन हस्तांतरित केले तर त्यांना त्याबद्दल "माहित" नसते. अशा प्रकारे मालक प्रथम मंजुरी सबमिट करतो आणि नंतर कॉन्ट्रॅक्टला विनंती पाठवतो: "मी तुम्हाला टोकन X हस्तांतरित करण्यास मंजुरी दिली आहे, कृपया ... करा".

ERC-721 स्टँडर्डला ERC-20 स्टँडर्डसारखे बनवण्यासाठी ही एक डिझाइन निवड आहे. कारण ERC-721 टोकन फंजिबल नसतात, एखादे कॉन्ट्रॅक्ट टोकनच्या मालकीकडे पाहून त्याला विशिष्ट टोकन मिळाले आहे हे देखील ओळखू शकते.

कधीकधी असा ऑपरेटर असणे उपयुक्त ठरते जो खात्याच्या विशिष्ट प्रकारच्या सर्व टोकन्सचे व्यवस्थापन करू शकतो (जे विशिष्ट कॉन्ट्रॅक्टद्वारे व्यवस्थापित केले जातात), पॉवर ऑफ ॲटर्नी प्रमाणे. उदाहरणार्थ, मला अशी शक्ती अशा कॉन्ट्रॅक्टला द्यायची असेल जे मी सहा महिने त्याच्याशी संपर्क साधला नाही हे तपासते आणि तसे असल्यास माझी मालमत्ता माझ्या वारसांना वितरीत करते (जर त्यांच्यापैकी कोणी त्याची मागणी केली तर, व्यवहाराद्वारे कॉल केल्याशिवाय कॉन्ट्रॅक्ट्स काहीही करू शकत नाहीत). ERC-20 मध्ये आपण वारसा कॉन्ट्रॅक्टला फक्त उच्च मंजुरी देऊ शकतो, परंतु ते ERC-721 साठी कार्य करत नाही कारण टोकन फंजिबल नसतात. हा त्याचा समतुल्य पर्याय आहे.

approved मूल्य आपल्याला सांगते की घटना मंजुरीसाठी आहे की मंजुरी मागे घेण्यासाठी आहे.

स्थिती व्हेरिएबल्स

या व्हेरिएबल्समध्ये टोकन्सची वर्तमान स्थिती असते: कोणते उपलब्ध आहेत आणि त्यांच्या मालकीचे कोण आहेत. यापैकी बहुतांश HashMap ऑब्जेक्ट्स आहेत, दोन प्रकारांमध्ये अस्तित्वात असलेले युनिडायरेक्शनल मॅपिंग्ज (opens in a new tab).

# @dev NFT ID वरून त्याच्या मालकीच्या पत्त्यावर मॅपिंग.
idToOwner: HashMap[uint256, address]

# @dev NFT ID वरून मंजूर पत्त्यावर मॅपिंग.
idToApprovals: HashMap[uint256, address]

इथेरियममधील वापरकर्ता आणि कॉन्ट्रॅक्ट ओळख 160-बिट पत्त्यांद्वारे दर्शविली जाते. हे दोन व्हेरिएबल्स टोकन आयडीवरून त्यांच्या मालकांना आणि त्यांना हस्तांतरित करण्यासाठी मंजूर केलेल्यांना मॅप करतात (प्रत्येकासाठी जास्तीत जास्त एक). इथेरियममध्ये, अनइनिशियलाइज्ड डेटा नेहमी शून्य असतो, त्यामुळे जर कोणताही मालक किंवा मंजूर हस्तांतरणकर्ता नसेल तर त्या टोकनचे मूल्य शून्य असते.

# @dev मालकाच्या पत्त्यावरून त्याच्या टोकनच्या संख्येवर मॅपिंग.
ownerToNFTokenCount: HashMap[address, uint256]

हे व्हेरिएबल प्रत्येक मालकासाठी टोकन्सची संख्या ठेवते. मालकांकडून टोकन्सपर्यंत कोणतेही मॅपिंग नाही, त्यामुळे विशिष्ट मालकाच्या मालकीचे टोकन ओळखण्याचा एकमेव मार्ग म्हणजे ब्लॉकचेनच्या घटना इतिहासामध्ये मागे पाहणे आणि योग्य Transfer घटना पाहणे. आपल्याकडे सर्व NFTs कधी आहेत हे जाणून घेण्यासाठी आपण या व्हेरिएबलचा वापर करू शकतो आणि आपल्याला वेळेत आणखी मागे पाहण्याची आवश्यकता नाही.

लक्षात घ्या की हा अल्गोरिदम केवळ वापरकर्ता इंटरफेस आणि बाह्य सर्व्हरसाठी कार्य करतो. ब्लॉकचेनवर चालणारा कोड मागील घटना वाचू शकत नाही.

# @dev मालकाच्या पत्त्यावरून ऑपरेटर पत्त्यांच्या मॅपिंगवर मॅपिंग.
ownerToOperators: HashMap[address, HashMap[address, bool]]

एका खात्यामध्ये एकापेक्षा जास्त ऑपरेटर असू शकतात. त्यांचा मागोवा ठेवण्यासाठी एक साधे HashMap अपुरे आहे, कारण प्रत्येक की एकाच मूल्याकडे नेतो. त्याऐवजी, तुम्ही मूल्य म्हणून HashMap[address, bool] वापरू शकता. डीफॉल्टनुसार प्रत्येक पत्त्याचे मूल्य False असते, ज्याचा अर्थ तो ऑपरेटर नाही. तुम्ही आवश्यकतेनुसार मूल्ये True वर सेट करू शकता.

# @dev मिंटरचा पत्ता, जो टोकन मिंट करू शकतो
minter: address

नवीन टोकन कसेतरी तयार करावे लागतात. या कॉन्ट्रॅक्टमध्ये असे करण्याची परवानगी असलेली एकच संस्था आहे, minter. उदाहरणार्थ, गेमसाठी हे पुरेसे असण्याची शक्यता आहे. इतर उद्देशांसाठी, अधिक गुंतागुंतीचे व्यवसाय लॉजिक तयार करणे आवश्यक असू शकते.

# @dev इंटरफेस आयडीचे ते समर्थित आहे की नाही याबद्दल बूल (bool) वर मॅपिंग
supportedInterfaces: HashMap[bytes32, bool]

# @dev ERC165 चा ERC165 इंटरफेस आयडी
ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7

# @dev ERC721 चा ERC165 इंटरफेस आयडी
ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd

ERC-165 (opens in a new tab) कॉन्ट्रॅक्टसाठी ॲप्लिकेशन्स त्याच्याशी कसा संवाद साधू शकतात, ते कोणत्या ERC चे पालन करते हे उघड करण्यासाठी एक यंत्रणा निर्दिष्ट करते. या प्रकरणात, कॉन्ट्रॅक्ट ERC-165 आणि ERC-721 चे पालन करते.

फंक्शन्स

ही ती फंक्शन्स आहेत जी प्रत्यक्षात ERC-721 ची अंमलबजावणी करतात.

कन्स्ट्रक्टर

@external
def __init__():

Vyper मध्ये, Python प्रमाणेच, कन्स्ट्रक्टर फंक्शनला __init__ म्हटले जाते.

    """
    @dev कॉन्ट्रॅक्ट कन्स्ट्रक्टर.
    """

Python मध्ये आणि Vyper मध्ये, तुम्ही मल्टी-लाइन स्ट्रिंग (जी """ ने सुरू होते आणि संपते) निर्दिष्ट करून आणि तिचा कोणत्याही प्रकारे वापर न करता टिप्पणी देखील तयार करू शकता. या टिप्पण्यांमध्ये NatSpec (opens in a new tab) देखील समाविष्ट असू शकते.

    self.supportedInterfaces[ERC165_INTERFACE_ID] = True
    self.supportedInterfaces[ERC721_INTERFACE_ID] = True
    self.minter = msg.sender

स्थिती व्हेरिएबल्स ॲक्सेस करण्यासाठी तुम्ही self.<variable name> वापरता (पुन्हा, Python प्रमाणेच).

व्ह्यू फंक्शन्स

ही अशी फंक्शन्स आहेत जी ब्लॉकचेनची स्थिती बदलत नाहीत आणि म्हणून जर त्यांना बाह्यरित्या कॉल केले तर ती विनामूल्य कार्यान्वित केली जाऊ शकतात. जर व्ह्यू फंक्शन्सना कॉन्ट्रॅक्टद्वारे कॉल केले गेले तर त्यांना अद्याप प्रत्येक नोडवर कार्यान्वित करावे लागते आणि त्यामुळे गॅस खर्च होतो.

@view
@external

फंक्शन व्याख्येच्या आधीचे हे कीवर्ड जे ॲट चिन्हाने (@) सुरू होतात त्यांना डेकोरेशन्स म्हणतात. ते अशा परिस्थिती निर्दिष्ट करतात ज्यामध्ये फंक्शनला कॉल केले जाऊ शकते.

  • @view निर्दिष्ट करते की हे फंक्शन एक व्ह्यू आहे.
  • @external निर्दिष्ट करते की या विशिष्ट फंक्शनला व्यवहारांद्वारे आणि इतर कॉन्ट्रॅक्ट्सद्वारे कॉल केले जाऊ शकते.
def supportsInterface(_interfaceID: bytes32) -> bool:

Python च्या विपरीत, Vyper ही एक स्टॅटिक टाइप केलेली भाषा (opens in a new tab) आहे. तुम्ही डेटा प्रकार (opens in a new tab) ओळखल्याशिवाय व्हेरिएबल किंवा फंक्शन पॅरामीटर घोषित करू शकत नाही. या प्रकरणात इनपुट पॅरामीटर bytes32 आहे, जे 256-बिट मूल्य आहे (256 बिट्स हा इथेरियम व्हर्च्युअल मशीनचा मूळ शब्द आकार आहे). आउटपुट एक बुलियन मूल्य आहे. प्रथेनुसार, फंक्शन पॅरामीटर्सची नावे अंडरस्कोर (_) ने सुरू होतात.

    """
    @dev इंटरफेस ओळख ERC-165 मध्ये निर्दिष्ट केली आहे.
    @param _interfaceID इंटरफेसचा आयडी
    """
    return self.supportedInterfaces[_interfaceID]

self.supportedInterfaces HashMap मधून मूल्य परत करा, जे कन्स्ट्रक्टर (__init__) मध्ये सेट केले आहे.

### व्ह्यू फंक्शन्स ###

ही व्ह्यू फंक्शन्स आहेत जी वापरकर्त्यांना आणि इतर कॉन्ट्रॅक्ट्सना टोकन्सबद्दल माहिती उपलब्ध करून देतात.

ही ओळ असेर्ट करते (opens in a new tab) की _owner शून्य नाही. जर ते असेल, तर त्रुटी येते आणि ऑपरेशन पूर्ववत केले जाते.

इथेरियम व्हर्च्युअल मशीन (EVM) मध्ये ज्या स्टोरेजमध्ये कोणतेही मूल्य साठवलेले नसते ते शून्य असते. जर _tokenId वर कोणतेही टोकन नसेल तर self.idToOwner[_tokenId] चे मूल्य शून्य असते. अशा परिस्थितीत फंक्शन पूर्ववत होते.

लक्षात घ्या की getApproved शून्य परत करू शकते. जर टोकन वैध असेल तर ते self.idToApprovals[_tokenId] परत करते. जर कोणताही मंजूरकर्ता नसेल तर ते मूल्य शून्य असते.

हे फंक्शन तपासते की _operator ला या कॉन्ट्रॅक्टमधील _owner चे सर्व टोकन व्यवस्थापित करण्याची परवानगी आहे का. कारण एकाधिक ऑपरेटर असू शकतात, हे दोन स्तरांचे HashMap आहे.

हस्तांतरण मदतनीस फंक्शन्स

ही फंक्शन्स ऑपरेशन्सची अंमलबजावणी करतात जी टोकन्स हस्तांतरित करण्याचा किंवा व्यवस्थापित करण्याचा भाग आहेत.


### हस्तांतरण फंक्शन हेल्पर्स ###

@view
@internal

या डेकोरेशनचा, @internal, अर्थ असा आहे की फंक्शन केवळ त्याच कॉन्ट्रॅक्टमधील इतर फंक्शन्समधून ॲक्सेस करण्यायोग्य आहे. प्रथेनुसार, या फंक्शनची नावे देखील अंडरस्कोर (_) ने सुरू होतात.

एखाद्या पत्त्याला टोकन हस्तांतरित करण्याची परवानगी देण्याचे तीन मार्ग आहेत:

  1. पत्ता टोकनचा मालक आहे
  2. पत्त्याला ते टोकन खर्च करण्यास मंजुरी आहे
  3. पत्ता टोकनच्या मालकासाठी ऑपरेटर आहे

वरील फंक्शन एक व्ह्यू असू शकते कारण ते स्थिती बदलत नाही. ऑपरेटिंग खर्च कमी करण्यासाठी, कोणतेही फंक्शन जे व्ह्यू असू शकते ते व्ह्यू असायला हवे.

जेव्हा हस्तांतरणामध्ये समस्या असते तेव्हा आपण कॉल पूर्ववत करतो.

आवश्यक असल्यासच मूल्य बदला. स्थिती व्हेरिएबल्स स्टोरेजमध्ये राहतात. स्टोरेजमध्ये लिहिणे हे EVM (इथेरियम व्हर्च्युअल मशीन) करत असलेल्या सर्वात महागड्या ऑपरेशन्सपैकी एक आहे (गॅसच्या बाबतीत). म्हणून, ते कमी करणे ही एक चांगली कल्पना आहे, विद्यमान मूल्य लिहिण्यासाठी देखील जास्त खर्च येतो.

आपल्याकडे हे अंतर्गत फंक्शन आहे कारण टोकन हस्तांतरित करण्याचे दोन मार्ग आहेत (नियमित आणि सुरक्षित), परंतु ऑडिटिंग सोपे करण्यासाठी आपल्याला कोडमध्ये फक्त एकच ठिकाण हवे आहे जिथे आपण ते करतो.

Vyper मध्ये घटना उत्सर्जित करण्यासाठी तुम्ही log स्टेटमेंट वापरता (अधिक तपशीलांसाठी येथे पहा (opens in a new tab)).

हस्तांतरण फंक्शन्स

हे फंक्शन तुम्हाला अनियंत्रित पत्त्यावर हस्तांतरित करू देते. जोपर्यंत पत्ता वापरकर्ता नाही, किंवा टोकन कसे हस्तांतरित करायचे हे माहित असलेले कॉन्ट्रॅक्ट नाही, तोपर्यंत तुम्ही हस्तांतरित केलेले कोणतेही टोकन त्या पत्त्यावर अडकेल आणि निरुपयोगी होईल.

प्रथम हस्तांतरण करणे ठीक आहे कारण जर काही समस्या असेल तर आपण तरीही पूर्ववत करणार आहोत, त्यामुळे कॉलमध्ये केलेले सर्व काही रद्द केले जाईल.

    if _to.is_contract: # `_to` हा कॉन्ट्रॅक्ट पत्ता आहे की नाही ते तपासा

प्रथम पत्ता कॉन्ट्रॅक्ट आहे की नाही हे तपासा (जर त्यात कोड असेल). नसल्यास, तो वापरकर्ता पत्ता आहे असे गृहीत धरा आणि वापरकर्ता टोकन वापरण्यास किंवा हस्तांतरित करण्यास सक्षम असेल. परंतु यामुळे तुम्हाला सुरक्षिततेची खोटी जाणीव होऊ देऊ नका. जर तुम्ही टोकन्स अशा पत्त्यावर हस्तांतरित केले ज्याची खाजगी की कोणालाही माहित नाही, तर तुम्ही safeTransferFrom सह देखील टोकन्स गमावू शकता.

        returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data)

लक्ष्य कॉन्ट्रॅक्टला कॉल करून ते ERC-721 टोकन प्राप्त करू शकते की नाही ते पहा.

        # जर हस्तांतरण गंतव्यस्थान असे कॉन्ट्रॅक्ट असेल जे 'onERC721Received' ची अंमलबजावणी करत नसेल तर थ्रो (Throws) करते
        assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32)

जर गंतव्यस्थान कॉन्ट्रॅक्ट असेल, परंतु जे ERC-721 टोकन स्वीकारत नाही (किंवा ज्याने हे विशिष्ट हस्तांतरण न स्वीकारण्याचे ठरवले आहे), तर पूर्ववत करा.

प्रथेनुसार जर तुम्हाला मंजूरकर्ता नको असेल तर तुम्ही स्वतःला नाही, तर शून्य पत्ता नियुक्त करता.

    # आवश्यकता तपासा
    senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender
    senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender]
    assert (senderIsOwner or senderIsApprovedForAll)

मंजुरी सेट करण्यासाठी तुम्ही एकतर मालक असू शकता, किंवा मालकाद्वारे अधिकृत ऑपरेटर असू शकता.

नवीन टोकन्स मिंट करा आणि विद्यमान नष्ट करा

ज्या खात्याने कॉन्ट्रॅक्ट तयार केले आहे ते minter आहे, सुपर युजर ज्याला नवीन NFTs मिंट करण्यासाठी अधिकृत केले आहे. तथापि, त्यालाही विद्यमान टोकन्स जाळण्याची परवानगी नाही. केवळ मालक, किंवा मालकाद्वारे अधिकृत संस्थाच ते करू शकते.

### मिंट आणि जाळणे फंक्शन्स ###

@external
def mint(_to: address, _tokenId: uint256) -> bool:

हे फंक्शन नेहमी True परत करते, कारण जर ऑपरेशन अयशस्वी झाले तर ते पूर्ववत केले जाते.

केवळ मिंटर (ज्या खात्याने ERC-721 कॉन्ट्रॅक्ट तयार केले आहे) नवीन टोकन्स मिंट करू शकतो. भविष्यात जर आपल्याला मिंटरची ओळख बदलायची असेल तर ही समस्या असू शकते. प्रोडक्शन कॉन्ट्रॅक्टमध्ये तुम्हाला कदाचित असे फंक्शन हवे असेल जे मिंटरला मिंटरचे विशेषाधिकार दुसऱ्या कोणालातरी हस्तांतरित करण्याची परवानगी देते.

    # जर `_to` शून्य पत्ता असेल तर थ्रो (Throws) करते
    assert _to != ZERO_ADDRESS
    # NFT जोडा. जर `_tokenId` कोणाच्या तरी मालकीचा असेल तर थ्रो (Throws) करते
    self._addTokenTo(_to, _tokenId)
    log Transfer(ZERO_ADDRESS, _to, _tokenId)
    return True

प्रथेनुसार, नवीन टोकन्सचे मिंटिंग शून्य पत्त्यावरून हस्तांतरण म्हणून मोजले जाते.

ज्या कोणाला टोकन हस्तांतरित करण्याची परवानगी आहे त्याला ते जाळण्याची परवानगी आहे. जरी जाळणे हे शून्य पत्त्यावर हस्तांतरित करण्यासारखे वाटत असले तरी, शून्य पत्त्याला प्रत्यक्षात टोकन प्राप्त होत नाही. हे आपल्याला टोकनसाठी वापरलेले सर्व स्टोरेज मोकळे करण्यास अनुमती देते, ज्यामुळे व्यवहाराचा गॅस खर्च कमी होऊ शकतो.

हे कॉन्ट्रॅक्ट वापरणे

Solidity च्या विपरीत, Vyper मध्ये इनहेरिटन्स नाही. कोड अधिक स्पष्ट करण्यासाठी आणि त्यामुळे सुरक्षित करणे सोपे करण्यासाठी ही एक जाणीवपूर्वक केलेली डिझाइन निवड आहे. त्यामुळे तुमचे स्वतःचे Vyper ERC-721 कॉन्ट्रॅक्ट तयार करण्यासाठी तुम्ही हे कॉन्ट्रॅक्ट (opens in a new tab) घ्या आणि तुम्हाला हवे असलेले व्यवसाय लॉजिक लागू करण्यासाठी त्यात बदल करा.

निष्कर्ष

पुनरावलोकनासाठी, या कॉन्ट्रॅक्टमधील काही सर्वात महत्त्वाच्या कल्पना येथे आहेत:

  • सुरक्षित हस्तांतरणासह ERC-721 टोकन प्राप्त करण्यासाठी, कॉन्ट्रॅक्ट्सना ERC721Receiver इंटरफेसची अंमलबजावणी करावी लागते.
  • जरी तुम्ही सुरक्षित हस्तांतरण वापरत असलात तरी, जर तुम्ही टोकन्स अशा पत्त्यावर पाठवले ज्याची खाजगी की अज्ञात आहे, तर ते अद्याप अडकू शकतात.
  • जेव्हा एखाद्या ऑपरेशनमध्ये समस्या असते तेव्हा केवळ अपयश मूल्य परत करण्याऐवजी कॉल revert करणे ही एक चांगली कल्पना आहे.
  • ERC-721 टोकन तेव्हा अस्तित्वात असतात जेव्हा त्यांचा मालक असतो.
  • NFT हस्तांतरित करण्यासाठी अधिकृत होण्याचे तीन मार्ग आहेत. तुम्ही मालक असू शकता, विशिष्ट टोकनसाठी मंजूर असू शकता, किंवा मालकाच्या सर्व टोकन्ससाठी ऑपरेटर असू शकता.
  • मागील घटना केवळ ब्लॉकचेनच्या बाहेर दृश्यमान असतात. ब्लॉकचेनच्या आत चालणारा कोड त्या पाहू शकत नाही.

आता जा आणि सुरक्षित Vyper कॉन्ट्रॅक्ट्सची अंमलबजावणी करा.

माझ्या अधिक कामासाठी येथे पहा (opens in a new tab).