Ugrás a fő tartalomra
Change page

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-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;
Összes megjelenítése
Má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:

  1. 100 darab 3-as azonosítójú token átvitele _from helyről _to helyre.
  2. 200 darab 6-os azonosítójú token átvitele _from helyről _to helyre.
  3. 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-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);
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-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);
Összes megjelenítése
Má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 _data
7) 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:

  1. 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.
  2. Az átutalási hívásnak vissza kell fordulnia, ha
    1. a _to címe 0.
    2. az _ids hossza nem azonos a _values hosszával.
    3. 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).
    4. bármilyen más hiba előfordul.

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.

További olvasnivaló

Hasznosnak találta a cikket?