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-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;Prikaži vseKopiraj
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:
- Prenos 100 žetonov z id 3 s
_from
na_to
. - Prenos 200 žetonov z id 6 s
_from
na_to
. - 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-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);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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Prikaži vseKopiraj
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 _data7) 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:
- Klicatelj mora biti odobren za porabo žetonov z naslova
_from
ali pa mora biti klicatelj enak_from
. - Klic za prenos mora biti vrnjen v prejšnje stanje, če
- je naslov
_to
0; - dolžina
_ids
ni enaka dolžini_values
; - je katerokoli od stanj nosilca/-ev za žeton/-e v
_ids
nižje od ustrezne količine v_values
, ki je poslan prejemniku; - se pojavijo kakršnekoli druge napake.
- je naslov
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'.