Standard pro více tokenů ERC-1155
Úvod
Standardní rozhraní pro kontrakty, které spravují více typů tokenů. Jediný nasazený kontrakt může obsahovat libovolnou kombinaci zaměnitelných tokenů, nezaměnitelných tokenů nebo jiných konfigurací (např. částečně zaměnitelných tokenů).
Co se myslí standardem pro více tokenů?
Myšlenka je jednoduchá a snaží se vytvořit rozhraní chytrého kontraktu, které dokáže reprezentovat a ovládat libovolný počet typů zaměnitelných a nezaměnitelných tokenů. Tímto způsobem může token ERC-1155 plnit stejné funkce jako token ERC-20 a ERC-721, a dokonce i obojí současně. Zlepšuje funkčnost standardů ERC-20 i ERC-721, čímž je činí efektivnějšími a opravuje zjevné chyby v implementaci.
Token ERC-1155 je plně popsán v EIP-1155 (opens in a new tab).
Předpoklady
Pro lepší pochopení této stránky doporučujeme nejprve si přečíst o standardech tokenů, ERC-20 a ERC-721.
Funkce a vlastnosti ERC-1155:
- Dávkový převod: Převod více aktiv v jediném volání.
- Dávkový zůstatek: Získání zůstatků více aktiv v jediném volání.
- Dávkové schválení: Schválit všechny tokeny pro danou adresu.
- Hooky: Hook pro příjem tokenů.
- Podpora NFT: Pokud je nabídka pouze 1, zachází se s ním jako s NFT.
- Pravidla pro bezpečný převod: Soubor pravidel pro bezpečný převod.
Dávkové převody
Dávkový převod funguje velmi podobně jako běžné převody ERC-20. Podívejme se na běžnou funkci ERC-20 transferFrom:
// 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;
Jediný rozdíl u ERC-1155 je ten, že hodnoty předáváme jako pole a také předáváme pole ID. Například při zadání ids=[3, 6, 13] a values=[100, 200, 5] budou výsledné převody následující:
- Převod 100 tokenů s ID 3 z
_fromna_to. - Převod 200 tokenů s ID 6 z
_fromna_to. - Převod 5 tokenů s ID 13 z
_fromna_to.
V ERC-1155 máme pouze transferFrom, nikoli transfer. Chcete-li ji použít jako běžnou funkci transfer, stačí nastavit adresu odesílatele (from) na adresu, která funkci volá.
Dávkový zůstatek
Příslušné volání ERC-20 balanceOf má rovněž svou partnerskou funkci s podporou dávek. Pro připomenutí, toto je verze 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);
Ještě jednodušší je to u volání zůstatku, kde můžeme získat více zůstatků v jediném volání. Předáme pole vlastníků následované polem ID tokenů.
Například při zadání _ids=[3, 6, 13] a _owners=[0xbeef..., 0x1337..., 0x1111...] bude návratová hodnota
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
Dávkové schválení
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
Schválení se mírně liší od ERC-20. Místo schvalování konkrétních částek nastavíte operátora jako schváleného nebo neschváleného pomocí setApprovalForAll.
Čtení aktuálního stavu lze provést pomocí isApprovedForAll. Jak vidíte, jde o operaci typu všechno nebo nic. Nemůžete definovat, kolik tokenů schválit, ani o jakou třídu tokenů se jedná.
Toto je záměrně navrženo s ohledem na jednoduchost. Můžete schválit pouze vše pro jednu adresu.
Hook pro příjem
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
Vzhledem k podpoře EIP-165 (opens in a new tab) podporuje ERC-1155 hooky pro příjem pouze pro chytré kontrakty. Funkce hooku musí vrátit magickou předdefinovanou hodnotu bytes4, která je dána jako:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Když přijímající kontrakt vrátí tuto hodnotu, předpokládá se, že kontrakt přijímá převod a ví, jak s tokeny ERC-1155 zacházet. Skvělé, už žádné uvízlé tokeny v kontraktu!
Podpora NFT
Když je nabídka pouze jedna, token je v podstatě nezaměnitelný token (NFT). A jak je standardem pro ERC-721, můžete definovat URL pro metadata. URL mohou klienti číst a upravovat, viz zde (opens in a new tab).
Pravidlo pro bezpečný převod
Některých pravidel pro bezpečný převod jsme se dotkli již v předchozích vysvětleních. Podívejme se ale na ta nejdůležitější z nich:
- Volající musí být schválen k utrácení tokenů pro adresu
_fromnebo se volající musí rovnat_from. - Volání převodu se musí zvrátit, pokud
- adresa
_toje 0. - délka
_idsnení stejná jako délka_values. - jakýkoli ze zůstatků držitelů pro tokeny v
_idsje nižší než příslušné částky v_valuesodeslané příjemci. - dojde k jakékoli jiné chybě.
- adresa
Poznámka: Všechny dávkové funkce včetně hooku existují také ve verzích bez dávek. Děje se tak z důvodu úspory gasu, vzhledem k tomu, že převod pouze jednoho aktiva bude pravděpodobně stále nejčastěji používaným způsobem. Pro zjednodušení jsme je ve vysvětleních vynechali, včetně pravidel pro bezpečný převod. Názvy jsou totožné, stačí odstranit slovo 'Batch'.