Skip to main content
Change page

ERC-721 Πρότυπο Μη Εναλλάξιμων Κρυπτοπαραστατικών

Page last update: 19 Νοεμβρίου 2023

Εισαγωγή

Τι είναι το Μη Εναλλάξιμο Κρυπτοπαραστατικό;

Το Μη Εναλλάξιμο Κρυπτοπαραστατικό (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-721opens in a new tab:

Μέθοδοι

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.pyopens in a new tab:

1pip install web3
1from web3 import Web3
2from web3._utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction
10
11# 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': True
19 },
20 {
21 'inputs': [],
22 'name': 'name',
23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
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': True
31 },
32 {
33 'inputs': [],
34 'name': 'symbol',
35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': True
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'name': 'pregnantKitties',
50 'outputs': [{'name': '', 'type': 'uint256'}],
51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'name': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_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}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# 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}
80
81# We need the event's signature to filter the logs
82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
83
84logs = 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})
89
90# 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#events
94# Click to expand the event's logs and copy its "tokenId" argument
95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
96
97if recent_tx:
98 kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above
99 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 }]
24
25# We need the event's signature to filter the logs
26ck_event_signatures = [
27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# Here is a Pregnant Event:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_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})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# Here is a Birth Event:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_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})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
Εμφάνιση όλων
  • Το Etherscan NFT Trackeropens in a new tab αναφέρεται στο κορυφαίο NFT στο Ethereum ανά όγκο μεταφορών.
  • Το CryptoKittiesopens in a new tab είναι ένα παιχνίδι με επίκεντρο τα αναπαραγωγικά, συλλεκτικά και τόσο αξιολάτρευτα πλάσματα που ονομάζουμε CryptoKitties.
  • Το Sorareopens in a new tab είναι ένα παγκόσμιο παιχνίδι φαντασίας ποδοσφαίρου όπου μπορείτε να συλλέξετε περιορισμένες εκδόσεις συλλεκτικών, να διαχειριστείτε ομάδες και να διαγωνιστείτε για βραβεία.
  • Το The Ethereum Name Service (ENS)opens in a new tab προσφέρει ένα ασφαλές & αποκεντρωμένο τρόπο αντιμετώπισης πόρων και των δύο εντός και εκτός του blockchain χρησιμοποιώντας απλά, ευανάγνωστα από τον άνθρωπο ονόματα.
  • Το POAPopens in a new tab παρέχει δωρεάν NFT σε άτομα που παρακολουθούν εκδηλώσεις ή ολοκληρώνουν συγκεκριμένες ενέργειες. Τα POAP είναι δωρεάν για δημιουργία και διανομή.
  • Το Unstoppable Domainsopens in a new tab είναι μια εταιρεία με έδρα το Σαν Φρανσίσκο που χτίζει τομείς blockchains. Οι τομείς Blockchain αντικαθιστούν τις διευθύνσεις κρυπτονομισμάτων με ονόματα αναγνώσιμα από τον άνθρωπο και μπορούν να χρησιμοποιηθούν για την ενεργοποίηση ιστοσελίδων ανθεκτικών στη λογοκρισία.
  • Το Gods Unchained Cardsopens in a new tab είναι ένα TCG στο Ethereum blockchain που χρησιμοποιεί NFT για δημιουργία πραγματικής ιδιοκτησίας στα στοιχεία του παιχνιδιού.
  • Το Bored Ape Yacht Clubopens in a new tab είναι μια συλλογή από 10,000 μοναδικά NFT, τα οποία εκτός από το να είναι αποδεδειγμένα σπάνια έργα τέχνης, λειτουργούν ως σύμβολο συμμετοχής στο κλαμπ, παρέχοντας προνόμια και οφέλη μελών που αυξάνονται με την πάροδο του χρόνου ως αποτέλεσμα των προσπαθειών της κοινότητας.

Περισσότερες πληροφορίες

Ήταν χρήσιμο αυτό το άρθρο;