ప్రధాన కంటెంట్‌కు దాటవేయి

Vyper ERC-721 కాంట్రాక్ట్ వాక్‌త్రూ

Vyper
erc-721
Python
ప్రారంభ
Ori Pomerantz
1 ఏప్రిల్, 2021
16 నిమిషం పఠనం

పరిచయం

ERC-721 ప్రమాణం నాన్-ఫంగిబుల్ టోకెన్ల (NFT) యాజమాన్యాన్ని కలిగి ఉండటానికి ఉపయోగించబడుతుంది. ERC-20 టోకెన్లు ఒక వస్తువుగా ప్రవర్తిస్తాయి, ఎందుకంటే వ్యక్తిగత టోకెన్ల మధ్య తేడా ఉండదు. దీనికి విరుద్ధంగా, ERC-721 టోకెన్లు ఒకేలా ఉండే కానీ ఒకేలా లేని ఆస్తుల కోసం రూపొందించబడ్డాయి, ఉదాహరణకు విభిన్న పిల్లి కార్టూన్లు లేదా విభిన్న రియల్ ఎస్టేట్ ముక్కలకు చెందిన టైటిళ్లు.

ఈ ఆర్టికల్‌లో మేము ర్యూయా నకమురా వారి ERC-721 కాంట్రాక్ట్‌ను (opens in a new tab) విశ్లేషిస్తాము. ఈ కాంట్రాక్ట్ Vyper (opens in a new tab)లో వ్రాయబడింది, ఇది సోలిడిటీలో ఉన్నదానికంటే అసురక్షిత కోడ్‌ను వ్రాయడాన్ని కష్టతరం చేయడానికి రూపొందించిన పైథాన్ లాంటి కాంట్రాక్ట్ భాష.

కాంట్రాక్ట్

# @dev ERC-721 నాన్-ఫంగిబుల్ టోకెన్ ప్రమాణం యొక్క అమలు.
# @రచయిత ర్యూయా నకమురా (@nrryuya)
# దీని నుండి సవరించబడింది: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy

Vyperలో, పైథాన్‌లో వలె, వ్యాఖ్యలు హాష్ (#)తో ప్రారంభమై లైన్ చివరి వరకు కొనసాగుతాయి. @<keyword> ను కలిగి ఉన్న వ్యాఖ్యలు మానవ-చదవగలిగే డాక్యుమెంటేషన్‌ను రూపొందించడానికి NatSpec (opens in a new tab) ద్వారా ఉపయోగించబడతాయి.

from vyper.interfaces import ERC721

implements: ERC721

ERC-721 ఇంటర్‌ఫేస్ Vyper భాషలో నిర్మించబడింది. మీరు కోడ్ నిర్వచనాన్ని ఇక్కడ చూడవచ్చు (opens in a new tab). ఇంటర్‌ఫేస్ నిర్వచనం Vyperలో కాకుండా పైథాన్‌లో వ్రాయబడింది, ఎందుకంటే ఇంటర్‌ఫేసులు బ్లాక్ చైను లోపల మాత్రమే కాకుండా, పైథాన్‌లో వ్రాయబడిన బాహ్య క్లయింట్ నుండి బ్లాక్ చైనుకు లావాదేవీని పంపేటప్పుడు కూడా ఉపయోగించబడతాయి.

మొదటి లైన్ ఇంటర్‌ఫేస్‌ను దిగుమతి చేస్తుంది మరియు రెండవది మనం ఇక్కడ దాన్ని అమలు చేస్తున్నామని నిర్దేశిస్తుంది.

ERC721రిసీవర్ ఇంటర్‌ఫేస్

# 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 టోకెన్ IDలు 256 బిట్‌లు. సాధారణంగా అవి టోకెన్ దేనిని సూచిస్తుందో దాని వివరణను హాష్ చేయడం ద్వారా సృష్టించబడతాయి.

            _data: Bytes[1024]

అభ్యర్థనలో 1024 బైట్‌ల వరకు వినియోగదారు డేటా ఉండవచ్చు.

        ) -> bytes32: view

ఒక కాంట్రాక్ట్ అనుకోకుండా బదిలీని అంగీకరించే సందర్భాలను నివారించడానికి, తిరిగి వచ్చే విలువ బూలియన్ కాదు, కానీ ఒక నిర్దిష్ట విలువతో 256 బిట్‌లు.

ఈ ఫంక్షన్ ఒక view, అంటే ఇది బ్లాక్ చైను యొక్క స్టేట్‌ను చదవగలదు, కానీ దానిని సవరించలేదు.

ఈవెంట్‌లు

