Zum Hauptinhalt springen
Change page

ERC-1155 Multi-Token-Standard

Einführung

Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination aus fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. semi-fungiblen Token) enthalten.

Was ist mit Multi-Token-Standard gemeint?

Die Idee ist einfach und zielt darauf ab, eine Smart-Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und steuern kann. Auf diese Weise kann der ERC-1155-Token dieselben Funktionen wie ein ERC-20- und ein ERC-721-Token ausführen, und sogar beides gleichzeitig. Er verbessert die Funktionalität sowohl des ERC-20- als auch des ERC-721-Standards, macht sie effizienter und korrigiert offensichtliche Implementierungsfehler.

Der ERC-1155-Token wird vollständig in EIP-1155 (opens in a new tab) beschrieben.

Voraussetzungen

Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst über Token-Standards, ERC-20 und ERC-721 zu lesen.

ERC-1155 Funktionen und Merkmale:

Batch-Transfers

Der Batch-Transfer funktioniert sehr ähnlich wie reguläre ERC-20-Transfers. Schauen wir uns die reguläre ERC-20-Funktion transferFrom an:

Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und zusätzlich ein Array von IDs übergeben. Wenn beispielsweise ids=[3, 6, 13] und values=[100, 200, 5] gegeben sind, sehen die resultierenden Transfers wie folgt aus:

  1. Transfer von 100 Token mit der ID 3 von _from an _to.
  2. Transfer von 200 Token mit der ID 6 von _from an _to.
  3. Transfer von 5 Token mit der ID 13 von _from an _to.

In ERC-1155 haben wir nur transferFrom, kein transfer. Um es wie ein reguläres transfer zu verwenden, setze einfach die Absenderadresse (from) auf die Adresse, die die Funktion aufruft.

Batch-Kontostand

Der entsprechende ERC-20-Aufruf balanceOf hat ebenfalls seine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung, dies ist die ERC-20-Version:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);

Noch einfacher ist es beim Kontostandsaufruf: Wir können mehrere Kontostände in einem einzigen Aufruf abrufen. Wir übergeben das Array der Eigentümer, gefolgt vom Array der Token-IDs.

Wenn beispielsweise _ids=[3, 6, 13] und _owners=[0xbeef..., 0x1337..., 0x1111...] gegeben sind, lautet der Rückgabewert:

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

Batch-Genehmigung

Die Genehmigungen unterscheiden sich geringfügig von ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzt man einen Operator über setApprovalForAll auf genehmigt oder nicht genehmigt.

Das Auslesen des aktuellen Status kann über isApprovedForAll erfolgen. Wie du sehen kannst, handelt es sich um eine Alles-oder-Nichts-Operation. Du kannst nicht festlegen, wie viele Token oder gar welche Token-Klasse genehmigt werden sollen.

Dies ist absichtlich im Hinblick auf Einfachheit so konzipiert. Du kannst nur alles für eine Adresse genehmigen.

Empfangs-Hook

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

Aufgrund der Unterstützung von EIP-165 (opens in a new tab) unterstützt ERC-1155 Empfangs-Hooks nur für Smart Contracts. Die Hook-Funktion muss einen magischen, vordefinierten bytes4-Wert zurückgeben, der wie folgt lautet:

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

Wenn der empfangende Vertrag diesen Wert zurückgibt, wird davon ausgegangen, dass der Vertrag den Transfer akzeptiert und weiß, wie er mit den ERC-1155-Token umgehen muss. Großartig, keine in einem Vertrag feststeckenden Token mehr!

NFT-Unterstützung

Wenn das Angebot nur eins beträgt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, kannst du eine Metadaten-URL definieren. Die URL kann von Clients gelesen und geändert werden, siehe hier (opens in a new tab).

Sichere Transferregel

Wir haben in den vorherigen Erklärungen bereits einige sichere Transferregeln angesprochen. Aber schauen wir uns die wichtigsten dieser Regeln an:

  1. Der Aufrufer muss genehmigt sein, die Token für die Adresse _from auszugeben, oder der Aufrufer muss gleich _from sein.
  2. Der Transfer-Aufruf muss rückgängig gemacht werden, wenn
    1. die Adresse _to 0 ist.
    2. die Länge von _ids nicht mit der Länge von _values übereinstimmt.
    3. einer der Kontostände der Inhaber für Token in _ids niedriger ist als die entsprechenden Beträge in _values, die an den Empfänger gesendet werden.
    4. ein anderer Fehler auftritt.

Hinweis: Alle Batch-Funktionen einschließlich des Hooks existieren auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gas-Effizienz, da der Transfer von nur einem Vermögenswert wahrscheinlich immer noch die am häufigsten verwendete Methode sein wird. Wir haben sie der Einfachheit halber in den Erklärungen weggelassen, einschließlich der sicheren Transferregeln. Die Namen sind identisch, entferne einfach das „Batch“.

Weiterführende Literatur