Przejdź do głównej zawartości
Change page

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:

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-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;
Pokaż wszystko

Jedyną 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:

  1. Transfer 100 tokenów o id 3 z _from do _to.
  2. Transfer 200 tokenów o id 6 z _from do _to.
  3. Transfer 5 tokenów o id 13 z _from do _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-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);

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-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);
Pokaż wszystko

Zatwierdzenia 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 _data
7) 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:

  1. Wywołujący musi być zatwierdzony do wydania tokenów dla adresu _from lub musi być równy _from.
  2. Wywołanie transferu musi zostać cofnięte, jeśli:
    1. adres _to ma wartość 0.
    2. długość _ids nie jest taka sama jak długość _values.
    3. którekolwiek z sald posiadacza dla tokenów w _ids jest niższe niż odpowiednia kwota w _values wysłana do odbiorcy.
    4. wystąpi jakikolwiek inny błąd.

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”.

Dalsza lektura

Czy ten artykuł był pomocny?