ERC-721 Πρότυπο Μη Εναλλάξιμων Κρυπτοπαραστατικών
Εισαγωγή
Τι είναι το Μη Εναλλάξιμο Κρυπτοπαραστατικό;
Το Μη Εναλλάξιμο Κρυπτοπαραστατικό (NFT) χρησιμοποιείται για να προσδιορίσει κάτι ή κάποιον με έναν μοναδικό τρόπο. Αυτός ο τύπος Ψηφιακού Στοιχείου είναι τέλειος για να χρησιμοποιηθεί σε πλατφόρμες που προσφέρουν συλλεκτικά αντικείμενα, κλειδιά πρόσβασης, εισιτήρια λαχειοφόρων αγορών, αριθμημένες θέσεις για συναυλίες, αθλητικούς αγώνες, κλπ. Αυτός ο ειδικός τύπος Ψηφιακού Στοιχείου έχει καταπληκτικές δυνατότητες, οπότε του αξίζει ένα κατάλληλο Πρότυπο, το ERC-721 που ήρθε για να δώσει λύση σε αυτό!
Τι είναι το ERC-721;
Το ERC-721 εισάγει ένα πρότυπο για τα NFT. Αυτός ο τύπος ψηφιακών στοιχείων είναι μοναδικός και μπορεί να έχει διαφορετική αξία από κάποιο άλλο ψηφιακό στοιχείο που προέρχεται από το ίδιο Έξυπνο Συμβόλαιο, ίσως λόγω της ηλικίας του, της σπανιότητάς του ή ακόμα και κάποιου άλλου χαρακτηριστικού, όπως η εμφάνισή του. Περιμένετε, εικονικό;
Ναι! Όλα τα NFT έχουν μια μεταβλητή uint256
που ονομάζεται tokenId
, επομένως για οποιοδήποτε συμβόλαιο ERC-721, το ζεύγος contract address, uint256 tokenId
πρέπει να είναι καθολικά μοναδικό. Επομένως, μια dapp μπορεί να έχει έναν "μετατροπέα" που χρησιμοποιεί το tokenId
ως είσοδο και εξάγει μια εικόνα κάτι ωραίου, όπως ζόμπι, όπλα, δεξιότητες ή καταπληκτικά γατάκια!
Προαπαιτούμενα
Κορμός
Το ERC-721 (Ethereum Request for Comments 721), που προτάθηκε από τους William Entriken, Dieter Shirley, Jacob Evans, Nastassia Sachs τον Ιανουάριο του 2018, είναι ένα Πρότυπο Μη Εναλλάξιμων Κρυπτοπαραστατικών που υλοποιεί ένα API για ψηφιακά στοιχεία εντός των Έξυπνων Συμβολαίων.
Παρέχει λειτουργίες όπως η μεταφορά ψηφιακών στοιχείων από έναν λογαριασμό σε έναν άλλο, η λήψη του τρέχοντος υπολοίπου ενός λογαριασμού, η λήψη του κατόχου ενός συγκεκριμένου ψηφιακού στοιχείου και επίσης η συνολική προσφορά των διαθέσιμων ψηφιακών στοιχείων στο δίκτυο. Έχει επίσης κάποιες άλλες λειτουργίες, όπως η έγκριση ότι ένα ποσό ψηφιακών στοιχείων από έναν λογαριασμό μπορεί να μετακινηθεί από έναν λογαριασμό τρίτου μέρους.
Εάν ένα Έξυπνο Συμβόλαιο υλοποιεί τις ακόλουθες μεθόδους και συμβάντα, μπορεί να ονομαστεί Συμβόλαιο Μη Εναλλάξιμων Κρυπτοπαραστατικών ERC-721 και μόλις αναπτυχθεί θα είναι υπεύθυνο για την παρακολούθηση των στοιχείων που δημιουργήθηκαν στο Ethereum.
Από το EIP-721:
Μέθοδοι
1 function balanceOf(address _owner) external view returns (uint256);2 function ownerOf(uint256 _tokenId) external view returns (address);3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;6 function approve(address _approved, uint256 _tokenId) external payable;7 function setApprovalForAll(address _operator, bool _approved) external;8 function getApproved(uint256 _tokenId) external view returns (address);9 function isApprovedForAll(address _owner, address _operator) external view returns (bool)˙Εμφάνιση όλων
Συμβάντα
1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
Παραδείγματα
Ας δούμε πώς ένα πρότυπο είναι τόσο σημαντικό για να διευκολύνει να επιθεωρήσουμε οποιοδήποτε έξυπνο συμβόλαιο ψηφιακών στοιχείων ERC-721 στο Ethereum. Χρειαζόμαστε μόνο το Διασύνδεσμο Δυαδικού Κώδικα Εφαρμογής Συμβολαίου (ABI) για να δημιουργήσουμε μια διεπαφή σε οποιοδήποτε ψηφιακό στοιχείο ERC-721. Όπως μπορείτε να δείτε παρακάτω, θα χρησιμοποιήσουμε ένα απλοποιημένο ABI, για να το κάνουμε ένα παράδειγμα χαμηλής τριβής.
Παράδειγμα Web3.py
Αρχικά, βεβαιωθείτε ότι έχετε εγκαταστήσει τη βιβλιοθήκη Python Web3.py:
1pip install web3
1from web3 import Web32from web3._utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction1011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract.12# It will expose only the methods: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'name',23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],28 'name': 'ownerOf',29 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],30 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'symbol',35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 },38 {39 'inputs': [],40 'name': 'totalSupply',41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],42 'stateMutability': 'view', 'type': 'function', 'constant': True43 },44]4546ck_extra_abi = [47 {48 'inputs': [],49 'name': 'pregnantKitties',50 'outputs': [{'name': '', 'type': 'uint256'}],51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True52 },53 {54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],55 'name': 'isPregnant',56 'outputs': [{'name': '', 'type': 'bool'}],57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True58 }59]6061ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)62name = ck_contract.functions.name().call()63symbol = ck_contract.functions.symbol().call()64kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()65print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")6667pregnant_kitties = ck_contract.functions.pregnantKitties().call()68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")6970# Using the Transfer Event ABI to get info about transferred Kitties.71tx_event_abi = {72 'anonymous': False,73 'inputs': [74 {'indexed': False, 'name': 'from', 'type': 'address'},75 {'indexed': False, 'name': 'to', 'type': 'address'},76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],77 'name': 'Transfer',78 'type': 'event'79}8081# We need the event's signature to filter the logs82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()8384logs = w3.eth.get_logs({85 "fromBlock": w3.eth.block_number - 120,86 "address": w3.to_checksum_address(ck_token_addr),87 "topics": [event_signature]88})8990# Notes:91# - Increase the number of blocks up from 120 if no Transfer event is returned.92# - If you didn't find any Transfer event you can also try to get a tokenId at:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Click to expand the event's logs and copy its "tokenId" argument95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]9697if recent_tx:98 kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")Εμφάνιση όλων
Το συμβόλαιο CryptoKitties έχει κάποια ενδιαφέροντα Γεγονότα εκτός από τα Τυπικά.
Ας δούμε δύο από αυτά το Pregnant
και το Birth
.
1# Using the Pregnant and Birth Events ABI to get info about new Kitties.2ck_extra_events_abi = [3 {4 'anonymous': False,5 'inputs': [6 {'indexed': False, 'name': 'owner', 'type': 'address'},7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],10 'name': 'Pregnant',11 'type': 'event'12 },13 {14 'anonymous': False,15 'inputs': [16 {'indexed': False, 'name': 'owner', 'type': 'address'},17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],21 'name': 'Birth',22 'type': 'event'23 }]2425# We need the event's signature to filter the logs26ck_event_signatures = [27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),29]3031# Here is a Pregnant Event:32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog33pregnant_logs = w3.eth.get_logs({34 "fromBlock": w3.eth.block_number - 120,35 "address": w3.to_checksum_address(ck_token_addr),36 "topics": [ck_event_signatures[0]]37})3839recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Here is a Birth Event:42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a43birth_logs = w3.eth.get_logs({44 "fromBlock": w3.eth.block_number - 120,45 "address": w3.to_checksum_address(ck_token_addr),46 "topics": [ck_event_signatures[1]]47})4849recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]Εμφάνιση όλων
Δημοφιλή NFT
- Το Etherscan NFT Tracker αναφέρεται στο κορυφαίο NFT στο Ethereum ανά όγκο μεταφορών.
- Το CryptoKitties είναι ένα παιχνίδι με επίκεντρο τα αναπαραγωγικά, συλλεκτικά και τόσο αξιολάτρευτα πλάσματα που ονομάζουμε CryptoKitties.
- Το Sorare είναι ένα παγκόσμιο παιχνίδι φαντασίας ποδοσφαίρου όπου μπορείτε να συλλέξετε περιορισμένες εκδόσεις συλλεκτικών, να διαχειριστείτε ομάδες και να διαγωνιστείτε για βραβεία.
- Το The Ethereum Name Service (ENS) προσφέρει ένα ασφαλές & αποκεντρωμένο τρόπο αντιμετώπισης πόρων και των δύο εντός και εκτός του blockchain χρησιμοποιώντας απλά, ευανάγνωστα από τον άνθρωπο ονόματα.
- Το POAP παρέχει δωρεάν NFT σε άτομα που παρακολουθούν εκδηλώσεις ή ολοκληρώνουν συγκεκριμένες ενέργειες. Τα POAP είναι δωρεάν για δημιουργία και διανομή.
- Το Unstoppable Domains είναι μια εταιρεία με έδρα το Σαν Φρανσίσκο που χτίζει τομείς blockchains. Οι τομείς Blockchain αντικαθιστούν τις διευθύνσεις κρυπτονομισμάτων με ονόματα αναγνώσιμα από τον άνθρωπο και μπορούν να χρησιμοποιηθούν για την ενεργοποίηση ιστοσελίδων ανθεκτικών στη λογοκρισία.
- Το Gods Unchained Cards είναι ένα TCG στο Ethereum blockchain που χρησιμοποιεί NFT για δημιουργία πραγματικής ιδιοκτησίας στα στοιχεία του παιχνιδιού.
- Το Bored Ape Yacht Club είναι μια συλλογή από 10,000 μοναδικά NFT, τα οποία εκτός από το να είναι αποδεδειγμένα σπάνια έργα τέχνης, λειτουργούν ως σύμβολο συμμετοχής στο κλαμπ, παρέχοντας προνόμια και οφέλη μελών που αυξάνονται με την πάροδο του χρόνου ως αποτέλεσμα των προσπαθειών της κοινότητας.