Preskoči na glavno vsebino
Change page

Standard za multižetone ERC-1155

Nazadnje urejeno: @PeterKecman(opens in a new tab), 15. avgust 2023

Uvod

Standardni vmesnik za pogodbe, ki upravljajo več tipov žetonov. Samostojna uveljavljena pogodba lahko vključuje katerokoli kombinacijo zamenljivih žetonov, nezamenljivih žetonov ali drugih konfiguracij (recimo delno zamenljivih žetonov).

Kaj je mišljeno s standardom za multižetone?

Ideja je preprosta in želi ustvariti vmesnik za pametne pogodbe, ki lahko predstavlja in upravlja katerokoli število zamenljivih in nezamenljivih tipov žetonov. Na ta način lahko žeton ERC-1155 izvaja enake funkcije kot žetona ERC-20 in ERC-721 ter celo funkcije obeh skupaj. Najboljše od vsega pa je izboljšana funkcionalnost obeh standardov, kar izboljša učinkovitost in popravlja očitne napake pri implementaciji standardov ERC-20 in ERC-721.

Žeton ERC-1155 je v celoti opisan v EIP-1155(opens in a new tab).

Predpogoji

Za boljše razumevanje vam priporočamo, da si najprej preberete o standardih za žetone, ERC-20 in ERC-721.

Funkcije in značilnosti ERC-1155:

  • Skupinski prenos: prenos več sredstev v enem klicu.
  • Skupinsko stanje: pridobite stanje več sredstev z enim klicem.
  • Skupinska odobritev: odobrite vse žetone na določenem naslovu.
  • Kavlji: prejmite kavelj žetonov.
  • Podpora NFT: če je ponudba le 1, to smatrajte kot NFT.
  • Pravila varnih prenosov: set pravil za varen prenos.

Skupinski prenosi

Skupinski prenos deluje zelo podobno kot običajni prenos ERC-20. Oglejmo si običajno funkcijo ERC-20 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;
Prikaži vse
Kopiraj

Edina razlika pri ERC-1155 je, da posredujemo vrednosti kot niz in prav tako posredujemo nize ID-jev. Na primer, pri danih ids=[3, 6, 13] in values=[100, 200, 5] bodo posledični prenosi:

  1. Prenos 100 žetonov z id 3 s _from na _to.
  2. Prenos 200 žetonov z id 6 s _from na _to.
  3. Prenos 5 žetonov z id 13 s _from na _to.

Pri ERC-1155 imamo le transferFrom in ne transfer. Da ga uporabite kot navaden transfer, le naslov od nastavite na naslov, ki kliče funkcijo.

Skupinsko stanje

Ustrezni klic ERC-20 balanceOf ima prav tako svojo partnersko funkcijo s paketno podporo. Za opomnik, to je različica 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);
Kopiraj

Še preprosteje lahko za klic stanja pridobimo večje število stanj z enim samim klicem. Podamo niz lastnikov, ki mu sledi niz z ID-ji žetonov.

Za konkreten primer _ids=[3, 6, 13] in _owners=[0xbeef..., 0x1337..., 0x1111...] bo vrnjena vrednost

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

Skupinska odobritev

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);
Prikaži vse
Kopiraj

Odobritve so malenkost drugačne kot pri ERC-20. Namesto odobritve specifičnih količin nastavite operaterja na odobreno ali neodobreno prek setApprovalForAll.

Branje trenutnega stanja se lahko izvede prek isApprovedForAll. Kot lahko vidite, gre za vse ali nič. Ni mogoče določiti, koliko žetonov boste odobrili, niti katere kategorije žetonov boste odobrili.

To je namenoma zasnovano zaradi enostavnosti. Odobrite lahko le vse za en naslov.

Prejem kavlja

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

Glede na podporo EIP-165(opens in a new tab) podpore ERC-1155 prejmejo kavlje le za pametne pogodbe. Funkcija kavlja mora vrniti magično prednastavljeno vrednost bytes4, ki je podana kot:

1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Kopiraj

Ko prejemna pogodba vrne to vrednost, se predpostavlja, da pogodba sprejema prenos in ve, kako ravnati z žetoni ERC-1155. Super, nič več obtičanih žetonov v pogodbi!

Podpora NFT

Ko je zaloga le 1, je žeton v bistvu nezamenljiv žeton (NFT). In kot je standardno za ERC-721, lahko določite URL metapodatkov. URL lahko preberejo in spremenijo stranke, več preberite tukaj(opens in a new tab).

Pravila za varen prenos

V prejšnjih razlagah smo se že dotaknili nekaterih pravil za varen prenos. Toda oglejmo si najpomembnejša pravila:

  1. Klicatelj mora biti odobren za porabo žetonov z naslova _from ali pa mora biti klicatelj enak _from.
  2. Klic za prenos mora biti vrnjen v prejšnje stanje, če
    1. je naslov _to 0;
    2. dolžina _ids ni enaka dolžini _values;
    3. je katerokoli od stanj nosilca/-ev za žeton/-e v _ids nižje od ustrezne količine v _values, ki je poslan prejemniku;
    4. se pojavijo kakršnekoli druge napake.

Opomba: Vse paketne funkcije vključno s kavlji prav tako obstajajo kot verzije brez paketov. To je narejeno za učinkovitost goriva, saj bo prenos enega sredstva še vedno po vsej verjetnosti najbolj pogosto uporabljen način. V razlagah smo jih izpustili zaradi preprostosti, vključno s pravili za varen prenos. Imena so identična, le odstranite 'paket'.

Nadaljnje branje

Je bil ta članek uporaben?