Zum Hauptinhalt springen
Change page

ERC-1155 Multi-Token-Standard

Letzte Aktualisierung der Seite: 22. Oktober 2025

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 die gleichen Funktionen wie ein ERC-20- und ERC-721-Token ausführen, und sogar beide 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 Ihnen, zuerst über Token-Standards, ERC-20 und ERC-721 zu lesen.

ERC-1155 Funktionen und Merkmale:

Stapelübertragungen (Batch Transfers)

Die Stapelübertragung funktioniert sehr ähnlich wie reguläre ERC-20-Übertragungen. Schauen wir uns die reguläre ERC-20-Funktion transferFrom an:

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;
Alle anzeigen

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 Übertragungen wie folgt aus:

  1. Übertrage 100 Token mit der ID 3 von _from nach _to.
  2. Übertrage 200 Token mit der ID 6 von _from nach _to.
  3. Übertrage 5 Token mit der ID 13 von _from nach _to.

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

Stapelsaldo (Batch Balance)

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

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);

Noch einfacher ist es beim Saldo-Aufruf, bei dem wir mehrere Salden in einem einzigen Aufruf abrufen können. 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:

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

Stapelgenehmigung (Batch Approval)

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);
Alle anzeigen

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

Das Lesen des aktuellen Status kann über isApprovedForAll erfolgen. Wie Sie sehen können, handelt es sich um eine Alles-oder-Nichts-Operation. Sie können nicht definieren, wie viele Token genehmigt werden sollen oder gar welche Token-Klasse.

Dies ist absichtlich im Hinblick auf Einfachheit konzipiert. Sie können nur alles für eine Adresse genehmigen.

Empfangs-Hook (Receive Hook)

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) 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 angegeben ist:

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

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

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, können Sie eine Metadaten-URL definieren. Die URL kann von Anwendungen gelesen und geändert werden, siehe hier (opens in a new tab).

Sichere Übertragungsregel (Safe Transfer Rule)

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

  1. Der Aufrufer muss berechtigt sein, die Token für die Adresse _from auszugeben, oder der Aufrufer muss gleich _from sein.
  2. Der Übertragungsaufruf muss rückgängig gemacht (revert) 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 Salden 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 Stapelfunktionen einschließlich des Hooks existieren auch als Versionen ohne Stapel (Batch). Dies geschieht aus Gründen der Gas-Effizienz, da die Übertragung 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 Übertragungsregeln. Die Namen sind identisch, entfernen Sie einfach das 'Batch'.

Weiterführende Literatur

War dieser Artikel hilfreich?