Skip to main content
Change page

ERC-1155 Πρότυπο Πολλαπλών Ψηφιακών Στοιχείων

Page last update: 14 Απριλίου 2025

Εισαγωγή

Μια τυπική διεπαφή για συμβόλαια που διαχειρίζονται πολλούς τύπους κρυπτονομισμάτων. Ένα απλό συμβόλαιο που έχει αναπτυχθεί μπορεί να περιλαμβάνει κάθε συνδυασμό εναλλάξιμων κρυπτοπαραστατικών, μη εναλλάξιμων κρυπτοπαραστατικών ή άλλων παραμέτρων (π.χ. ημι-εναλλάξιμα κρυπτοπαραστατικά).

Τι εννοούμε με το πρότυπο πολλαπλών στοιχείων;

Η ιδέα είναι απλή και επιδιώκει να δημιουργήσει μια διεπαφή έξυπνου συμβολαίου που μπορεί να αντιπροσωπεύει και να ελέγχει οποιοδήποτε αριθμό τύπων εναλλάξιμων και μη εναλλάξιμων ψηφιακών στοιχείων. Με αυτόν τον τρόπο, ένα ψηφιακό στοιχείο ERC-1155 μπορεί να έχει τις ίδιες λειτουργίες με ένα ψηφιακό στοιχείο ERC-20 και ERC-721 ή ακόμη και τα δύο ταυτόχρονα. Βελτιώνει τη λειτουργικότητα τόσο του προτύπου ERC-20 όσο και του ERC-721, καθιστώντας το πιο αποτελεσματικό και διορθώνοντας προφανή σφάλματα υλοποίησης.

Το ψηφιακό στοιχείο ERC-1155 περιγράφεται πλήρως στο EIP-1155(opens in a new tab).

Προαπαιτούμενα

Για να κατανοήσετε καλύτερα αυτή τη σελίδα, σας συνιστούμε να διαβάσετε πρώτα για τα πρότυπα ψηφιακών στοιχείων ERC-20 και ERC-721.

Λειτουργίες και Χαρακτηριστικά ERC-1155:

Μεταφορές παρτίδας

Η μεταφορά παρτίδας λειτουργεί πολύ παρόμοια με τις κανονικές μεταφορές ERC-20. Ας δούμε τη συνάρτηση transferFrom ERC-20:

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
Εμφάνιση όλων

Η μόνη διαφορά στο ERC-1155 είναι ότι περνάμε τις τιμές ως μια σειρά και περνάμε επίσης μια σειρά από αναγνωριστικά. Για παράδειγμα, ids= [3, 6, 13] και των values= [100, 200, 5], οι προκύπτουσες μεταφορές θα είναι

  1. Μεταφορά 100 ψηφιακών στοιχείων με id 3 από _from σε _to.
  2. Μεταφορά 200 ψηφιακών στοιχείων με id 6 από _from σε _to.
  3. Μεταφορά 5 ψηφιακών στοιχείων με id 13 από _from σε _to.

Στο ERC-1155 υπάρχει μόνο transferFrom, και όχι transfer. Για να το χρησιμοποιήσετε σαν ένα κανονικό transfer, απλά ορίστε το στη διεύθυνση "από" στη διεύθυνση που ζητά τη συνάρτηση.

Υπόλοιπο παρτίδας

Η αντίστοιχη κλήση balanceOf του ERC-20 έχει επίσης τη συνάρτηση συνεργάτη της με υποστήριξη παρτίδας. Ως υπενθύμιση, αυτή είναι η έκδοση ERC-20:

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) 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-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) 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 _data
7) external returns(bytes4);

Δεδομένης της υποστήριξης EIP-165(opens in a new tab), το 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 μπορεί να διαβαστεί και να τροποποιηθεί από τους πελάτες, δείτε εδώ(opens in a new tab).

Κανόνας Ασφαλούς Μεταφοράς

Έχουμε ήδη αναφερθεί σε μερικούς κανόνες ασφαλούς μεταφοράς στις προηγούμενες εξηγήσεις. Αλλά ας δούμε τους πιο σημαντικούς από τους κανόνες:

  1. Ο αποστολέας πρέπει να έχει εγκριθεί για να ξοδέψει τα ψηφιακά στοιχεία για τη διεύθυνση _from ή ο αποστολέας πρέπει να ισούται με _from.
  2. Η κλήση μεταφοράς πρέπει να αναστρέφεται εάν
    1. _to η διεύθυνση είναι 0.
    2. Το μήκος του _ids δεν είναι ίδιο με το μήκος του _values.
    3. Οποιοδήποτε από τα υπόλοιπα του κατόχου ή των κατόχων για το ή τα token στο _ids είναι χαμηλότερο από τα αντίστοιχα ποσά στο _values που αποστέλλονται στον παραλήπτη.
    4. Προκύπτει οποιοδήποτε άλλο σφάλμα.

Σημείωση: Όλες οι συναρτήσεις παρτίδας συμπεριλαμβανομένης του hook υπάρχουν επίσης ως εκδόσεις χωρίς παρτίδα. Αυτό γίνεται για απόδοση gas, λαμβάνοντας υπόψη ότι η μεταφορά μόνο ενός περιουσιακού στοιχείου θα είναι πιθανώς ο πιο συχνά χρησιμοποιούμενος τρόπος. Τα παραλείψαμε για απλότητα στις εξηγήσεις, συμπεριλαμβανομένων των κανόνων ασφαλούς μεταφοράς. Τα ονόματα είναι ίδια, απλώς αφαιρέστε το 'Batch'.

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

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