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-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Afișează totCopiaț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
- Transferul a 100 de tokenuri cu id 3 de la
_from
la_to
. - Transferul a 200 de tokenuri cu id 6 de la
_from
la_to
. - 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-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) 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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Afișează totCopiaț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 _data7) 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:
- Apelantul trebuie să fie autorizat să cheltuiască tokenurile pentru adresa
_from
sau trebuie să fie egal cu_from
. - Apelul de transfer trebuie returnat dacă
- adresa
_to
este 0. - lungimea
ids
nu este aceeași cu lungimea_values
. - 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. - intervine orice altă eroare.
- adresa
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
- EIP-1155: Standard multi-token(opens in a new tab)
- ERC-1155: Documentație Openzeppelin(opens in a new tab)
- ERC-1155: GitHub Repo(opens in a new tab)
- Alchemy NFT API(opens in a new tab)