ఈవెంట్‌లు (opens in a new tab) బ్లాక్ చైను వెలుపల ఉన్న వినియోగదారులు మరియు సర్వర్‌లకు ఈవెంట్‌ల గురించి తెలియజేయడానికి విడుదల చేయబడతాయి. ఈవెంట్‌ల కంటెంట్ బ్లాక్ చైనులోని కాంట్రాక్ట్‌లకు అందుబాటులో లేదని గమనించండి.

ఇది ERC-20 బదిలీ ఈవెంట్‌ను పోలి ఉంటుంది, కానీ మేము మొత్తం బదులుగా 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]

Ethereumలో వినియోగదారు మరియు కాంట్రాక్ట్ గుర్తింపులు 160-బిట్ చిరునామాల ద్వారా సూచించబడతాయి. ఈ రెండు వేరియబుల్స్ టోకెన్ IDల నుండి వాటి యజమానులకు మరియు వాటిని బదిలీ చేయడానికి ఆమోదించబడిన వారికి మ్యాప్ చేస్తాయి (ప్రతిదానికి గరిష్టంగా ఒకటి). Ethereumలో, ప్రారంభించని డేటా ఎల్లప్పుడూ సున్నాగా ఉంటుంది, కాబట్టి యజమాని లేదా ఆమోదించబడిన బదిలీదారు లేకపోతే ఆ టోకెన్ విలువ సున్నాగా ఉంటుంది.

# @dev యజమాని చిరునామా నుండి అతని టోకెన్ల సంఖ్యకు మ్యాపింగ్.
ownerToNFTokenCount: HashMap[address, uint256]

ఈ వేరియబుల్ ప్రతి యజమానికి టోకెన్ల సంఖ్యను కలిగి ఉంటుంది. యజమానుల నుండి టోకెన్‌లకు మ్యాపింగ్ లేదు, కాబట్టి ఒక నిర్దిష్ట యజమాని కలిగి ఉన్న టోకెన్‌లను గుర్తించడానికి ఏకైక మార్గం బ్లాక్ చైను ఈవెంట్ చరిత్రలో వెనక్కి తిరిగి చూడటం మరియు తగిన Transfer ఈవెంట్‌లను చూడటం. మన వద్ద అన్ని NFTలు ఉన్నాయని మరియు సమయంలో మరింత వెనక్కి తిరిగి చూడాల్సిన అవసరం లేదని తెలుసుకోవడానికి మేము ఈ వేరియబుల్‌ను ఉపయోగించవచ్చు.

ఈ అల్గోరిథం వినియోగదారు ఇంటర్‌ఫేస్‌లు మరియు బాహ్య సర్వర్‌లకు మాత్రమే పనిచేస్తుందని గమనించండి. బ్లాక్ చైనుపై నడుస్తున్న కోడ్ గత ఈవెంట్‌లను చదవలేదు.

# @dev యజమాని చిరునామా నుండి ఆపరేటర్ చిరునామాల మ్యాపింగ్‌కు మ్యాపింగ్.
ownerToOperators: HashMap[address, HashMap[address, bool]]

ఒక ఖాతాకు ఒకటి కంటే ఎక్కువ ఆపరేటర్లు ఉండవచ్చు. ఒక సాధారణ HashMap వాటిని ట్రాక్ చేయడానికి సరిపోదు, ఎందుకంటే ప్రతి కీ ఒకే విలువకు దారితీస్తుంది. బదులుగా, మీరు విలువగా HashMap[address, bool] ను ఉపయోగించవచ్చు. డిఫాల్ట్‌గా ప్రతి చిరునామాకు విలువ Falseగా ఉంటుంది, అంటే అది ఆపరేటర్ కాదు. మీరు అవసరమైన విధంగా విలువలను Trueకి సెట్ చేయవచ్చు.

# @dev మింటర్ యొక్క చిరునామా, ఇతను ఒక టోకెన్‌ను మింట్ చేయగలడు
minter: address

కొత్త టోకెన్లను ఏదో ఒక విధంగా సృష్టించాలి. ఈ కాంట్రాక్ట్‌లో అలా చేయడానికి అనుమతించబడిన ఒకే ఒక్క సంస్థ ఉంది, అది మింటర్. ఉదాహరణకు, ఒక ఆటకు ఇది సరిపోతుంది. ఇతర ప్రయోజనాల కోసం, మరింత సంక్లిష్టమైన వ్యాపార తర్కాన్ని సృష్టించడం అవసరం కావచ్చు.

