Standard multi-tokenów ERC-1155
Strona ostatnio zaktualizowana: 22 października 2025
Wprowadzenie
Standardowy interfejs dla kontraktów, które zarządzają kilkoma rodzajami tokenów. Pojedynczy wdrożony kontrakt może zawierać dowolną kombinację tokenów zamiennych, tokenów niezamiennych lub innych konfiguracji (np. tokenów półzamiennych).
Co oznacza standard multi-tokenów?
Zamysł jest prosty i ma na celu stworzenie interfejsu inteligentnego kontraktu, który może reprezentować i kontrolować dowolną liczbę wymienialnych i niewymienialnych rodzajów tokenów. W ten sposób token ERC-1155 może wykonywać te same funkcje co tokeny ERC-20 i ERC-721, a nawet oba jednocześnie. Poprawia on funkcjonalność obu standardów, zarówno ERC-20, jak i ERC-721, czyniąc go bardziej wydajnym i poprawiając oczywiste błędy w implementacji.
Token ERC-1155 jest w pełni opisany w EIP-1155opens in a new tab.
Wymagania wstępne
Aby lepiej zrozumieć tę stronę, zalecamy najpierw przeczytać o standardach tokenów, ERC-20 i ERC-721.
Funkcje i możliwości ERC-1155:
- Transfer zbiorczy: transferuj wiele aktywów w jednym wywołaniu.
- Saldo zbiorcze: pobieraj salda wielu aktywów w jednym wywołaniu.
- Zatwierdzenie zbiorcze: zatwierdzaj wszystkie tokeny dla adresu.
- Hooki: hook do odbierania tokenów.
- Obsługa NFT: jeśli podaż wynosi tylko 1, traktuj go jako NFT.
- Zasady bezpiecznego transferu: zestaw zasad bezpiecznego transferu.
Transfery zbiorcze
Zbiorczy transfer działa bardzo podobnie do zwykłych transferów ERC-20. Przyjrzyjmy się zwykłej funkcji ERC-20 transferFrom:
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;Pokaż wszystkoJedyną różnicą w ERC-1155 jest to, że podajemy wartości jako tablicę, a także podajemy tablicę identyfikatorów. Na przykład, dla ids=[3, 6, 13] i values=[100, 200, 5] wynikowe transfery będą następujące:
- Transfer 100 tokenów o id 3 z
_fromdo_to. - Transfer 200 tokenów o id 6 z
_fromdo_to. - Transfer 5 tokenów o id 13 z
_fromdo_to.
W ERC-1155 mamy tylko transferFrom, nie ma transfer. Aby użyć jej jak zwykłego transfer, wystarczy ustawić adres nadawcy na adres wywołujący funkcję.
Saldo zbiorcze
Odpowiednie wywołanie ERC-20 balanceOf ma również swój odpowiednik z obsługą trybu zbiorczego. Dla przypomnienia tak wygląda wersja 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);W jeszcze prostszy sposób możemy uzyskać wiele sald za pomocą jednego wywołania. Podajemy po prostu tablicę właścicieli, a następnie tablicę identyfikatorów tokenów.
Na przykład dla _ids=[3, 6, 13] i _owners=[0xbeef..., 0x1337..., 0x1111...] zwracana wartość będzie następująca:
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Zatwierdzenie zbiorcze
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Pokaż wszystkoZatwierdzenia różnią się trochę od tych z ERC-20. Zamiast zatwierdzać określone kwoty, ustawiasz operatora jako zatwierdzonego lub niezatwierdzonego za pomocą setApprovalForAll.
Bieżący status można odczytać za pomocą funkcji isApprovedForAll. Jak widzisz, jest to operacja wszystko albo nic. Nie można zdefiniować, ile tokenów zatwierdzić, ani nawet klasy tokena.
Zostało to tak celowo zaprojektowane z myślą o prostocie. Możesz zatwierdzać wszystko tylko dla jednego adresu.
Hook odbioru
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Biorąc pod uwagę wsparcie dla EIP-165opens in a new tab, ERC-1155 obsługuje hooki odbioru tylko dla inteligentnych kontraktów. Funkcja hooka musi zwracać magiczną predefiniowaną wartość bytes4, która jest podana jako:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Kiedy kontrakt odbierający zwraca tę wartość, zakłada się, że kontrakt akceptuje transfer i wie jak obsługiwać tokeny ERC-1155. Świetnie, koniec z tokenami zablokowanymi w kontrakcie!
Obsługa NFT
Gdy podaż wynosi tylko 1, to token jest tak naprawdę tokenem niewymienialnym (NFT). I jak to w standardzie ERC-7219, możesz określić URL metadanych. Adres URL może być odczytywany i modyfikowany przez klientów, zobacz tutajopens in a new tab.
Zasada bezpiecznego transferu
W poprzednich wyjaśnieniach poruszyliśmy już kilka zasad bezpiecznego transferu. Przyjrzyjmy się jednak jednej z najważniejszych zasad:
- Wywołujący musi być zatwierdzony do wydania tokenów dla adresu
_fromlub musi być równy_from. - Wywołanie transferu musi zostać cofnięte, jeśli:
- adres
_toma wartość 0. - długość
_idsnie jest taka sama jak długość_values. - którekolwiek z sald posiadacza dla tokenów w
_idsjest niższe niż odpowiednia kwota w_valueswysłana do odbiorcy. - wystąpi jakikolwiek inny błąd.
- adres
Uwaga: wszystkie funkcje zbiorcze, w tym hooki, mają także swoje wersje niezbiorcze. Zostało to zrobione z myślą o wydajności gazowej, biorąc pod uwagę, że przesyłanie tylko jednego aktywa nadal będzie najprawdopodobniej najczęściej używanym sposobem. Pominęliśmy je dla uproszczenia wyjaśnień, w tym zasady bezpiecznego transferu. Nazwy są identyczne, wystarczy usunąć słowo „Batch”.