Přejít na hlavní obsah
Change page

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ř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:

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í:

  1. Převod 100 tokenů s ID 3 z _from na _to.
  2. Převod 200 tokenů s ID 6 z _from na _to.
  3. Převod 5 tokenů s ID 13 z _from na _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í

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:

  1. Volající musí být schválen k utrácení tokenů pro adresu _from nebo se volající musí rovnat _from.
  2. Volání převodu se musí zvrátit, pokud
    1. adresa _to je 0.
    2. délka _ids není stejná jako délka _values.
    3. jakýkoli ze zůstatků držitelů pro tokeny v _ids je nižší než příslušné částky v _values odeslané příjemci.
    4. dojde k jakékoli jiné chybě.

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

Další čtení