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

Standard wielu tokenów ERC-1155

Wprowadzenie

Standardowy interfejs dla kontraktów zarządzających wieloma typami 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 wielu tokenów?

Idea jest prosta i ma na celu stworzenie interfejsu inteligentnego kontraktu, który może reprezentować i kontrolować dowolną liczbę typów tokenów zamiennych i niezamiennych. W ten sposób token ERC-1155 może pełnić te same funkcje co token ERC-20 i ERC-721, a nawet oba jednocześnie. Poprawia to funkcjonalność standardów ERC-20 i ERC-721, czyniąc je bardziej wydajnymi i korygując oczywiste błędy implementacyjne.

Token ERC-1155 jest w pełni opisany w EIP-1155 (opens 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 cechy ERC-1155:

Transfery wsadowe

Transfer wsadowy działa bardzo podobnie do zwykłych transferów ERC-20. Spójrzmy na zwykłą funkcję transferFrom w ERC-20:

Jedyną różnicą w ERC-1155 jest to, że przekazujemy wartości jako tablicę, a także przekazujemy tablicę identyfikatorów (id). 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 (from) na adres wywołujący funkcję.

Saldo wsadowe

Odpowiednie wywołanie balanceOf z ERC-20 również ma swoją funkcję partnerską z obsługą wsadową. Dla przypomnienia, oto wersja ERC-20:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);

Jeszcze prościej jest w przypadku wywołania salda, gdzie możemy pobrać wiele sald w jednym wywołaniu. Przekazujemy 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:

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

Zatwierdzenie wsadowe

Zatwierdzenia różnią się nieco od tych w ERC-20. Zamiast zatwierdzać określone kwoty, ustawiasz operatora jako zatwierdzonego lub niezatwierdzonego za pomocą setApprovalForAll.

Odczytanie obecnego statusu można wykonać za pomocą isApprovedForAll. Jak widać, jest to operacja typu „wszystko albo nic”. Nie można zdefiniować, ile tokenów zatwierdzić, ani nawet jakiej klasy tokenów to dotyczy.

Zostało to celowo zaprojektowane z myślą o prostocie. Możesz tylko zatwierdzić wszystko dla jednego adresu.

Hook odbioru

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

Biorąc pod uwagę obsługę EIP-165 (opens in a new tab), ERC-1155 obsługuje hooki odbioru tylko dla inteligentnych kontraktów. Funkcja hooka musi zwrócić magiczną, predefiniowaną wartość bytes4, która jest podana jako:

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

Gdy kontrakt odbierający zwraca tę wartość, zakłada się, że kontrakt akceptuje transfer i wie, jak obsługiwać tokeny ERC-1155. Świetnie, koniec z zablokowanymi tokenami w kontrakcie!

Obsługa NFT

Gdy podaż wynosi tylko jeden, token jest w zasadzie tokenem niezamiennym (NFT). I jak to jest w standardzie ERC-721, można zdefiniować adres URL dla metadanych. Adres URL może być odczytywany i modyfikowany przez klientów, zobacz tutaj (opens in a new tab).

Zasady bezpiecznego transferu

W poprzednich wyjaśnieniach poruszyliśmy już kilka zasad bezpiecznego transferu. Spójrzmy jednak na najważniejsze z nich:

  1. Wywołujący musi być zatwierdzony do wydawania tokenów dla adresu _from lub wywołujący musi być równy _from.
  2. Wywołanie transferu musi zostać wycofane, jeśli:
    1. Adres _to to 0.
    2. Długość _ids nie jest taka sama jak długość _values.
    3. Którekolwiek z sald posiadaczy dla tokenów w _ids jest niższe niż odpowiednie kwoty w _values wysyłane do odbiorcy.
    4. Wystąpi jakikolwiek inny błąd.

Uwaga: Wszystkie funkcje wsadowe, w tym hook, istnieją również w wersjach bez przetwarzania wsadowego. Zrobiono to ze względu na oszczędność gazu, biorąc pod uwagę, że transfer tylko jednego aktywa prawdopodobnie nadal będzie najczęściej używanym sposobem. Pominęliśmy je dla uproszczenia w wyjaśnieniach, w tym w zasadach bezpiecznego transferu. Nazwy są identyczne, wystarczy usunąć słowo „Batch”.

Dalsza lektura