ERC-1155 Πρότυπο Πολλαπλών Ψηφιακών Στοιχείων
Εισαγωγή
Μια τυπική διεπαφή για συμβόλαια που διαχειρίζονται πολλούς τύπους κρυπτονομισμάτων. Ένα απλό συμβόλαιο που έχει αναπτυχθεί μπορεί να περιλαμβάνει κάθε συνδυασμό εναλλάξιμων κρυπτοπαραστατικών, μη εναλλάξιμων κρυπτοπαραστατικών ή άλλων παραμέτρων (π.χ. ημι-εναλλάξιμα κρυπτοπαραστατικά).
Τι εννοούμε με το πρότυπο πολλαπλών στοιχείων;
Η ιδέα είναι απλή και επιδιώκει να δημιουργήσει μια διεπαφή έξυπνου συμβολαίου που μπορεί να αντιπροσωπεύει και να ελέγχει οποιοδήποτε αριθμό τύπων εναλλάξιμων και μη εναλλάξιμων ψηφιακών στοιχείων. Με αυτόν τον τρόπο, ένα ψηφιακό στοιχείο ERC-1155 μπορεί να έχει τις ίδιες λειτουργίες με ένα ψηφιακό στοιχείο ERC-20 και ERC-721 ή ακόμη και τα δύο ταυτόχρονα. Βελτιώνει τη λειτουργικότητα τόσο του προτύπου ERC-20 όσο και του ERC-721, καθιστώντας το πιο αποτελεσματικό και διορθώνοντας προφανή σφάλματα υλοποίησης.
Το ψηφιακό στοιχείο ERC-1155 περιγράφεται πλήρως στο EIP-1155.
Προαπαιτούμενα
Για να κατανοήσετε καλύτερα αυτή τη σελίδα, σας συνιστούμε να διαβάσετε πρώτα για τα πρότυπα ψηφιακών στοιχείων ERC-20 και ERC-721.
Λειτουργίες και Χαρακτηριστικά ERC-1155:
- Μεταφορά παρτίδας: Μεταφορά πολλών περιουσιακών στοιχείων με μία μόνο κλήση.
- Υπόλοιπο παρτίδας: Λήψη των υπολοίπων πολλών περιουσιακών στοιχείων με μία μόνο κλήση.
- Έγκριση παρτίδας: Έγκριση όλων των ψηφιακών στοιχείων σε μια διεύθυνση.
- Hooks: Λήψη token hook.
- Υποστήριξη NFT: Εάν η προσφορά είναι μόνο 1, αντιμετωπίστε την ως NFT.
- Κανόνες ασφαλούς μεταφοράς: Σύνολο κανόνων για ασφαλή μεταφορά.
Μεταφορές παρτίδας
Η μεταφορά παρτίδας λειτουργεί πολύ παρόμοια με τις κανονικές μεταφορές ERC-20. Ας δούμε τη συνάρτηση transferFrom
ERC-20:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Εμφάνιση όλων
Η μόνη διαφορά στο ERC-1155 είναι ότι περνάμε τις τιμές ως μια σειρά και περνάμε επίσης μια σειρά από αναγνωριστικά. Για παράδειγμα, ids= [3, 6, 13]
και των values= [100, 200, 5]
, οι προκύπτουσες μεταφορές θα είναι
- Μεταφορά 100 ψηφιακών στοιχείων με id 3 από
_from
σε_to
. - Μεταφορά 200 ψηφιακών στοιχείων με id 6 από
_from
σε_to
. - Μεταφορά 5 ψηφιακών στοιχείων με id 13 από
_from
σε_to
.
Στο ERC-1155 υπάρχει μόνο transferFrom
, και όχι transfer
. Για να το χρησιμοποιήσετε σαν ένα κανονικό transfer
, απλά ορίστε το στη διεύθυνση "από" στη διεύθυνση που ζητά τη συνάρτηση.
Υπόλοιπο παρτίδας
Η αντίστοιχη κλήση balanceOf
του ERC-20 έχει επίσης τη συνάρτηση συνεργάτη της με υποστήριξη παρτίδας. Ως υπενθύμιση, αυτή είναι η έκδοση ERC-20:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);
Ακόμη απλούστερη για την κλήση ισοζυγίου, μπορούμε να ανακτήσουμε πολλαπλά ισοζύγια σε μια ενιαία κλήση. Περνάμε τη σειρά των κατόχων, ακολουθούμενη από τη σειρά των αναγνωριστικών token.
Για παράδειγμα, το _ids=[3, 6, 13]
και _owners=[0xbeef..., 0x1337..., 0x1111...]
, η τιμή του αποτελέσματος θα είναι
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]
Έγκριση παρτίδας
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Εμφάνιση όλων
Οι εγκρίσεις είναι ελαφρώς διαφορετικές από το ERC-20. Αντί να εγκρίνετε συγκεκριμένα ποσά, ορίζετε έναν χειριστή ως εγκεκριμένο ή μη εγκεκριμένο μέσω του setApprovalForAll
.
Η ανάγνωση της τρέχουσας κατάστασης μπορεί να γίνει μέσω του isApprovedForAll
. Όπως μπορείτε να δείτε, είναι μια λειτουργία όλα ή τίποτα. Δεν μπορείτε να ορίσετε πόσα ψηφιακά στοιχεία θα εγκρίνετε ή καν ποια κατηγορία ψηφιακού στοιχείου αφορά.
Αυτό έχει σχεδιαστεί σκόπιμα με γνώμονα την απλότητα. Μπορείτε να τα εγκρίνετε όλα για μία διεύθυνση.
Receive Hook
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);
Δεδομένης της υποστήριξης EIP-165, το ERC-1155 υποστηρίζει τα hooks λήψης μόνο για έξυπνα συμβόλαια. Η συνάρτηση hook πρέπει να επιστρέφει μια μαγική προκαθορισμένη τιμή bytes4 που δίνεται ως:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Όταν το συμβαλλόμενο μέρος που λαμβάνει επιστρέφει αυτήν την τιμή, υποτίθεται ότι το συμβαλλόμενο μέρος αποδέχεται τη μεταφορά και γνωρίζει πώς να χειρίζεται τα token ERC-1155. Ωραία, τέλος τα κολλημένα token σε ένα συμβόλαιο!
Υποστήριξη NFT
Όταν η προσφορά είναι μόνο μία, το token είναι ουσιαστικά ένα μη εναλλάξιμο token (NFT). Και όπως είναι τυπικό για το ERC-721, μπορείτε να ορίσετε μια διεύθυνση URL μεταδεδομένων. Η διεύθυνση URL μπορεί να διαβαστεί και να τροποποιηθεί από τους πελάτες, δείτε εδώ.
Κανόνας Ασφαλούς Μεταφοράς
Έχουμε ήδη αναφερθεί σε μερικούς κανόνες ασφαλούς μεταφοράς στις προηγούμενες εξηγήσεις. Αλλά ας δούμε τους πιο σημαντικούς από τους κανόνες:
- Ο αποστολέας πρέπει να έχει εγκριθεί για να ξοδέψει τα ψηφιακά στοιχεία για τη διεύθυνση
_from
ή ο αποστολέας πρέπει να ισούται με_from
. - Η κλήση μεταφοράς πρέπει να αναστρέφεται εάν
_to
η διεύθυνση είναι 0.- Το μήκος του
_ids
δεν είναι ίδιο με το μήκος του_values
. - Οποιοδήποτε από τα υπόλοιπα του κατόχου ή των κατόχων για το ή τα token στο
_ids
είναι χαμηλότερο από τα αντίστοιχα ποσά στο_values
που αποστέλλονται στον παραλήπτη. - Προκύπτει οποιοδήποτε άλλο σφάλμα.
Σημείωση: Όλες οι συναρτήσεις παρτίδας συμπεριλαμβανομένης του hook υπάρχουν επίσης ως εκδόσεις χωρίς παρτίδα. Αυτό γίνεται για απόδοση gas, λαμβάνοντας υπόψη ότι η μεταφορά μόνο ενός περιουσιακού στοιχείου θα είναι πιθανώς ο πιο συχνά χρησιμοποιούμενος τρόπος. Τα παραλείψαμε για απλότητα στις εξηγήσεις, συμπεριλαμβανομένων των κανόνων ασφαλούς μεταφοράς. Τα ονόματα είναι ίδια, απλώς αφαιρέστε το 'Batch'.