# @dev ఇంటర్‌ఫేస్ ఐడి నుండి అది మద్దతు ఇస్తుందా లేదా అనే దాని గురించి బూల్‌కి మ్యాపింగ్
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లో, పైథాన్‌లో వలె, కన్స్ట్రక్టర్ ఫంక్షన్‌ను __init__ అని పిలుస్తారు.

    """
    @dev కాంట్రాక్ట్ కన్స్ట్రక్టర్.
    """

పైథాన్‌లో, మరియు 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> ని ఉపయోగించి మీరు స్టేట్ వేరియబుల్స్‌ను యాక్సెస్ చేస్తారు (మళ్ళీ, పైథాన్‌లో వలె).

వ్యూ ఫంక్షన్లు

ఇవి బ్లాక్ చైను యొక్క స్టేట్‌ను సవరించని ఫంక్షన్‌లు, అందువల్ల వాటిని బాహ్యంగా పిలిచినట్లయితే ఉచితంగా అమలు చేయవచ్చు. వ్యూ ఫంక్షన్‌లను ఒక కాంట్రాక్ట్ పిలిచినట్లయితే, అవి ఇప్పటికీ ప్రతి నోడ్‌లో అమలు చేయబడాలి మరియు అందువల్ల గ్యాస్ ఖర్చు అవుతుంది.

@view
@external

ఒక ఫంక్షన్ నిర్వచనానికి ముందు ఉన్న ఈ కీవర్డ్‌లు, ఎట్ సైన్ (@)తో ప్రారంభమయ్యేవి, డెకరేషన్స్ అని పిలువబడతాయి. ఒక ఫంక్షన్‌ను ఏ పరిస్థితులలో పిలవవచ్చో అవి నిర్దేశిస్తాయి.

  • @view ఈ ఫంక్షన్ ఒక వ్యూ అని నిర్దేశిస్తుంది.
  • @external ఈ నిర్దిష్ట ఫంక్షన్‌ను లావాదేవీల ద్వారా మరియు ఇతర కాంట్రాక్ట్‌ల ద్వారా పిలవవచ్చని నిర్దేశిస్తుంది.
def supportsInterface(_interfaceID: bytes32) -> bool:

పైథాన్‌కు విరుద్ధంగా, Vyper ఒక స్టాటిక్ టైప్డ్ లాంగ్వేజ్ (opens in a new tab). డేటా రకాన్ని (opens in a new tab) గుర్తించకుండా మీరు ఒక వేరియబుల్‌ను లేదా ఫంక్షన్ పారామీటర్‌ను ప్రకటించలేరు. ఈ సందర్భంలో ఇన్‌పుట్ పారామీటర్ bytes32, ఇది 256-బిట్ విలువ (Ethereum వర్చువల్ మెషీన్ యొక్క స్థానిక వర్డ్ సైజ్ 256 బిట్‌లు). అవుట్‌పుట్ ఒక బూలియన్ విలువ. సంప్రదాయం ప్రకారం, ఫంక్షన్ పారామీటర్ల పేర్లు అండర్‌స్కోర్ (_)తో ప్రారంభమవుతాయి.

    """
    @dev ఇంటర్‌ఫేస్ గుర్తింపు ERC-165లో పేర్కొనబడింది.
    @param _interfaceID ఇంటర్‌ఫేస్ యొక్క ఐడి
    """
    return self.supportedInterfaces[_interfaceID]

కన్స్ట్రక్టర్ (__init__)లో సెట్ చేయబడిన self.supportedInterfaces HashMap నుండి విలువను తిరిగి ఇవ్వండి.

### వ్యూ ఫంక్షన్లు ###

ఇవి టోకెన్ల గురించిన సమాచారాన్ని వినియోగదారులకు మరియు ఇతర కాంట్రాక్ట్‌లకు అందుబాటులో ఉంచే వ్యూ ఫంక్షన్‌లు.

ఈ లైన్ _owner సున్నా కాదని నిర్ధారిస్తుంది (opens in a new tab). అది అయితే, ఒక లోపం ఉంది మరియు ఆపరేషన్ తిరిగి మార్చబడుతుంది.

Ethereum వర్చువల్ మెషీన్ (evm)లో విలువ నిల్వ చేయని ఏ నిల్వ అయినా సున్నాగా ఉంటుంది. _tokenId వద్ద టోకెన్ లేకపోతే, self.idToOwner[_tokenId] విలువ సున్నాగా ఉంటుంది. ఆ సందర్భంలో ఫంక్షన్ తిరిగి మార్చబడుతుంది.

getApproved సున్నాను తిరిగి ఇవ్వగలదని గమనించండి. టోకెన్ చెల్లుబాటు అయితే అది self.idToApprovals[_tokenId]ని తిరిగి ఇస్తుంది. ఆమోదించేవారు లేకపోతే ఆ విలువ సున్నా.

