Salt la conținutul principal
Change page

Standardul multi-tokenuri ERC-1155

Ultima modificare: @nicklcanada(opens in a new tab), 15 august 2023

Introducere

O interfață standard pentru contractele care gestionează mai multe tipuri de tokenuri. Un singur contract implementat poate include orice combinație de tokenuri fungibile, tokenuri nefungibile sau cu alte configurații (de exemplu, tokenuri semi-fungibile).

Ce se înțelege prin „Standard multi-token”?

Ideea este simplă și urmărește să creeze o interfață cu contractul inteligent care poate reprezenta și controla oricâte tipuri de tokenuri fungibile și nefungibile. Astfel, tokenul ERC-1155 poate îndeplini funcții identice cu un token ERC-20 și ERC-721, chiar cu ambele simultan. Dar mai presus de toate, îmbunătățește funcționalitatea ambelor standarde, făcându-le mai eficiente și corectând erorile evidente de implementare ale standardelor ERC-20 și ERC-721.

Tokenul ERC-1155 este descris complet în EIP-1155(opens in a new tab).

Condiții prealabile

Pentru o mai bună înțelegere a acestei pagini, vă recomandăm să citiți mai întâi despre standardele de tokenuri, ERC-20 și ERC-721.

Funcțiile și funcţionalităţile ERC-1155:

  • Transfer în loturi: Transferați mai multe active într-un singur apel.
  • Sold în loturi: Obțineți soldurile mai multor active într-un singur apel.
  • Aprobare în loturi: Aprobați toate tokenurile de la o adresă.
  • Hook-uri: Primiți hook-ul tokenurilor.
  • Acceptarea NFT-urilor: Dacă este disponibil numai 1, tratați-l ca pe un NFT.
  • Reguli de transfer securizat: Are o serie de reguli pentru securizarea transferului.

Transferuri în loturi

Transferul în loturi funcționează foarte asemănător cu transferurile ERC-20 obișnuite. Să aruncăm o privire asupra funcției ERC-20 obișnuite „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;
Afișează tot
Copiați

Singura diferență în cazul ERC-1155 este că transmitem atât valorile, cât și id-urile sub formă de matrice. De exemplu, fie ids=[3, 6,13] și values=[100,200,5], atunci transferurile rezultate vor fi

  1. Transferul a 100 de tokenuri cu id 3 de la _from la _to.
  2. Transferul a 200 de tokenuri cu id 6 de la _from la _to.
  3. Transferul a 5 token-uri cu id 13 de la _from la _to.

În ERC-1155 avem doar transferFrom, nu avem transfer. Pentru utilizarea acestuia ca transfer obișnuit, trebuie doar să setați adresa „from” la adresa care apelează funcția.

Soldul în loturi

Apelul ERC-20 balanceOf respectiv are de asemenea funcția sa pereche cu acceptarea loturilor. Vă reamintim că aceasta este versiunea 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);
Copiați

Şi mai simplu, la apelul soldului putem extrage solduri multiple într-un singur apel. Vom trece matricea de proprietari, urmată de matricea de id-uri ale tokenurilor.

De exemplu, fie _ids=[3, 6, 13] şi _owners=[0xbeef..., 0x1337..., 0x1111...], atunci valoarea de răspuns va fi

1[
2 balanceOf(0xbeef...),
3 balanceOf(0x1337...),
4 balanceOf(0x1111...)
5]
Copiați

Aprobarea în loturi

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);
Afișează tot
Copiați

Aprobările sunt puțin diferite față de ERC-20. În loc să aprobați sume specifice, setați un operator care să aprobe sau să dezaprobe prin setApprovalForAII.

Citirea stării curente se poate face prin isApprovedForAII. După cum puteți vedea, este totul sau nimic. Nu puteți defini câte tokenuri să aprobați, nici chiar ce clasă de tokenuri.

A fost conceput intenționat în acest mod, pentru simplitate. Puteți doar să le aprobaţi pe toate, de la o singură adresă.

Hook-uri de primire

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) external returns(bytes4);
Copiați

Având în vedere acceptarea EIP-165(opens in a new tab), ERC-1155 acceptă hook-uri de primire numai pentru contractele inteligente. Funcția de hook trebuie să răspundă printr-o valoare magică predefinită „bytes4”, care este exprimată astfel:

1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Copiați

Atunci când contractul destinatar răspunde prin această valoare, se presupune că acesta acceptă transferul și în același timp știe cum să gestioneze tokenurile ERC-1155. Excelent, gata cu tokenurile blocate într-un contract!

Acceptarea NFT-urilor

Atunci când este disponibil numai unul, tokenul este în esență un token nefungibil (NFT). Și conform standardului pentru ERC-721, puteți defini un URL pentru metadate. URL-ul poate fi citit și modificat de clienți, după cum puteţi vedea aici(opens in a new tab).

Reguli pentru transferul securizat

Am abordat deja câteva reguli pentru transferul securizat în explicațiile anterioare. Dar să aruncăm o privire asupra celor mai importante reguli:

  1. Apelantul trebuie să fie autorizat să cheltuiască tokenurile pentru adresa _from sau trebuie să fie egal cu _from.
  2. Apelul de transfer trebuie returnat dacă
    1. adresa _to este 0.
    2. lungimea ids nu este aceeași cu lungimea _values.
    3. oricare sold(uri) de token(uri) al titularului (titularilor) din _ids are (au) o valoare mai mică decât suma respectivă din _value trimisă destinatarului.
    4. intervine orice altă eroare.

Observaţie: Toate funcțiile în loturi, inclusiv hook-ul, există şi în versiune individuală, fără loturi. Am făcut aceasta pentru eficiența gazului, având în vedere că transferul unui singur activ va fi probabil tot metoda cea mai utilizată. Le-am omis pentru simplitatea explicațiilor, inclusiv regulile pentru transferul securizat. Au nume identice, doar eliminați cuvântul „loturi (batch)”.

Referințe suplimentare

A fost util acest articol?