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übertragung (Batch Transfer): Übertragen Sie mehrere Vermögenswerte in einem einzigen Aufruf.
- Stapelsaldo (Batch Balance): Rufen Sie die Salden mehrerer Vermögenswerte in einem einzigen Aufruf ab.
- Stapelgenehmigung (Batch Approval): Genehmigen Sie alle Token für eine Adresse.
- Hooks: Hook für den Empfang von Token.
- NFT-Unterstützung: Wenn das Angebot nur 1 beträgt, wird es als NFT behandelt.
- Sichere Übertragungsregeln (Safe Transfer Rules): Regelwerk für eine sichere Übertragung.
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-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;Alle anzeigenDer 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:
- Übertrage 100 Token mit der ID 3 von
_fromnach_to. - Übertrage 200 Token mit der ID 6 von
_fromnach_to. - Übertrage 5 Token mit der ID 13 von
_fromnach_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-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);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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Alle anzeigenDie 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 _data7) 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:
- Der Aufrufer muss berechtigt sein, die Token für die Adresse
_fromauszugeben, oder der Aufrufer muss gleich_fromsein. - Der Übertragungsaufruf muss rückgängig gemacht (revert) werden, wenn
- die Adresse
_to0 ist. - die Länge von
_idsnicht mit der Länge von_valuesübereinstimmt. - einer der Salden der Inhaber für Token in
_idsniedriger ist als die entsprechenden Beträge in_values, die an den Empfänger gesendet werden. - ein anderer Fehler auftritt.
- die Adresse
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'.