ఈ కాంట్రాక్ట్‌లో _owner యొక్క అన్ని టోకెన్‌లను నిర్వహించడానికి _operator అనుమతించబడిందా అని ఈ ఫంక్షన్ తనిఖీ చేస్తుంది. బహుళ ఆపరేటర్లు ఉండవచ్చు కాబట్టి, ఇది రెండు స్థాయిల HashMap.

బదిలీ సహాయక ఫంక్షన్‌లు

ఈ ఫంక్షన్‌లు టోకెన్‌లను బదిలీ చేయడం లేదా నిర్వహించడంలో భాగంగా ఉండే ఆపరేషన్‌లను అమలు చేస్తాయి.


### TRANSFER FUNCTION HELPERS ###

@view
@internal

ఈ డెకరేషన్, @internal, అంటే ఈ ఫంక్షన్ అదే కాంట్రాక్ట్‌లోని ఇతర ఫంక్షన్‌ల నుండి మాత్రమే అందుబాటులో ఉంటుంది. సంప్రదాయం ప్రకారం, ఈ ఫంక్షన్ పేర్లు కూడా అండర్‌స్కోర్ (_)తో ప్రారంభమవుతాయి.

ఒక చిరునామా ఒక టోకెన్‌ను బదిలీ చేయడానికి అనుమతించబడటానికి మూడు మార్గాలు ఉన్నాయి:

  1. చిరునామా టోకెన్ యజమాని
  2. ఆ టోకెన్‌ను ఖర్చు చేయడానికి చిరునామా ఆమోదించబడింది
  3. చిరునామా టోకెన్ యజమానికి ఆపరేటర్

పై ఫంక్షన్ ఒక వ్యూ కావచ్చు ఎందుకంటే ఇది స్టేట్‌ను మార్చదు. నిర్వహణ ఖర్చులను తగ్గించడానికి, ఏదైనా వ్యూ కాగల ఫంక్షన్ అవశ్యంగా వ్యూ అయి ఉండాలి.

బదిలీతో సమస్య ఉన్నప్పుడు మేము కాల్‌ను తిరిగి మార్చుతాము.

అవసరమైతే మాత్రమే విలువను మార్చండి. స్టేట్ వేరియబుల్స్ నిల్వలో ఉంటాయి. నిల్వకు వ్రాయడం అనేది EVM (Ethereum వర్చువల్ మెషీన్) చేసే అత్యంత ఖరీదైన ఆపరేషన్‌లలో ఒకటి (గ్యాస్ పరంగా). అందువల్ల, దానిని తగ్గించడం మంచిది, ఇప్పటికే ఉన్న విలువను వ్రాయడానికి కూడా అధిక ఖర్చు అవుతుంది.

టోకెన్‌లను బదిలీ చేయడానికి రెండు మార్గాలు (సాధారణ మరియు సురక్షిత) ఉన్నందున మాకు ఈ అంతర్గత ఫంక్షన్ ఉంది, కానీ ఆడిటింగ్ సులభతరం చేయడానికి మేము దానిని చేసే కోడ్‌లో ఒకే ఒక్క స్థానం కావాలి.

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'ను అమలు చేయని కాంట్రాక్ట్ అయితే త్రో చేస్తుంది
        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)

ఆమోదాన్ని సెట్ చేయడానికి మీరు యజమాని కావచ్చు, లేదా యజమానిచే అధీకృతం చేయబడిన ఆపరేటర్ కావచ్చు.

కొత్త టోకెన్‌లను మింట్ చేయండి మరియు ఉన్నవాటిని నాశనం చేయండి

కాంట్రాక్ట్‌ను సృష్టించిన ఖాతా మింటర్, ఇది కొత్త NFTలను మింట్ చేయడానికి అధీకృతం చేయబడిన సూపర్ వినియోగదారు. అయితే, ఉన్న టోకెన్‌లను బర్న్ చేయడానికి కూడా ఇది అనుమతించబడదు. యజమాని లేదా యజమానిచే అధీకృతం చేయబడిన సంస్థ మాత్రమే అలా చేయగలదు.

### MINT & BURN FUNCTIONS ###

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

ఈ ఫంక్షన్ ఎల్లప్పుడూ Trueని తిరిగి ఇస్తుంది, ఎందుకంటే ఆపరేషన్ విఫలమైతే అది తిరిగి మార్చబడుతుంది.

