ERC-1155 Multitoken szabvány
Utolsó módosítás: @Satglow(opens in a new tab), 2023. augusztus 15.
Bevezetés
Egy sztenderd interfész olyan szerződésekhez, amelyek többféle tokentípust kezelnek. Egy telepített szerződés tartalmazhatja helyettesíthető és nem helyettesíthető tokenek vagy más konfigurációk (például félig helyettesíthető tokenek) bármilyen kombinációját.
Mit jelent a multitoken szabvány?
Az ötlet egyszerű, és egy olyan okosszerződéses interfész létrehozására irányul, amely bármilyen számú helyettesíthető és nem helyettesíthető tokentípust képes reprezentálni és irányítani. Ily módon az ERC-1155 token ugyanazokat a funkciókat tudja ellátni, mint egy ERC-20 és ERC-721 token, sőt mindkettő egyszerre. Javítja az ERC-20 és ERC-721 szabványok működését, hatékonyabbá teszi és kijavítja a nyilvánvaló végrehajtási hibákat.
Az ERC-1155 token teljes körű leírását az EIP-1155(opens in a new tab) tartalmazza.
Előfeltételek
Az oldal jobb megértéséhez javasoljuk, hogy először olvassa el a tokenszabványok, ERC-20 és ERC-721 nevű dokumentumokat.
ERC-1155 funkciók és jellemzők:
- Csoportos transzfer: Több eszköz átvitele egyetlen hívással.
- Csoportos egyenleglehívás: Több eszköz egyenlegének lekérdezése egyetlen hívással.
- Csoportos jóváhagyás: Az összes token jóváhagyása egy címre.
- Hook-ok: Token-hook-ok fogadása.
- NFT támogatás: Ha a kínálat csak 1, kezelje NFT-ként.
- Biztonságos átviteli szabályok: Szabályok a biztonságos átvitelre.
Csoportos transzferek
A csoportos transzfer nagyon hasonlóan működik, mint a hagyományos ERC-20-transzfer. Nézzük meg a normál ERC-20 transferFrom
funkciót:
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;Összes megjelenítéseMásolás
Az egyetlen különbség az ERC-1155-ben az, hogy az értékeket tömbként adjuk át, és az azonosítók tömbjét is átadjuk. Például ids=[3, 6, 13]
és values=[100, 200, 5]
esetén a kapott átutalások a következők lesznek:
- 100 darab 3-as azonosítójú token átvitele
_from
helyről_to
helyre. - 200 darab 6-os azonosítójú token átvitele
_from
helyről_to
helyre. - 5 darab 13-as azonosítójú token átvitele
_from
helyről_to
helyre.
Az ERC-1155-ben csak transferFrom
van, transfer
nincs. Ha normál transfer
módjára akarja használni, csak állítsa be a „from” címet a függvényt hívó címre.
Csoportos egyenleglehívás
A megfelelő ERC-20 balanceOf
hívás szintén rendelkezik csoportos támogatású partnerfunkcióval. Emlékeztetőül, ez az ERC-20-as verzió:
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);Másolás
Még egyszerűbb az egyenleghívásnál, hogy egyetlen hívással több egyenleget is lekérdezhetünk. Átadjuk a tulajdonosok tömbjét, majd a tokenazonosítók tömbjét.
Ha például _ids=[3, 6, 13]
és _owners=[0xbeef..., 0x1337..., 0x1111...]
, a visszatérési érték a következő lesz:
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Másolás
Csoportos jóváhagyás
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Összes megjelenítéseMásolás
A jóváhagyások némileg eltérnek az ERC-20-tól. Konkrét összegek jóváhagyása helyett a setApprovalForAll
segítségével állíthat be egy jóváhagyási vagy nem jóváhagyási műveletet.
Az aktuális státusz leolvasása az isApprovedForAll
segítségével történhet. Amint látja, ez egy mindent vagy semmit művelet. Nem határozhatja meg, hogy hány tokent hagyjon jóvá, és azt sem, hogy melyik tokenosztályt hagyja jóvá.
Ezt szándékosan az egyszerűség jegyében tervezték. Egy címre vonatkozóan hagyhat jóvá mindent.
Hook fogadása
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Másolás
Tekintettel az EIP-165(opens in a new tab) támogatásra, az ERC-1155 csak az okosszerződésekre vonatkozó hook-okat fogadja. A hook-függvénynek egy mágikus, előre definiált bytes4-értéket kell visszaadnia, amely a következő formában van megadva:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Másolás
Ha a fogadó szerződés visszaküldi ezt az értéket, akkor feltételezzük, hogy a szerződés elfogadja az átutalást, és tudja, hogyan kell kezelni az ERC-1155 tokeneket. Remek, nincs többé szerződésbe ragadt token!
NFT-támogatás
Ha a kínálat csak egy darab, akkor a token lényegében egy nem helyettesíthető token (NFT). Az ERC-721 szabványának megfelelően meghatározhat egy metaadat URL-címet is. Az ügyfelek képesek az URL-t olvasni és módosítani, ennek módját itt(opens in a new tab) tekintheti meg.
Biztonságos átutalási szabály
Az előző magyarázatokban már érintettünk néhány biztonságos átutalási szabályt. De nézzük a szabályok közül a legfontosabbat:
- A hívónak engedélyeznie kell a
_from
címre vonatkozó tokenek elköltését, vagy a hívónak meg kell egyeznie a_from
címmel. - Az átutalási hívásnak vissza kell fordulnia, ha
- a
_to
címe 0. - az
_ids
hossza nem azonos a_values
hosszával. - az
_ids
paraméterben szereplő token(ek) birtokosának bármelyik egyenlege alacsonyabb, mint a_values
paraméterben szereplő, a címzettnek küldött megfelelő összeg(ek). - bármilyen más hiba előfordul.
- a
Megjegyzés: Minden csoportos funkció, beleértve a hook-ot is, egyéni változatban is létezik. Ez a gázhatékonyság érdekében történik, tekintve, hogy valószínűleg csak egy eszköz átadása lesz a leggyakrabban használt módszer. Ezeket az egyszerűség kedvéért kihagytuk a magyarázatokból, beleértve a biztonságos átutalási szabályokat is. A nevek megegyeznek, csak a „Batch” szót kell eltávolítani.