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:
- Transfer wsadowy: Transfer wielu aktywów w jednym wywołaniu.
- Saldo wsadowe: Pobieranie sald wielu aktywów w jednym wywołaniu.
- Zatwierdzenie wsadowe: Zatwierdzenie wszystkich tokenów dla danego adresu.
- Hooki: Hook odbioru tokenów.
- Obsługa NFT: Jeśli podaż wynosi tylko 1, traktuj jako NFT.
- Zasady bezpiecznego transferu: Zestaw reguł dla bezpiecznego transferu.
Transfery wsadowe
Transfer wsadowy działa bardzo podobnie do zwykłych transferów ERC-20. Spójrzmy na zwykłą funkcję transferFrom w ERC-20:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
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:
- 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 (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
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
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:
- Wywołujący musi być zatwierdzony do wydawania tokenów dla adresu
_fromlub wywołujący musi być równy_from. - Wywołanie transferu musi zostać wycofane, jeśli:
- Adres
_toto 0. - Długość
_idsnie jest taka sama jak długość_values. - Którekolwiek z sald posiadaczy dla tokenów w
_idsjest niższe niż odpowiednie kwoty w_valueswysyłane do odbiorcy. - Wystąpi jakikolwiek inny błąd.
- Adres
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”.