మింటర్ మాత్రమే (ERC-721 కాంట్రాక్ట్‌ను సృష్టించిన ఖాతా) కొత్త టోకెన్‌లను మింట్ చేయగలదు. భవిష్యత్తులో మనం మింటర్ గుర్తింపును మార్చాలనుకుంటే ఇది ఒక సమస్య కావచ్చు. ఒక ప్రొడక్షన్ కాంట్రాక్ట్‌లో మీరు బహుశా మింటర్ అధికారాలను వేరొకరికి బదిలీ చేయడానికి అనుమతించే ఫంక్షన్‌ను కోరుకుంటారు.

    # `_to` సున్నా చిరునామా అయితే త్రో చేస్తుంది
    assert _to != ZERO_ADDRESS
    # NFTని జోడించండి. `_tokenId` ఎవరికైనా స్వంతమైతే త్రో చేస్తుంది
    self._addTokenTo(_to, _tokenId)
    log Transfer(ZERO_ADDRESS, _to, _tokenId)
    return True

సంప్రదాయం ప్రకారం, కొత్త టోకెన్ల మింటింగ్ సున్నా చిరునామా నుండి బదిలీగా పరిగణించబడుతుంది.

ఒక టోకెన్‌ను బదిలీ చేయడానికి అనుమతించబడిన ఎవరైనా దానిని బర్న్ చేయడానికి అనుమతించబడతారు. బర్న్ సున్నా చిరునామాకు బదిలీకి సమానంగా కనిపించినప్పటికీ, సున్నా చిరునామా వాస్తవానికి టోకెన్‌ను స్వీకరించదు. ఇది టోకెన్ కోసం ఉపయోగించిన మొత్తం నిల్వను ఖాళీ చేయడానికి మాకు అనుమతిస్తుంది, ఇది లావాదేవీ యొక్క గ్యాస్ ఖర్చును తగ్గిస్తుంది.

ఈ కాంట్రాక్ట్‌ను ఉపయోగించడం

సోలిడిటీకి విరుద్ధంగా, Vyperకు ఇన్హెరిటెన్స్ లేదు. కోడ్‌ను స్పష్టంగా మరియు అందువల్ల సురక్షితం చేయడానికి ఇది ఉద్దేశపూర్వక డిజైన్ ఎంపిక. కాబట్టి మీ స్వంత Vyper ERC-721 కాంట్రాక్ట్‌ను సృష్టించడానికి మీరు ఈ కాంట్రాక్ట్‌ను తీసుకుని, మీకు కావలసిన వ్యాపార తర్కాన్ని అమలు చేయడానికి దాన్ని సవరించండి.

ముగింపు

సమీక్ష కోసం, ఈ కాంట్రాక్ట్‌లోని కొన్ని ముఖ్యమైన ఆలోచనలు ఇక్కడ ఉన్నాయి:

  • సురక్షిత బదిలీతో ERC-721 టోకెన్‌లను స్వీకరించడానికి, కాంట్రాక్ట్‌లు ERC721Receiver ఇంటర్‌ఫేస్‌ను అమలు చేయాలి.
  • మీరు సురక్షిత బదిలీని ఉపయోగించినప్పటికీ, ప్రైవేట్ కీ తెలియని చిరునామాకు పంపితే టోకెన్‌లు ఇప్పటికీ చిక్కుకుపోవచ్చు.
  • ఒక ఆపరేషన్‌తో సమస్య ఉన్నప్పుడు, కేవలం వైఫల్య విలువను తిరిగి ఇచ్చే బదులు, కాల్‌ను revert చేయడం మంచిది.
  • ERC-721 టోకెన్‌లు వాటికి యజమాని ఉన్నప్పుడు ఉంటాయి.
  • ఒక NFTని బదిలీ చేయడానికి అధీకృతం కావడానికి మూడు మార్గాలు ఉన్నాయి. మీరు యజమాని కావచ్చు, ఒక నిర్దిష్ట టోకెన్ కోసం ఆమోదించబడవచ్చు, లేదా యజమాని యొక్క అన్ని టోకెన్‌లకు ఆపరేటర్ కావచ్చు.
  • గత ఈవెంట్‌లు బ్లాక్ చైను వెలుపల మాత్రమే కనిపిస్తాయి. బ్లాక్ చైను లోపల నడుస్తున్న కోడ్ వాటిని చూడలేదు.

ఇప్పుడు వెళ్లి సురక్షితమైన Vyper కాంట్రాక్ట్‌లను అమలు చేయండి.

నా మరిన్ని పనుల కోసం ఇక్కడ చూడండి (opens in a new tab).

పేజీ చివరి నవీకరణ: 28 ఏప్రిల్, 2026

ఈ ట్యుటోరియల్ ఉపయోగకరంగా ఉందా?